GC的最根本缘由:垃圾收集器的工做就是清除Java建立的对象,垃圾收集器须要清理的对象数量以及要执行的GC数量均取决于已建立的对象数量。所以,为了使你的系统在GC上表现良好,首先须要减小建立对象的数量。java
GC优化的两个目的:算法
将进入老年代的对象数量降到最低数组
减小Full GC的执行时间浏览器
原则:服务器
设置内存大小,设置新老代比例,设置对象在新代的存活周期工具
找到最合理的老年代内存大小,性能
设置 CMS-Remark以前强制进行年轻代的GC,以下降remark时扫描的内存大小,下降STW的时间优化
若是经过减少老年代内存来减小Full GC时间,可能会引发 OutOfMemoryError
或者致使Full GC的频率升高。spa
另外,若是经过增长老年代内存来下降Full GC的频率,Full GC的时间可能所以增长。线程
设置好几个参数并不会提高GC执行的速度,反而会使它变得更慢。
GC类型的选择
-Xms
, -Xmx
设置堆内存大小
NewRatio:新生代和老年代的内存比,值设置得越大,则老年代空间越大,新生代空间越小。
可能会认为把 NewRatio
设为1会是最好的选择,然而事实并不是如此,根据笔者的经验,当 NewRatio
设为2或3时,整个GC的状态表现得更好。
/(-XX:NewSize 新生代大小)
-XX:SurvivorRatio Eden区和Survivor区的内存比
命令简介:
jstat -gc pid 2000 20 (垃圾回收堆的行为统计,每隔2000ms输出一次,一共输出20次)
S0C : survivor0区的总容量
S1C : survivor1区的总容量
S0U : survivor0区已使用的容量
S1C : survivor1区已使用的容量
EC : Eden区的总容量
EU : Eden区已使用的容量
OC : Old区的总容量
OU : Old区已使用的容量
PC 当前perm的容量 (KB)
PU perm的使用 (KB)
YGC : 新生代垃圾回收次数
YGCT : 新生代垃圾回收时间
FGC : 老年代垃圾回收次数
FGCT : 老年代垃圾回收时间
GCT : 垃圾回收总消耗时间
-gccapacity
同-gc,不过还会输出Java堆各区域使用到的最大、最小空间
NGCMN : 新生代占用的最小空间
NGCMX : 新生代占用的最大空间
OGCMN : 老年代占用的最小空间
OGCMX : 老年代占用的最大空间
OGC:当前年老代的容量 (KB)
OC:当前年老代的空间 (KB)
PGCMN : perm占用的最小空间
PGCMX : perm占用的最大空间
-gcutil
同-gc,不过输出的是已使用空间占总空间的百分比
-gccause
垃圾收集统计概述(同-gcutil),附加最近两次垃圾回收事件的缘由
LGCC:最近垃圾回收的缘由
GCC:当前垃圾回收的缘由
jmap(JVM Memory Map)命令用于生成heap dump文件,若是不使用这个命令,还能够使用-XX:+HeapDumpOnOutOfMemoryError参数来让虚拟机出现OOM的时候·自动生成dump文件。 jmap不只能生成dump文件,还阔以查询finalize执行队列、Java堆和永久代的详细信息,如当前使用率、当前使用的是哪一种收集器等。
jmap -dump::live,format=b,file=<filename> pid
dump堆到文件,format指定输出格式,live指明是活着的对象,file指定文件名
jmap -heap pid
打印heap的概要信息,GC使用的算法,heap的配置及wise heap的使用状况,能够用此来判断内存目前的使用状况以及垃圾回收状况,能够很清楚的看到Java堆中各个区域目前的状况。
jmap -histo:live pic | more
打印堆的对象统计,包括对象数、内存大小等等 (由于在dump:live前会进行full gc,若是带上live则只统计活对象,所以不加live的堆大小要大于加live堆的大小 ) class name简写以下:
B byte
C char
D double
F float
I int
J long
Z boolean
[ 数组,如[I表示int[]
[L+类名 其余对象
jhat(JVM Heap Analysis Tool)命令是与jmap搭配使用,用来分析jmap生成的dump,jhat内置了一个微型的HTTP/HTML服务器,生成dump的分析结果后,能够在浏览器中查看。在此要注意,通常不会直接在服务器上进行分析,由于jhat是一个耗时而且耗费硬件资源的过程,通常把服务器生成的dump文件复制到本地或其余机器上进行分析。
jstack用于生成java虚拟机当前时刻的线程快照。线程快照是当前java虚拟机内每一条线程正在执行的方法堆栈的集合,生成线程快照的主要目的是定位线程出现长时间停顿的缘由,如线程间死锁、死循环、请求外部资源致使的长时间等待等。 线程出现停顿的时候经过jstack来查看各个线程的调用堆栈,就能够知道没有响应的线程到底在后台作什么事情,或者等待什么资源。 若是java程序崩溃生成core文件,jstack工具能够用来得到core文件的java stack和native stack的信息,从而能够轻松地知道java程序是如何崩溃和在程序何处发生问题。另外,jstack工具还能够附属到正在运行的java程序中,看到当时运行的java程序的java stack和native stack的信息, 若是如今运行的java程序呈现hung的状态,jstack是很是有用的。
jinfo(JVM Configuration info)这个命令做用是实时查看和调整虚拟机运行参数。 以前的jps -v口令只能查看到显示指定的参数,若是想要查看未被显示指定的参数的值就要使用jinfo口令
jstat-gc
JVM的GC日志的主要参数包括以下几个:
-XX:+PrintGC
输出GC日志
-XX:+PrintGCDetails
输出GC的详细日志
-XX:+PrintGCTimeStamps
输出GC的时间戳(以基准时间的形式)
-XX:+PrintGCDateStamps
输出GC的时间戳(以日期的形式,如 2017-09-04T21:53:59.234+0800)
-XX:+PrintHeapAtGC
在进行GC的先后打印出堆的信息
-Xloggc:../logs/gc.log
日志文件的输出路径
在生产环境中,根据须要配置相应的参数来监控JVM运行状况。
https://mp.weixin.qq.com/s/sFnMxEwJiYRjwTiBIjfcZg