各GC回收范围
回收算法
GC 回收器
JVM常用指令
JVM常用工具
当eden区域满了,将会执行 Minor GC,将大部分回收,剩余的对象将放入S0区域.在执行Minor GC时,会触发STW
当再次进行Minor GC时,除了将eden的对象放入到S1区域外,同时将S0区域内的对象也移到S1区域,并将值+1
S0或S1其中之一将始终保持为空
当S0/S1区域内的对象经过多次Minor GC回收后依旧存在并阀值达到15(默认)时,将移动动到老年代
当老年代空间不足时,将会尝试触发Minor GC ; 如果空间还是不足,则触发CMS 垃圾收集器 (Major GC) ; 如果Major GC后内存仍然不足,则报错OOM (OutOfMemoryError) ; Major GC速度要比Minor GC慢10倍以上
Najor GC 同样会执行STW
经过多次Major GC后的对象仍未被回收,将移到元空间
标记 - 清除算法
分为"标记"和"清除"两个阶段,在经过GC Root引用链后,可以将需要可回收的进行标记,然后再进行清除;或者将存活的对象进行标记,将未被标记的进行清除
标记 - 复制算法
"半区复制"算法,经过GC Root调用链后,将"存活"和"需回收"的分别进行标记,然后复制到另一半,并对"存活"的内存移动堆指针.
标记 - 整理算法
与标记清楚算法的差异在于标记整理算法是移动式的回收算法.
jdk1.8默认使用 Parallel Scavenge GC 和 ParallelOld GC
jdk9开始默认使用的是 G1
jdk14弃用了 Parallel Scavenge GC 、ParallelOld GC
jdk14移除了 GMS GC
Parallel Scavenge GC
特点:
相关参数:
ParallelOld GC
ParallelOld GC是在jdk1.6后推出的,适合和Parallel Scavenge GC搭配使用.多线程执行垃圾回收效率更高
G1 GC
G1(Garbage First)
特点:
G1把内存划分为多个独立的区域Region(单个最大32M,共2048个分区)
G1仍然保留新生代和老年代的思想,但是他们不再是物理隔离,而是一部分Region的集合
G1能够充分利用多CPU、多核环境的硬件优势,尽量缩短STW
G1整体采用标记整理算法,局部采用复制算法,不会产生内存碎片
G1停顿可预测,能够指定一个时间段内,消耗在垃圾收集上的时间基本不会超过设置的时间
G1跟踪各个Region里面的垃圾价值大小,会维护一个优先回收列表,每次根据允许的时间来回收最大价值的区域,从而保证在有限时间内将垃圾回收效率最大化
humongous放至比较大的对象,超过1.5个Region
将整个堆区域划分为与2048个大小相同的Region块,每个块根据对空间实际大小而定,为2的N次幂,即1MB,2MB,4MB,8MB,16MB…
G1提供了两种GC模式,Young GC和Mixed GC,两种均执行STW
G1 GC垃圾回收的四个过程
相关参数:
-XX:UseG1GC 使用G1垃圾收集器
-XX:MaxGCPauseMillis=200 设置期望GC最大停顿时间(毫秒)
-XX:InitiatingHeapOccupancyPercent=45 当老年代占比达到整个堆大小的阈值时,将会触发一次Mixed GC,默认为45%
-XX:NewRatio=2 新生代与老年代大小的比例,默认为2 即1:2
-XX:SurvivorRatio=8 eden/survivor空间的比例,默认为8 即:8:1:1 (eden:s0:s1)
-XX:ParallelGCThreads=n 设置垃圾收集器在并行阶段使用的线程数,默认值随JVM运行的平台而不同
-XX:ConcGCThreads=n 并发垃圾收集器使用的线程数,默认值随JVM运行的平台而不同
-XX:G1ReservePercent=n 设置堆内存的预留值,默认为10%
-XX:G1HeapRegionSize=n 使用G1时Java堆会被分为大小统一的Region区.此参数指定每个Region区的大小,默认根据heap size(最大为2048)算出最优解.如8G/2048=2Mb.最小值为1Mb,最大值为32Mb
jps:显示类名称
jps -l:显示进程id,主类全路径名或jar路径
jps -q:显示进程id
jps -m:显示进程id,显示JVM启动时传递给main()方法的参数
jps -v:显示进程id,显示JVM启动时显示指定的JVM参数
可以使用组合命令,如 jps -lmv
jinfo是用来查看JVM参数和动态修改部分JVM参数的命令
jinfo :输出所有的系统属性和参数
jinfo -flag :打印指定名称的参数 ---> 如果结果为 -XXX 说明未启用 +XXX 为启用
jinfo -flag +/- :打开或关闭参数 +打开 -关闭
jinfo -flag = :设置参数
jinfo -flags :打印所有参数
jstat用来查看JVM运行时的状态信息,包括内存状态、垃圾回收等
命令格式: jstat [具体命令] id [间隔毫秒值] [执行次数] 执行次数:默认一直打印,如:jstat -gc 1009 300 20 即执行20次该命令,每次间隔300毫秒
jstat -class id :统计class loader的具体行为
jstat -compiler id :统计Hotspot JIT编译器的具体行为
jstat -gc id :垃圾回收堆的行为统计
jstal -gcutil id :垃圾回收统计概述
jstack用来查看JVM线程快照的命令,线程快照是当前JVM线程正在执行的方法堆栈集合.使用jstack命令可以定位线程出现长时间卡顿的原因,如死锁,死循环等jstack还可以查看程序崩溃时生成的core文件中的stack信息.
jatack -F id :当使用jstack无响应时,使用 F 可以强制输出线程堆栈
jatack -m :同时输出java堆栈和C/C++堆栈信息
jatack -l :同时输出堆栈信息外,还显示关于锁的附加信息
jmap可以生成 java 程序的 dump 文件, 也可以查看堆内对象示例的统计信息、查看 ClassLoader 的信息以及finalizer 队列
jmap -heap :打印java heap摘要
jmap -histo[:live] :打印堆中的java对象统计信息
jmap -clstats :打印类加载器统计信息
jmap -finalizerinfo :打印在 F-Queue 中等待执行finalizer方法的对象
jmap -dump :生成java堆的dump文件
dump -live :只转存存活的对象,如果没有指定则转存所有对象
dump -format=b 二进制格式
dump -file= 转存文件到指定位置
如: jmap -dump:live,format-b,file=f:/dump.bin 899
jhat是用来分析jmap生成dump文件的命令, jhat内置了应用服务器, 可以通过网页查看dump文件分析结果, jhat一般是用在离线分析上.
jhat 路径
如: jhat f:/dump.bin
end...