S++

千线一眼

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

JVM-垃圾回收(2)

回收算法补充——分代回收

实际的JVM并不会单独的使用一种算法,分代回收的垃圾回收机制就体现了这一点。
JVM将堆内存划分为两个区域——新生代老年代

  • 新生代使用复制算法
  • 老年代使用标记 - 清除 或者 标记 - 整理 算法

分代


而新生代又细分为 伊甸园、幸存区From、幸存区To

新创建的对象放在伊甸园,当伊甸园无法再放入对象时就会产生垃圾回收
新生代的垃圾回收,我们称为 Minor GC
新生代的垃圾回收采用复制的方法,将存活的对象复制到 幸存区To
同时让幸存的对象存活次数+1
完成一次 Minor GC 后 幸存区From和幸存区To会交换一次位置(指向发生变化,让幸存区To为空的状态)
当下一次垃圾回收的时候,幸存区的对象也会被判断是否回收


当然,幸存区的对象不会一直呆在幸存区,当其存活次数超过一个阈值(默认 15)他就会被移动到老年代中
老年代的空间也有不足的时候,当新生代无法触发回收,老年代的空间也不足的时候就会产生垃圾回收
老年代的垃圾回收,我们称为 Full GC
老年代使用标记 - 清除 或者 标记 - 整理 算法进行垃圾回收


触发Minor GC和Full GC时会引发Stop the World
意思是在新生代和老年代垃圾回收时,其它用户线程必须停止直到垃圾回收过程完成


相关JVM参数

含义 参数
堆初始大小 -Xms
堆最大大小 -Xmx 或 -XX:MaxHeapsize=size
新生代大小 -Xmn 或 (-XX:Newsize=size +-XX:MaxNewSize=size)
幸存区比例(动态) -XX: Initial SurvivorRatio=ratio Al -XX:+UseAdaptiveSizePolicy
幸存区比例 -XX:SurvivorRatio=ratio
晋升阈值 -XX:Max Tentring Threshold-threshold
晋升大小 -XX:+PrintTenuringDistribution
GC详情 -XX:+PrintGCDetails-verbose:gc
Full GC 前 Minor GC -Xx:+ScavengeBeforeFullGC

垃圾回收器

串行垃圾回收器

  • 底层是一个单线程的垃圾回收器
  • 适用于堆内存较小和cpu核数较少(个人电脑)的时候
-XX:+UserSerialGC = Serial + SerialOld

吞吐量优先垃圾回收器

  • 多线程
  • 适用于较大的堆内存,需要多核cpu
  • 目的:尽可能让单位时间内STW(Stop the World)时间最短
-XX:+UseParallelGc ~ -XX:+UseParallelOldGC

吞吐量优先


响应时间优先垃圾回收器

  • 多线程
  • 适用于较大的堆内存,需要多核cpu
  • 目的:尽可能让单次STW(Stop the World)时间最短
- XX:+UseConcMarkSweepGC ~ -XX:+UseParNewGC ~ SerialOld

响应时间优先

过程解释:

  • 初始标记: 仅仅只是标记一下 GC Roots 能直接关联到的对象,速度很快,需要停顿。
  • 并发标记: 进行 GC Roots Tracing 的过程,它在整个回收过程中耗时最长,不需要停顿。
  • 重新标记: 为了修正并发标记期间因用户程序继续运作而导致标记产生变动的那一部分对象的标记记录,需要停顿。
  • 并发清除: 不需要停顿。
    在整个过程中耗时最长的并发标记和并发清除过程中,收集器线程都可以与用户线程一起工作,不需要进行停顿。

posted on   S++  阅读(22)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)
点击右上角即可分享
微信分享提示