网站首页 > java教程 正文
1、JVM内存模型:
2、JVM垃圾收集算法:
“标记-清除”或“标记-整理”算法会比复制算法慢10倍以上。
1、分代收集算法
当前虚拟机的垃圾收集都采用分代收集算法,这种算法没有什么新的思想,只是根据对象存活周期的不同将内存分为几块。一般将java堆分为新生代和老年代,这样我们就可以根据各个年代的特点选择合适的垃圾收集算法。
(1)新生代分为Eden(伊甸园) + 存活区(Survivor),存活区分为From Space(简称S0) 和 To Space(简称S1)。
(2)老年代就是默认的大小
(3)元空间MetaSpace(方法区)
2、垃圾回收机制如下:
(1)所有新生成的对象首先都是放在年轻代,年轻代的目标就是尽可能快速收集掉那些生命周期短的对象
(2)新生代内存按照8:1:1的比例分成eden和两个survior区,在Eden区,两个Survior区。大部分的对象在Eden区中生成。YoungGC的时候先把eden区存活的对象复制到一个Survior 0区,然后清空eden区,当Survior0区也存放满了时,会将Eden区和Survior0区存活对象复制到Survior1区,然后清空Eden和Survior区,此时Survior0区是空的,然后将Survior0区和Ssurvior1区交换,即宝成Survior1区为空,如此反复。
(3)什么数据会进老年代?当大对象Survior1区不足以存放会直接放到老年代,当存活对象在Survior0和Survior1反复15次后会放到老年代中。
(4)什么时候触发FullGC?当老年代满了就会触发一次FullGC,这时候新生代和老年代都进行一次回收。
3、复制算法
为了解决效率问题,“复制”收集算法出现了。它可以将内存分为大小相同的两块,每次使用其中的一块。当这一块的内存使用完后,就将还存活的对象复制到另一块去,然后再把使用的空间一次清理掉。这样就使每次的内存回收都是对内存区间的一半进行回收。
4、标记-清除算法
算法分为“标记”和“清除”阶段:标记存活的对象, 统一回收所有未被标记的对象(一般选择这种);也可以反过来,标
记出所有需要回收的对象,在标记完成后统一回收所有被标记的对象 。它是最基础的收集算法,比较简单,但是会带来
两个明显的问题:
1. 效率问题 (如果需要标记的对象太多,效率不高)
2. 空间问题(标记清除后会产生大量不连续的碎片)
5、标记-整理算法
根据老年代的特点特出的一种标记算法,标记过程仍然与“标记-清除”算法一样,但后续步骤不是直接对可回收对象回收,而是让所有存活的对象向一端移动,然后直接清理掉端边界以外的内存。
6、垃圾回收算法总结:
分代收集算法是一种理论,对比的时候我们不再讨论
(1)复制算法是里面效率最高的,说是比其它两种快10倍。效率上复制算法>标记清除>标记整理。新生代用基本就是这个算法。
(2)标记清除会存在内存碎片,以空间换时间。我们经常会遇到的为什么内存随着程序的使用越来越大的时候,你就要想想是不是算法用的标记清除了?
(3)标记整理是空间持续回收利用,当然也是速度最慢的,所以它往往用在老年代,但是不会出现空间扩张的问题。
后续章节会有垃圾回收器都分别用的什么算法?以及垃圾回收器的优劣问题分析。敬请期待!
- 上一篇: JVM垃圾回收算法详解(jvm垃圾回收算法原理)
- 下一篇: 一文讲清四种垃圾回收算法及其优缺点
猜你喜欢
- 2025-07-23 JVM-垃圾回收算法和垃圾回收器(jvm1.8垃圾回收机制)
- 2025-07-23 经典技术干货分享:JVM内存模型和垃圾回收机制
- 2025-07-23 「JVM」垃圾回算法-标记整理算法(垃圾回收机制与jvm结构)
- 2025-07-23 一文讲清四种垃圾回收算法及其优缺点
- 2025-07-23 JVM垃圾回收算法详解(jvm垃圾回收算法原理)
- 2025-07-23 JVM中有哪些垃圾回收算法,每个算法各自的优势及它们之间的区别
- 2025-07-23 聊聊垃圾回收算法(垃圾回收算法手册 pdf)
- 2025-07-23 一文搞懂七种基本的GC垃圾回收算法
- 2025-07-23 JVM(四)垃圾回收的实现算法和执行细节
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)