JVM垃圾回收机制
8、GC垃圾回收机制
通过上面的学习,我们可以简单推测出GC垃圾回收机制只会存在堆中!
GC两种类
- 轻GC(普通GC):在Eden满的时候会触发
- 重GC(全局GC):在养老区满的时候会触发,或者自己 使用
System.gc这样程序可以进行
GC题目:
- JVM内存模型及其分区,详细到每个区放什么?
JVM包括:
- 栈:存放类的引用、方法引用、基本数据类型,不存在GC
- 堆:包括方法区,存放类的实例方法的实例,常量池,大部分GC都在这,并且可以改变大小
- 本地方法栈:存放本地方法库中的方法的引用,本地方法库一般是由C或者C++写的
- 程序计数器:让每个线程有序进行!
- 堆里的分区有哪些?各个区有什么特点?什么作用?
答:新生区、养老区、元空间
新生区包括Eden区、幸存区from、to 也就是对象的实例诞生的地方,同时 也是大多数类死亡的地方
养老区的实例能活很久
元空间以前叫永久代或持久区,里面存有方法区,静态方法区
- GC的算法有哪些 ?怎么用的?
答:标记清除法、标记压缩、复制算法、引用计数器
- 轻GC和重GC的区别
轻GC在Eden区满的时候触发,重GC在养老区满的时候自动执行或者手动写了 System.gc会建议程序执行重GC可能不执行,不建议使用 System.gc 会特别影响程序性能
GC垃圾回收方式:
1、引用奇数器
2、复制算法
什么是复制算法?就是把对象赋值到取它地方
基于它的优缺点我们主要在新生区使用它,实现 from 和 to区对象的互换
执行过程:
- 每次GC都会把 Eden 区中存活的对象转移到 to区,
- 把原来from区中的对象复制转移到to区
- from 和 to 区改变名字:谁空谁是to区
如何调节对象进入老年区的时间?
-XX:MaxTenuringThreshold = 15;默认是15,可以根据对象调用的次数进行调优!
- 具体过程:

- 优缺点:
优点:没有内存碎片:没有把东西乱放
缺点:浪费了一本的空间,to区一直为空
所以适用在对象存活度较低的区域,其实就是新生区!
3、标记清除压缩算法
一般标记清除法和标记压缩连一起使用,下面是具体操作流程图
只执行前两步就是标记清除法:
- 缺点:浪费时间,扫描了两次,产生了碎片空间
- 优点:没有浪费空间
三步执行完为标记清除压缩算法:
- 缺点:浪费时间,扫描了三次
- 优点:没有浪费空间
选:标记清除算法(内存碎片多了) 再选一次标记压缩算法
总结:
内存效率:(时间复杂度) 复制算法 > 标记清除法 > 标记压缩法
内存整齐度:(内存碎片多少) 复制算法 = 标记压缩算法 > 标记清除算法
内存利用率:(空间复杂度) 标记压缩 = 标记清除 > 复制算法
思考:有最优的算法吗?
答:没有最好的算法,只有最合适的算法,-----> GC:分代收集算法:根据不同 代对象的特点进行选择最合适的算法!
实例:
- 新生代:
特点:存活率底
选复制算法
- 老年代:
特点:存活率高

浙公网安备 33010602011771号