Java-垃圾收集器

来源:互联网 发布:村上春树作品推荐知乎 编辑:程序博客网 时间:2024/06/08 17:29

在Java堆和方法区中:
一个接口中的多个实现类需要的内存可能不一样,一个方法中的多个分支需要的内存也可能不一样;
我们只有在程序处于运行期间的时候才能知道会创建那些对象;
这部分的内存的分配和回收都是动态的,垃圾收集器所关注的就是这部分的内存。

而在程序计数器、JVM栈、本地方法栈中每一个栈帧分配多少的内存基本上是在类结构确定下来的时候就已知了。

判断对象是否存活的算法
1.引用算法:给对象添加一个引用计数器,每当有一个地方引用它的时候,计数器就会加1;当引用失效时,计数器的值就会减1;这样任何时刻计数器为0的对象就是不可能再被使用的。(缺陷:当对象存在着相互引用对方的时候,该算法无法正确判断对象那个是否存活)

2.可达性分析算法
通过一系列的“DC Roots”的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路径就是引用链(Reference Chain),当一个对象到GC Roots没有任何引用链相连的时候,则此对象就是不可用的。
在JAVA语言中,可以作为GC Roots的对象包括:
1.虚拟机栈(栈帧中的本地变量表)中引用的对象
2.方法区中 类静态属性 引用的对象
3.方法区 常量 引用的对象
4.本地方栈中的JNI(Native方法)引用的对象。

3.垃圾收集算法
1.标记-清除算法
2.复制算法
3.标记-整理算法
4.分代收集算法(商业虚拟机)