大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。
Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺
回顾
什么是GC?
找到垃圾,并且回收,让这块内存重新可用。
Java的GC算法是根搜索算法,可以作为GCRoot的对象有
- 线程栈变量
- 静态变量
- 常量池
- JNI指针
回收的算法有:
- 标记清除
- 标记整理
- 复制算法
TLAB:Thread Local Allocation Buffer
回收器简介
垃圾回收器的发展过程是随着内存越来越大的过程而演进的。
从分代算法演化到不分代算法。
分代算法的垃圾回收器
Young 年轻代收集器
-
Serial
单线程垃圾回收器,在回收时会STW(Stop-The-World:其他所有的工作线程都停止,只有垃圾回收线程在工作)
Serial在内存小(几兆到几十兆)的时候STW时间短,但随着内存的增大,STW的时间变长。
-
ParNew
Parallel Scavenge的增强,区别点是ParNew能和CMS搭配。 -
Parallel Scavenge
多个GC线程,在回收时依然会STW。
适用于几个G的内存。
Old 老年代收集器
-
CMS
Concurrent Mark Swap 并发标记清除,承前启后的算法,但有缺点,没有一个JDK版本默认使用CMS。三色标记 – 错标 – Incremental Update增量更新 – Remark + 写屏障
CMS缺点:Mark&Swap会使空间不连续,当新的对象不能从新生代升级到老年代的时候,它会使用单线程(Serial Old)对老年代进行清理 ,大内存是不能容忍的。
适用于几十个G的内存。
CMS有两次STW,但都很短暂。
初始标记只标记GC Root,并发标记从GC Root向下搜索。问题:
- 并发标记为非垃圾,在标记之后工作线程又把它设为垃圾。这就会造成浮动垃圾。
- 并发标记为垃圾,但在标记之后工作线程又重新连接了它。这问题如果不解决会造成非常严重的问题。
并发标记会有一些失误,重新标记会修正这些失误。
-
Serial Old
老年代的Serial -
Parallel Old
老年代的Parallel
常用的组合:
- Serial 和 Serial Old,现在已经很少见了。
- Parallel Scavenge 和 Parallel Old , 1.8版本默认的搭配,简称PS+PO或Parallel GC
- ParNew 和 CMS
不使用分代算法的垃圾回收器
- G1
Garbage First:分区(Region)回收,优先清理垃圾最多的区。逻辑上每个区可以是Old,Survior,Eden,Humongous,物理上不分代,但是逻辑上依然是分代算法。
支持上百个G的内存。
三色标记 + SATB + 写屏障
-
ZGC
不分代。Colored Pointer颜色指针 着色指针 + 读屏障
支持4个T的内存。
-
Shenandoah
算法与ZGC类似,与ZGC是竞争关系。
支持4个T的内存。 -
Epsilon
啥也不干的垃圾回收器,可以用来:- 确认一个程序根本不需要用GC,可以用Epsilon
- 程序测试,用来观察垃圾产生的过程。
调优
基础概念:
- 吞吐量 :用户代码时间/(用户代码时间 + 垃圾回收时间)
- 响应时间 :STW时间越短,响应时间越好。
对于科学计算、数据挖掘,优先考虑吞吐量。
对于网站、GUI优先考虑响应时间。
什么是调优?
- 根据需求,对JVM规划和预调优
- 优化JVM运行环境(卡顿、慢)
- 解决JVM运行过程中出现的问题(OOM)
命令行参数介绍:
HotSpot参数分类:
标准: – 开头
非标准: -X开头,特定版本的HotSpot支持特定的命令
不稳定: -XX开头,下个版本可能取消
java -XX:+PrintFlagsWithComments # 只有Debug版本能用
待续…
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/197772.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...