你真的知道Java中对象的销毁吗

更新时间:2023-07-12 22:31:12 阅读: 评论:0

你真的知道Java中对象的销毁吗
在⽇常的开发中、我们都知道,Java的内存清理是通过垃圾回收器进⾏的,那么其是如何将没⽤的对象被被清理掉的呢?
Java 语⾔的内存⾃动回收称为垃圾回收(Garbage Collection)机制,简称 GC。垃圾回收机制是指 JVM ⽤于释放那些不再使⽤的对象所占⽤的内存。再别康桥读后感
Java对象在使⽤后需要清理。对象清理是释放该对象所占⽤的内存。在创建对象时,⽤户必须使⽤new操作符为对象分配内存。清除对象后,系统会⾃动回收内存,不需要⽤户进⾏额外的处理。这也是Java语⾔的⼀个特性,它使程序员更容易管理内存。
⼀般⼀个对象被当作垃圾回收的情况主要如下两种。
1)对象的引⽤超过其作⽤范围。
{
Object o = new Object();    // 对象o的作⽤范围,超过这个范围对象将被视为垃圾
}
2)对象被赋值为 null
{
Object o = new Object();
o = null;    // 对象被赋值为null将被视为垃圾
}
在 Java 的 Object 类中还提供了⼀个 protected 类型的 finalize() ⽅法,因此任何 Java 类都可以覆盖这个⽅法,在这个⽅法中进⾏释放对象所占有的相关资源的操作。
那么问题⼜来了,finalize()是个什么⿁呀,既然会调⽤对象的这个⽅法就说明所有的类都会有这个⽅法(毕竟所有
的类都会被回收嘛),⾃然⽽然我们就想到了java的根类 Object.进去看看?国土局长
protected void finalize() throws Throwable { }
最后⼀⾏还真找到了,是⼀个实现为空的⽅法,既然是protected就说明具体的⽅法可以留给⼦类去实
现之前我们说过只有当对象不再被任何引⽤指向时候,该对象才会被回收。那么真的是这样吗?我们举个栗⼦看看
public class Ur {
private int money;
public int getMoney() {
return money;
}
public void tMoney(int money) {
< = money;
}
public void cool(){
心中有天地String str=new String();
别具匠心是什么意思
}
@Override
protected void finalize() throws Throwable {
// TODO Auto-generated method stub
if(money>0){
System.out.println("error");
}el{
溺爱孩子
System.out.println("suceess");
}
super.finalize();
}
}
这⾥我们重写finalize()⽅法,在销毁前如果⼀个⼈的前还没花光,打印这个⼈是失败的,否则这个⼈是成功的。下⾯是我们在main()中的代码
public class Test {
public static void main(String args[]){
Ur u1=new Ur(200);
new Object();
new Ur(100);
}
}
运⾏结果居然什么都没有!运⾏结束之后不光有引⽤指向的u1,就连没有任何引⽤指向的new Ur(100);居然都没有被回收。这是怎么回事呢?
我们来看看Thinking In Java中是怎样解释的
java中的并⾮总是被垃圾回收,也就是说对象可能不被回收。⼀般程序只要不到濒临存储空间⽤光,垃圾回收器⼀般都不会主动回收内存,如果程序结束,并且垃圾回收器⼀直没有释放你创建的空间,则随着程序的退出,资源则会被归还给操作系统。所以上⾯的我们finalize()才⼀直没有被调⽤金字旁字
如果我们想看到效果,可以通过如下⽅法:
public class Test {
public static void main(String args[]){
Ur u1=new Ur(200);
new Object();
new Ur(100);对心理咨询的认识
<();
}
}
<();会强制系统垃圾回收器⼯作,运⾏效果会出现error
说明new Ur(100);创建的对象被回收了。
注意:调⽤ () 或者 () ⽅法也不能保证回收操作⼀定执⾏,它只是提⾼了 Java 垃圾回收器尽快回收垃圾的可能性。
知识补充:
在 Java 虚拟机的堆区,每个对象都可能处于以下三种状态之⼀。
1)可触及状态:当⼀个对象被创建后,只要程序中还有引⽤变量引⽤它,那么它就始终处于可触及状态。
2)可复活状态:当程序不再有任何引⽤变量引⽤该对象时,该对象就进⼊可复活状态。在这个状态下,垃圾回收器会准备释放它所占⽤的内存,在释放之前,会调⽤它及其他处于可复活状态的对象的 finalize() ⽅法,这些 finalize() ⽅法有可能使该对象重新转到可触及状态。
如懿传嘉妃结局
3)不可触及状态:当 Java 虚拟机执⾏完所有可复活对象的 finalize() ⽅法后,如果这些⽅法都没有使该对象转到可触及状态,垃圾回收器才会真正回收它占⽤的内存。
总结
到此这篇关于Java中对象销毁的⽂章就介绍到这了,更多相关Java中对象的销毁内容请搜索以前的⽂章或继续浏览下⾯的相关⽂章希望⼤家以后多多⽀持!

本文发布于:2023-07-12 22:31:12,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/82/1093250.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:对象   回收   垃圾
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图