回顾


什么是GC?

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

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

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

回收的算法有:

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

回收器简介


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

分代算法的垃圾回收器

Young 年轻代收集器
  1. Serial
    单线程垃圾回收器,在回收时会STW(Stop-The-World:其他所有的工作线程都停止,只有垃圾回收线程在工作)
    Serial在内存小(几兆到几十兆)的时候STW时间短,但随着内存的增大,STW的时间变长。

  2. ParNew
    Parallel Scavenge的增强,区别点是ParNew能和CMS搭配

  3. Parallel Scavenge
    多个GC线程,在回收时依然会STW。
    适用于几个G的内存。

Old 老年代收集器
  1. CMS
    Concurrent Mark Swap 并发标记清除,承前启后的算法,但有缺点,没有一个JDK版本默认使用CMS。

    三色标记 - 错标 - Incremental Update增量更新 - Remark + 写屏障

    CMS缺点:Mark&Swap会使空间不连续,当新的对象不能从新生代升级到老年代的时候,它会使用单线程(Serial Old)对老年代进行清理 ,大内存是不能容忍的。
    适用于几十个G的内存。

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

    问题

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

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

  2. Serial Old
    老年代的Serial

  3. 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 + 写屏障

  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版本能用

待续…

JVM垃圾回收器和调优相关推荐

  1. 转载一条G1垃圾回收器的调优经验

    感觉写的不错,G1在未来两三年肯定慢慢占据主流,多学习学习: 开源搜索引擎Solr是一款非常优秀的搜素引擎,只要一些简单的配置就能进行使用,大大减少了开发时间. 在我工作的环境中,整站的商品搜索业务都 ...

  2. JVM内存模型、原理、垃圾回收、调优

    JVM内存模型.原理.垃圾回收.调优,这Java语言的基础,作为Java从业人员是必须要掌握的,另外这也是面试经常会问到的知识. ----------------------------------- ...

  3. JVM 垃圾回收器工作原理及使用实例介绍

    2019独角兽企业重金招聘Python工程师标准>>> 垃圾收集基础 Java 语言的一大特点就是可以进行自动垃圾回收处理,而无需开发人员过于关注系统资源,例如内存资源的释放情况.自 ...

  4. jvm原理及性能调优系列(jvm调优)

    jvm原理及性能调优系列(jvm调优) JVM设置: 1.设置合适的最大堆内存(新生代和老生代的最大和值)和最小堆内存(jvm启动时占用的操作系统内存大小),及设置好堆的比例分配. 2.设置合适的新生 ...

  5. JVM垃圾回收器工作原理及使用实例介绍

    垃圾收集基础 Java 语言的一大特点就是可以进行自动垃圾回收处理,而无需开发人员过于关注系统资源,例如内存资源的释放情况.自动垃圾收集虽然大大减轻了开发人员的工作量,但是也增加了软件系统的负担. 拥 ...

  6. JVM基础知识和调优

    JVM基础知识和调优 什么是垃圾 当一个对象有人引用它时,那么就不是垃圾,不然就不是垃圾 如何辨别一个对象是不是垃圾 计数(最基础的),有一个对象引用就记一个数(i++)问题,循环引用 GC root ...

  7. JVM常用参数以及调优实践

    JVM常用参数选项 jvm 可配置的参数选项可以参考 Oracle 官方网站给出的相关信息:http://www.oracle.com/technetwork/java/javase/tech/vmo ...

  8. 深入理解JVM虚拟机10:JVM常用参数以及调优实践

    本文转自[JVM常用参数以及调优实践](https://blog.csdn.net/a724888/article/details/78367780) JVM常用参数选项 jvm 可配置的参数选项可以 ...

  9. JVM 垃圾回收器工作原理及使用实例介绍(原文已发表于IBM开发者论坛)

    打个广告,本人的<大话Java性能优化>一书已经在亚马逊.当当.京东.天猫出售,感谢大家对致力于技术推广梦想者的支持. 垃圾收集基础 Java 语言的一大特点就是可以进行自动垃圾回收处理, ...

最新文章

  1. 给未来元素添加事件 jquery 1.10.2 版本
  2. 滴滴高管今年集体不拿年终奖 员工奖励力度缩减一半
  3. python内置模块re_常用内置模块(11):正则表达式、re模块
  4. [BZOJ1130] [POI2008]POD Subdivision of Kingdom
  5. python decorator ssh_Python库现后门 可窃取用户SSH信息
  6. RHEL6 64bit下更改YUM配置。yum this system is not registered with rhn的解决办法
  7. ThhinkPHP5隐藏入口文件index.php
  8. 信息学奥赛一本通(1281:最长上升子序列)
  9. Elasticsearch进阶
  10. Android自定义控件学习(一)-----属性
  11. Redis基础(二)——通用命令和配置
  12. java怎么对用户做自定义模版打印_Printing tools 自定义模板打印的实现
  13. mac安装linux 键盘不能用了,Parallels Desktop 9在Mac虚拟机安装Linux Ubuntu系统
  14. YDOOK:Maxwell 电磁场仿真 最新版的 Maxwell 软件 使用什么软件进行电磁场仿真
  15. ss命令在linux上的安装
  16. ERD-ONLINE 2.0.3 免费在线数据库建模工具 正式发布
  17. 如何掌握UI设计精髓 Logo设计有哪些基本要素
  18. ListView分页下载
  19. Spring Security + SpringBoot + Mybatis-plus实现前后端分离的权限管理系统
  20. Python程序员搞副业兼职,一月赚7800元小意思,每天只花了两小时

热门文章

  1. iozone的使用与介绍
  2. 【软件工程】一、软件危机 软件工程
  3. 编写一个方法,去掉数组中重复元素
  4. jquery 数组 操作函数
  5. ERP软件系统和MES软件系统有什么关联性吗?
  6. VUE中使用geetest滑动验证码
  7. Ubuntu2204下部署odoo16
  8. Bootstrap4.0前端框架
  9. Twinmotion渲染慢、易卡顿、常崩溃?怎么办
  10. java操作postgress的copy In入库操作