前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >jvm 垃圾回收器比较_jvm有哪些垃圾回收算法

jvm 垃圾回收器比较_jvm有哪些垃圾回收算法

作者头像
全栈程序员站长
发布2022-10-03 09:09:37
4030
发布2022-10-03 09:09:37
举报

大家好,又见面了,我是你们的朋友全栈君。

回顾

什么是GC?

找到垃圾,并且回收,让这块内存重新可用。

Java的GC算法是根搜索算法,可以作为GCRoot的对象有

  • 线程栈变量
  • 静态变量
  • 常量池
  • JNI指针

回收的算法有:

  • 标记清除
  • 标记整理
  • 复制算法 TLAB:Thread Local Allocation Buffer

回收器简介


垃圾回收器的发展过程是随着内存越来越大的过程而演进的。 从分代算法演化到不分代算法。

十种垃圾回收器
十种垃圾回收器

分代算法的垃圾回收器

Young 年轻代收集器
  1. Serial 单线程垃圾回收器,在回收时会STW(Stop-The-World:其他所有的工作线程都停止,只有垃圾回收线程在工作) Serial在内存小(几兆到几十兆)的时候STW时间短,但随着内存的增大,STW的时间变长。
Serial收集器
Serial收集器
  1. ParNew Parallel Scavenge的增强,区别点是ParNew能和CMS搭配
  2. Parallel Scavenge 多个GC线程,在回收时依然会STW。 适用于几个G的内存。
Parallel Scavenge 垃圾回收器
Parallel Scavenge 垃圾回收器
Old 老年代收集器
  1. CMS Concurrent Mark Swap 并发标记清除,承前启后的算法,但有缺点,没有一个JDK版本默认使用CMS。 三色标记 – 错标 – Incremental Update增量更新 – Remark + 写屏障 CMS缺点:Mark&Swap会使空间不连续,当新的对象不能从新生代升级到老年代的时候,它会使用单线程(Serial Old)对老年代进行清理 ,大内存是不能容忍的。 适用于几十个G的内存。
CMS
CMS

CMS有两次STW,但都很短暂。 初始标记只标记GC Root,并发标记从GC Root向下搜索。 问题

  • 并发标记为非垃圾,在标记之后工作线程又把它设为垃圾。这就会造成浮动垃圾
  • 并发标记为垃圾,但在标记之后工作线程又重新连接了它。这问题如果不解决会造成非常严重的问题。

并发标记会有一些失误重新标记会修正这些失误。

  1. Serial Old 老年代的Serial
  2. Parallel Old 老年代的Parallel
常用的组合:
  • Serial 和 Serial Old,现在已经很少见了。
  • Parallel Scavenge 和 Parallel Old , 1.8版本默认的搭配,简称PS+PO或Parallel GC
  • ParNew 和 CMS
不使用分代算法的垃圾回收器
  1. G1 Garbage First:分区(Region)回收,优先清理垃圾最多的区。逻辑上每个区可以是Old,Survior,Eden,Humongous,物理上不分代,但是逻辑上依然是分代算法。 支持上百个G的内存。 三色标记 + SATB + 写屏障
G1垃圾回收器
G1垃圾回收器
  1. ZGC 不分代。 Colored Pointer颜色指针 着色指针 + 读屏障 支持4个T的内存。
  2. Shenandoah 算法与ZGC类似,与ZGC是竞争关系。 支持4个T的内存。
  3. Epsilon 啥也不干的垃圾回收器,可以用来:
    • 确认一个程序根本不需要用GC,可以用Epsilon
    • 程序测试,用来观察垃圾产生的过程。

调优


基础概念:

  1. 吞吐量 :用户代码时间/(用户代码时间 + 垃圾回收时间)
  2. 响应时间 :STW时间越短,响应时间越好。

对于科学计算、数据挖掘,优先考虑吞吐量。 对于网站、GUI优先考虑响应时间。

什么是调优?

  1. 根据需求,对JVM规划和预调优
  2. 优化JVM运行环境(卡顿、慢)
  3. 解决JVM运行过程中出现的问题(OOM)

命令行参数介绍: HotSpot参数分类:

标准: – 开头 非标准: -X开头,特定版本的HotSpot支持特定的命令 不稳定: -XX开头,下个版本可能取消

命令行参数大全

java -XX:+PrintFlagsWithComments  # 只有Debug版本能用

待续…

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/197772.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2022年9月3日 下,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 回顾
  • 回收器简介
  • 分代算法的垃圾回收器
    • Young 年轻代收集器
      • Old 老年代收集器
        • 常用的组合:
          • 不使用分代算法的垃圾回收器
          • 调优
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档