java虚拟机jvm垃圾回收机制

首先在java虚拟机jvm中主要包含五类内存结构:程序计数器、虚拟机栈、本地方法栈。这三类随线程生和灭。所以不需要考虑其回收问题。随着线程终止,其自然而然就销毁了。其次还有堆区和方法区。
垃圾回收器主要针对的就是堆区和方法区来回收前来确定具体哪些对象需要回收。

引用计数法

被引用则计数器+1,解除绑定则计数器-1, = 0 时及该对象可以被释放。
但是引用计数法无法解决循环引用的问题。

可达性分析法

从GC 的Roots 走不到的点及不可达就会被判定为可回收对象。 两次标记后会被回收。
在Java中可以作为Roots的对象有:
1.虚拟机栈中的引用对象。
2.方法区中静态属性引用的对象
3.方法区中常量引用的对象
4.本地方法栈中native方法引用的对象

引用级别

1.强引用:普遍存在的引用。
2.软引用:引用有用但是不必要的对象。在内存溢出时回收
3.弱引用:引用没用。在下次垃圾回收时回收
4.虚引用:是否被引用完全没影响。垃圾回收的时候,系统会收到一个通知。

判断方法区内容能否被回收

方法区一般回收常量、类
1.该类的所有实例化已被回收
2.ClassLoader(类加载器)已被回收
3.class类对象未被引用

垃圾回收算法

1.标记清除法:先遍历标记存活的对象,再遍历回收。两遍遍历、效率不高、产生大量碎片
2.新生代回收算法(复制算法):克服碎片
内存一分为二,存活的挨着拷贝到另一块。实际:新生:幸存:幸存=8:1:1) 将新生和存活块中存活的一起复制到另一存活块 从幸存者区来回复制15次(默认)且还存活复制到老年代
3.老年代回收算法(标记整理法):
回收和标记清除一样,存活的向一端移动。清除点段边界以外区域
4.分代收集算法:新生代复制算法+老年代标记整理法

新生代什么时候移动到老年代

大多数在新生代分配,大对象(>3KB)在老年代(避免大段复制),长期存活(
1.一般15次交换后一共到
2.同年龄的存活个数>存活区的所有存活对象的一半则 大于该年龄的进入老年代。
3.为了保证老年代剩余空间>新生代所有对象,当空间不足时,判断当前申请的大小是否小于历此进入老年代的新生代对象的平均数个。

GC什么时候触发

对象进行分代操作的时候,
新生代的局部GC: 一般在新对象生成,申请对象失败的时候。对新生代采用复制算法清理回收。
全局GC:
1.老年代写满
2.system.gc被调用
等~

©️2020 CSDN 皮肤主题: 技术工厂 设计师:CSDN官方博客 返回首页