Java JVM垃圾回收 GC 2022-5-23

JVM有哪些垃圾收集器?


图中展示了7种作用于不同分代的收集器,如果两个收集器之间存在连线,则说明它们可以搭配使用。虚拟机所处的区域则表示它是属于新生代还是老年代收集器。
新生代收集器(全部的都是复制算法) : Serial、ParNew、Parallel Scavenge
老年代收集器:CMS(标记-清理)、Serial Old (标记-整理)、Parallel Old(标记整理)
整堆收集器:G1 (一个Region中是标记-清除算法,2个Region之间是复制算法)

Young GC 与 Full GC 含义与区别?

  • young GC(新生代GC):发生在新生代的垃圾收集操作,新生代中的对象朝生夕死,所以 Young GC 非常频繁,回收速度也比较快
  • Full GC(老年代GC):指发生在老年代的GC,速度一般比 Minor GC 慢十倍以上,Full GC 会 Stop-The-World(暂停所有当前运行的线程,所有Java代码停止运行,native代码可以执行,但不能与JVM交互,STW过程中没有任何响应,有点像卡死的感觉)

什么时候触发young gc?

对象优先在新生代 Eden (伊甸)区中分配,如果 Eden 区没有足够的空间时,就会触发一次 Young GC 。

什么时候会触发Full GC?

  • 1、调用 System.gc() 方法时,会建议JVM进行Full GC,此方法不建议使用
  • 2、新生代使用的是复制算法,为了内存利用率,只使用其中一个 Survivor 空间来做轮换备份,因此如果大量对象在 Minor GC 后仍然存活,导致 Survivor 空间不够用,就会通过分配担保机制,将多出来的对象提前转到老年代,此时如果老年代的可用内存小于该对象的大小,就会触发 Full GC;
  • 3、当老年代中最大可用的连续空间小于历代晋升到老年代的对象的平均大小时,会触发Full GC来让老年代腾出更多的空间。

如何优化GC?

  • 1、尽量不要创建过大的对象或数组;
  • 2、通过虚拟机的 -Xmn 参数适当调大新生代的大小,让对象尽量在新生代中被回收掉;
  • 3、通过 -XX:MaxTenuringThreshold 参数调大对象进入老年代的年龄,让对象尽量在新生代中被回收掉。
posted @   紫薇哥哥  阅读(26)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· Vue3状态管理终极指南:Pinia保姆级教程
点击右上角即可分享
微信分享提示