-l: 输出主类全名或jar路径 -q: 只输出LVMID -m: 输出JVM启动时传递给main()的参数 -v: 输出JVM启动时显示指定的JVM参数
用于监视虚拟机运行时状态信息的命令,显示出虚拟机进程中的类装载、内存、垃圾收集、JIT编译等运行数据
-class 监视类装载、卸载数量、总空间以及耗费的时间
jstat -class 49240 Loaded Bytes Unloaded Bytes Time 6167 11062.6 1 0.9 2.00Loaded : 加载class的数量 Bytes : class字节大小 Unloaded : 未加载class的数量 Bytes : 未加载class的字节大小 Time : 加载时间
-compiler 输出JIT编译过的方法数量耗时等
jstat -compiler 49240 Compiled Failed Invalid Time FailedType FailedMethod 2900 0 0 0.49 0compiled: 编译成功数量 failed:编译失败数量 invalid:无效数量 time:编译耗时 failedType:失败类型(0代表没有失败的) failedMethod:失败方法的全限定名
-gc(最常用)
jstat -gc 49240 S0C S1C S0U S1U EC EU OC OU MC MU CCSC CCSU YGC YGCT FGC FGCT GCT 9728.0 10752.0 9549.8 0.0 100352.0 8783.0 100864.0 10070.5 31616.0 29649.7 4480.0 4057.5 4 0.020 1 0.019 0.038S0C : survivor0区的总容量 S1C : survivor1区的总容量 S0U : survivor0区已使用的容量 S1C : survivor1区已使用的容量 EC : Eden区的总容量 EU : Eden区已使用的容量 OC : Old区的总容量 OU : Old区已使用的容量 MC:方法区大小 MU:方法区使用大小 CCSC: 压缩类空间大小(64bit机器压缩使用32bit对象指针) CCSU: 压缩类空间使用大小 YGC : 新生代垃圾回收次数 YGCT : 新生代垃圾回收时间 FGC : 老年代垃圾回收次数 FGCT : 老年代垃圾回收时间 GCT : 垃圾回收总消耗时间
jstat -gc 49240 2000 20:每隔2000ms输出49240的gc情况,一共输出20次
GC知识点补充:
Minor GC: 清理新生代(EC+S0+S1) 复制算法不会产生内存碎片,故写指针总是停留在所使用内存池的顶部(Eden存活的对象,进入到S0,S1,对象太大的时候会直接进入到老年代中)执行MinorGC并不会影响到永久代。而永久代到新生代的引用会被当做GC Roots,从新生代到永久代的引用则在标记清理阶段就会被直接忽略掉对大部分程序而言,停顿导致的延迟都是可以忽略不计的。因为大部分Eden中的对象都是被认为垃圾,永远不会进入到SO,S1或者老年代中。所以Eden的内存空间不是越大越好,这样反而会影响到垃圾回收,垃圾对象一直存活 Major GC:清理永久代(也就是方法区)许多Major GC是由Minor GC触发的,所以很多情况下这两种GC分离是不可能的
Full GC:清理整个堆空间触发机制:1. 当老年代满时触发;2. 当永久代满的时候触发,这个时候会导致class,method元信息卸载
JVM的优化:就是减少GC的频率,尤其是Full GC。
适当的增加堆内存的空间合理的设置G1垃圾收集器的停顿时间垃圾回收的临界线: -XX:InitiatingHeapOccupancPercent = 50增加垃圾回收线程的数量 :-XX:ConcGCThreads = 10修改GC的年龄阀值:-XX:MaxTenuringThreshold 由于对象头中age是4bit,所以并行GC的年龄阈值默认是15,并发GC的年龄阈值为6 。当需要使用多线程的时候,可以适当的减少栈大小实际发现:
当发生YGC的时候,如果S0U或S1U区如果有任意一个区域为0的时候,此时YGC的速度很快,相反如果S0U或者S1U中都有数据,或相对满的时候,此时YGC的时间边长,这就是因为S0/S1及Eden区的比例问题导致的。本着Full GC尽量少的原则,让年老代尽量缓存常用对象,JVM的默认比例1:2也是这个道理 。看其他在峰值时年老代会占多少内存,在不影响Full GC的前提下,根据实际情况加大年轻代,比如可以把比例控制在1:1。但应该给年老代至少预留1/3的增长空间。在配置较好的机器上(比如多核、大内存),可以为年老代选择并行收集算法CMS 。线程堆栈的设置:每个线程默认会开启1M的堆栈,用于存放栈帧、调用参数、局部变量等,对大多数应用而言这个默认值太了,一般256K就足用。-gcutil同-gc,不过输出的是已使用空间占总空间的百分比
jstat -gcutil 49240 S0 S1 E O M CCS YGC YGCT FGC FGCT GCT 98.17 0.00 9.55 9.98 93.78 90.57 4 0.020 1 0.019 0.038-dump 生成堆转储快照 jmap -dump:live,format=b,file=dump.hprof 28920 dump堆快照到file指定的路径文件中,format指定输出格式,live指明是活着的对象。生成的dump文件可以用MAT工具进行分析
-finalizerinfo 当前F-QUEUE队列中并没有等待Finalizer线程执行finalizer方法的对象(等待回收对象的信息)。
-heap 打印heap的概要信息,GC使用的算法,heap的配置及wise heap的使用情况,可以用此来判断内存目前的使用情况以及垃圾回收情况
jmap -heap 49240 Parallel GC with 6 thread(s) //GC Heap Configuration: //JVM堆的初始化配置 MinHeapFreeRatio = 0 //JVM堆最小空闲比率 MaxHeapFreeRatio = 100 //JVM堆最大空闲比率 MaxHeapSize = 4273995776 (4076.0MB) NewSize = 89128960 (85.0MB) MaxNewSize = 1424490496 (1358.5MB) OldSize = 179306496 (171.0MB) NewRatio = 2 //JVM新生代,老年代比例 SurvivorRatio = 8 //新生代中Eden和S0,S1比例 MetaspaceSize = 21807104 (20.796875MB) //1.8后干掉了永久代,现在叫元空间 CompressedClassSpaceSize = 1073741824 (1024.0MB) // 记录也是class对象指针的信息,默认1G 最大不能超过3G MaxMetaspaceSize = 17592186044415 MB G1HeapRegionSize = 0 (0.0MB) /*CompressedClassSpaceSize class信息中的指针被压缩成用32bit的Compressed版本。一旦OOM: Compressed class space 就需要去排查下代码,class元对象太多*/ Heap Usage: //堆内存使用情况 PS Young Generation Eden Space: capacity = 102760448 (98.0MB) //Eden总容量 used = 10432416 (9.949127197265625MB) //已使用 free = 92328032 (88.05087280273438MB) //剩余 10.15217060945472% used //使用百分比 From Space: // S0 capacity = 9961472 (9.5MB) used = 9779008 (9.32598876953125MB) free = 182464 (0.17401123046875MB) 98.16830283717105% used To Space: // S1 capacity = 11010048 (10.5MB) used = 0 (0.0MB) free = 11010048 (10.5MB) 0.0% used PS Old Generation capacity = 103284736 (98.5MB) used = 10312184 (9.834465026855469MB) free = 92972552 (88.66553497314453MB) 9.984228453660375% used-histo:live 打印堆的对象统计,包括对象数、内存大小等等 (因为在dump:live前会进行full-gc,如果带上live则只统计活对象,因此不加live的堆大小要大于加live堆的大小 )
xml class name是对象类型 C char B byte D double F float I int J long Z boolean [ 数组,如[I表示int[] [L+类名 其他对象
线上优化的时候,通过jmap -histo:live [pid]和jmap -dump:live,format=b,file=xxx.xxx [pid]定位需要优化的代码
-clstats:打印类加载器的统计信息
与jmap搭配使用,用来分析jmap生成的dump,jhat内置了一个小的HTTP服务器,可以在浏览器中查看dump的分析结果。注意,jhat是一个耗时并且耗费硬件资源的过程,一般把服务器生成的dump文件复制到本地进行分析。
`jhat -J-Xmx512m dump.hprof`一般情况都是使用这个命令指定分配的内存大小去执行。生成线程快照的主要目的是定位线程出现长时间停顿的原因。如果java程序崩溃生成core文件,jstack工具可以用来获得core文件的java stack和nativestack的信息,从而知道java在程序那地方出错了
-l : 除堆栈外,显示关于锁的附加信息 -m : 如果调用到本地方法的话,可以显示C/C++的堆栈 jstack -l 49240 | more
实时查看和调整虚拟机运行参。
-flag : 输出指定args参数的值 -flags : 不需要args参数,输出所有JVM参数的值 -sysprops : 输出系统属性,等同于System.getProperties()