标签:常量 strong obj 操作 之间 cal size 持有对象 图片
一.需要回收的内存区域
程序计数器、虚拟机栈、本地方法栈 3 个区域随线程生灭(因为是线程私有),栈中的栈帧随着方法的进入和退出而有条不紊地执行着出栈和入栈操作。而 Java 堆和方法区则不一样,一个接口中的多个实现类需要的内存可能不一样,一个方法中的多个分支需要的内存也可能不一样,我们只有在程序处于运行期才知道那些对象会创建,这部分内存的分配和回收都是动态的,垃圾回收期所关注的就是这部分内存。
二.垃圾收集算法
主要完成两个功能:检测出垃圾对象;回收垃圾对象占用的空间并归还给程序。
1.如何检测出垃圾对象?
(1)引用计数算法
原理:堆中的每一个对象有一个引用计数,当一个对象被创建,并把指向该对象的引用赋值给一个变量时,引用计数置为1,当再把这个引用赋值给其他变量时,引用计数加1,当一个对象的引用超过了生命周期或者被设置为新值时,对象的引用计数减1,任何引用计数为0的对象都可以被当成垃圾回收。当一个对象被回收时,它所引用的任何对象计数减1,这样,可能会导致其他对象也被当垃圾回收。
问题:
在代码objA = null 和 objB = null 之前,内存结构示意图如下:
在代码objA = null 和 objB = null 之后,内存结构示意图如下:
(2)可达性分析算法
原理:程序把所有的引用关系看作一张图,从一个节点GC ROOT开始,寻找对应的引用节点,找到这个节点以后,继续寻找这个节点的引用节点,当所有的引用节点寻找完毕之后,剩余的节点则被认为是没有被引用到的节点,即无用的节点。
一般来说,如下情况的对象可以作为GC Roots:
下面给出一个GCRoots的例子,如下图,为GCRoots的引用链。
由图可知,obj8、obj9、obj10都没有到GCRoots对象的引用链,即便obj9和obj10之间有引用链,他们还是会被当成垃圾处理,可以进行回收。
标签:常量 strong obj 操作 之间 cal size 持有对象 图片
原文地址:https://www.cnblogs.com/Dream-chasingGirl/p/10344052.html