JVM:垃圾回收器

文章目录

一、介绍

为什么分代GC算法要把堆分成年轻代和老年代

  • 系统中的大部分对象,都是创建出来之后很快就不在使用可以被回收。
  • 老年代中会存放长期存活的对象,比如Spring的大部分bean对象,在程序启动之后就不会被回收。
  • 在虚拟机的默认设置中,新生代的大小要远小于老年代的大小。

分代GC算法将堆分成年轻代和老年代的主要原因

  • 可以通过调整年轻代和老年代的比例来适应不同类型的应用程序,提高内存的利用率和性能。
  • 新生代和老年代使用不同的垃圾回收算法,新生代一般选择复制算法,老年代可以选择标记-清除和标记-整理算法,由程序员来选择灵活度较高。
  • 分代的设计中允许只回收新生代(minor gc),如果能满足对象分配的要求就不需要调整对整个堆进行回收(full gc),STW时间就会减少。

垃圾回收器的组合关系

垃圾回收器是垃圾回收算法的具体实现。由于垃圾回收器分为年轻代和老年代,除了G1之外其他垃圾回收器必须成对组合进行使用。

二、年轻代-Serial垃圾回收器

三、老年代-SerialOld垃圾回收器

四、年轻代-ParNew垃圾回收器

五、老年代-CMS(Concurrent Mark Sweep)垃圾回收器



六、年轻代-Parllel Scavenge垃圾回收器


七、Parallel Old垃圾回收器

八、G1垃圾回收器


G1垃圾回收器的两种方式:

  • 年轻代回收(Young GC)。
    回收Eden区和Survivor区中的不用的对象。会导致STW,G1中可以通过参数-XX:MaxGCPauseMills=n(默认200)设置每次垃圾回收时的最大暂停时间毫秒数,G1垃圾回收器会尽可能地保证暂停时间。
  • 混合回收(Mixed GC):年轻代+老年代。
相关推荐
baidu_340998824 小时前
PySpark中高效展开嵌套数组:避免笛卡尔爆炸的正确实践.txt
jvm·数据库·python
weixin_580614004 小时前
如何自动同步SQL多语言字段_通过触发器实现国际化更新
jvm·数据库·python
2401_837163894 小时前
SQL中窗口函数使用注意事项_避免潜在的数据陷阱
jvm·数据库·python
m0_734949794 小时前
mysql数据库性能调优的常用指标有哪些_深入理解QPS与TPS
jvm·数据库·python
qq_432703665 小时前
Golang怎么用reflect设置字段值_Golang如何动态修改结构体中某个字段的值【进阶】
jvm·数据库·python
m0_617881425 小时前
CSS如何让最后一行项目左对齐_利用flex布局配合伪元素空项填充
jvm·数据库·python
LiAo_1996_Y5 小时前
CSS如何实现根据滚动进度触发的过渡效果_配合JS修改类名触发transition
jvm·数据库·python
z4424753265 小时前
CSS如何实现文本溢出显示省略号_掌握text-overflow使用方法
jvm·数据库·python
m0_515098425 小时前
如何处理.NET中的Oracle Number溢出_OracleDecimal与C# decimal数据类型对应
jvm·数据库·python
2401_887724505 小时前
Less如何优化CSS文件大小_利用压缩配置去除冗余样式
jvm·数据库·python