你真的了解JVM吗?
堆内存的分配和回收:我们着重讲一下虚拟机在堆上的垃圾收集,在线程私有的内存分区中,内存会随着方法结束或者线程的结束而回收,所以这部分没有太多的操作空间,而堆和方法区是被所有线程所共享的一块区域,也是我们有必要深入了解的区域。 a).判断对象的存活:在内存泄漏的知识点中提到过 可达性算法 这一概念,在可达性算法中,有一个 GC Roots 的概念,这个算法的基本思想就是如果一个对象到 GC Roots没有任何引用链相连(也就是从GC Roots到这个对象不可达)时,则证明此对象是不可用的,他们会被判定为是可回收的对象; 除此之外,还有另一个更简单的方法,给每个对象添加一个引用计数器,如果有一个地方引用它,计数器加1,引用失效的时候,计数器减1,计数器的值为0时这个对象就是可回收的,这是 引用计数算法 的基本思想,但是引用计数算法无法解决循环引用的问题,可以看到如下图的4、5、6三个对象,存在相互循环的引用,导致这三个对象的引用计数器不为0,但是这三个对象的的确确是属于需要回收的范畴的,这也是很多主流虚拟机放弃使用引用计数算法的原因。 在java中,可以作为GC Roots的对象有4种:
b).对象引用:java中定义了四种引用,引用强度从强到弱依次是 强引用 、 软引用 、 弱引用 和 虚引用 。 c).回收对象:如果一个对象是GC Roots不可达的,也 不一定 会被回收,如果这个对象 覆盖 了finalize()方法并且这个finalize()方法是 第一次 被虚拟机调用,那么此时会执行对象的finalize()方法,如果在方法中,它重新与引用链中的任意一个对象建立了关联 ,那么它就可以逃过被回收的命运。 垃圾收集算法 上面介绍了堆上对象从创建到回收的过程,那么下面我们就来了解一下虚拟机到底是用什么样的方式来回收对象。
(编辑:好传媒网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |