摘自:https://blog.csdn.net/crazylai1996/article/details/84900818
finalize()方法是Object中的一个方法,垃圾收集器在释放对象所占用的内存空间时会首先去调用finalize()。但是:
1、由于JAVA中垃圾回收器的自动回收机制,因此不能保证finalize()方法会被及时执行,也不能够保证它们会被执行。
2、finalize()一般用于释放非JAVA资源(打开的文件资源,数据库连接)和非JAVA方法(native方法)所占用的内存空间。
3、finalize()调用时间具有不确定性,不能依赖这个方法能及时回收资源,应该显示的调用close()方法
4、在被虚拟机判断死亡以后可以通过重写finalize()方法复活
摘自https://blog.csdn.net/weixin_28760063/article/details/81271827
虚拟机是怎么判断一个对象可以被回收的?
通过根搜索算法:
把内存中的每个对象看成一个节点,并且定义一些对象作为根节点GC Roots,如果一个对象中有另外一个对象的引用,那么就认为第一个对象有一条指向第二个对象的边,jvm会起一个线程遍历这些对象,当遍历完之后发现一些对象不可达之后,就将这些对象进行回收。
这个算法的关键在于GC Roots的选择:
1、虚拟机栈中引用的对象
我们在程序中正常创建一个对象,对象会在堆区中开辟一个内存作为引用保存在虚拟机栈中,如果对象的生命周期结束了,那么对象的引用也会出栈,因此,如果虚拟机栈中还存在这个对象的引用,说明这个对象还是有用的。
2、在类中定义的全局的静态对象
3、方法区常量池里的引用对象(常量,即使用static final关键字)
4、本地方法栈中引用的对象
有时候会在java中调用c或c++,因此会使用到native方法,jvm开辟了一个本地方法栈存储这些对象的引用。
摘自https://blog.csdn.net/qq_25005909/article/details/78981512
java对象的生命周期:
创建阶段(不要再循环体中创建对象,也不要多次对同一个对象进行初始化)
应用阶段(强引用,软引用,弱引用,虚引用)
不可视阶段(对象在可视层不需要使用以后应该强制转为Null,便于虚拟机回收)
不可到达阶段
可收集阶段
终结阶段
释放阶段
java中的引用
强引用:类似于Object obj=new Object();只要obj生命周期没有结束,或者没有显示的指向null,那么虚拟机永远不会回收这样的对象。
软引用:当内存不够时才会回收该类对象SoftReference
弱引用:总是会被回收WeakReference
虚引用:主要辅助finalize()使用,虚引用的对象主要是指一些执行完了finalize()函数,变为不可达对象,但是还没有被GC回收的对象。
java类的生命周期:加载,连接,初始化,使用和卸载
jvm中比较重要的几个内存区域:
1、方法区
已经加载的类信息,常量,静态变量,和方法代码的内存区域
2、常量池
方法区的一部分,主要用来存放常量
3、堆区
类的对象实例
4、栈区
java虚拟机栈