JVM虚拟机-GC(对象)

来源:互联网 发布:php 页面重定向方法 编辑:程序博客网 时间:2024/05/19 16:07

1.概述:
内存运行时区域的各个部分,其中程序计数器,虚拟机栈,本地方法栈随线程而生,随线程而灭,栈中的栈帧随着方法的进入和退出有条不紊执行入栈和出栈操作。每个栈桢分配内存数在类结构确定就是已知的。这几个区域不需要过多考虑回收的问题,在方法或线程结束时内存就自然回收了。
java堆和方法区因为只有在程序处于运行期间时才能知道会创建哪些对象,内存的分配和回收是动态的。GC主要关注的就是这部分内存。
2.判断对象存活算法
a.引用计数算法:给对象添加一个引用计数器,当有新引用接入时,计数器值加1;引用失效时,计数器值减1,计数器为0时,说明对象没有被引用
b.可达性分析算法:通过一系列GC Roots的对象作为起始,从这些节点开始向下搜索,搜索所走过的路径称为引用链,当一个对象到GC Roots没有任何引用链相时,则证明此对象不可用。
java语言中,可作为GC Roots对象包括下面几种:
<1>虚拟机栈(栈帧中的本地变量表)中引用的对象
<2>方法区中类静态属性引用的对象
<3>方法区中常量引用的对象
<4>本地方法栈中JNI引用的对象
3.对象GC过程:
<1>对象可达性分析后没有与GC Roots相连接的引用链,第一次标记并且进行一次筛选,筛选的条件是对象理否有必要执行finalize()方法(当对象没有覆盖finalize方法,或者finalize方法已经被虚拟机调用过则没有必要执行)
<2>对象有必要执行finalize()方法,对象会被放置到F-Queue队列之中,jvm自动建立一个低优级Finalizer线程执行
<3>GC对F-Queue中的对象进行第二次小规模标记,如果对象重新与引用链上的任何一个对象建立关联,第二次标记进将它移出”即将回收”的集合;如果对角没有被引用,则将被真回收。
4.方法区回收:
<1>回收的内容:废弃常量和无用的类
<2>判断类无用的条件:
a.类所有实例都已经回收,java堆中不存在该类的任何实例
b.加载类的ClassLoader已经被回收
c.类对应的java.lang.Class对象没有在任何地方被引用,无法在任何地方通反射访问类的方法

0 0
原创粉丝点击