使用 jps 或top显示当前所有java进程pid
详细的使用方法可参考博客:
https://blog.csdn.net/u013250071/article/details/80496623
https://blog.csdn.net/weixin_42447959/article/details/81637909
https://segmentfault.com/a/1190000020964252
https://segmentfault.com/a/1190000020104437
https://segmentfault.com/a/1190000020219289
https://segmentfault.com/a/1190000017795841
使用 jstat -gcutil 8968 500 5 每500毫秒打印一次Java堆状况(各个区的容量、使用容量、gc时间等信息),打印5次
各参数的含义如下:
S0 -- Heap上的 Survivor space 0 区已使用空间的百分比
S1 -- Heap上的 Survivor space 1 区已使用空间的百分比
E -- Heap上的 Eden space 区已使用空间的百分比
O -- Heap上的 Old space 区已使用空间的百分比
P -- Perm space 区已使用空间的百分比
YGC -- 从应用程序启动到采样时发生 Young GC 的次数
YGCT-- 从应用程序启动到采样时 Young GC 所用的时间(单位秒)
FGC -- 从应用程序启动到采样时发生 Full GC 的次数
FGCT-- 从应用程序启动到采样时 Full GC 所用的时间(单位秒)
GCT -- 从应用程序启动到采样时用于垃圾回收的总时间(单位秒)
用jmap(Memory Map for Java)查看堆内存信息
执行jmap -histo pid可以打印出当前堆中所有每个类的实例数量和内存占用,如下,class name是每个类的类名([B是byte类型,[C是char类型,[I是int类型),bytes是这个类的所有示例占用内存大小,instances是这个类的实例数量:
使用:
jmap -dump:format=b,file=D:/log/jvm/dumpfile_jmap.hprof 3361
把当前堆内存的快照转储到dumpfile_jmap.hprof文件中,然后可以对内存快照进行分析。
另外,可以使用jdk的目录下的bin目录下的:jvisualvm.exe
双击后就可以运行,可以查看jvm的一些信息:
调优分析:
物理内存一定的情况下,新生代设置越大,老年代就越小,Full GC频率就越高,但Full GC时间越短;相反新生代设置越小,老年代就越大,Full GC频率就越低,但每次Full GC消耗的时间越大,建议:
-Xms和-Xmx的值设置成相等,堆大小默认为-Xms指定的大小,默认空闲堆内存小于40%时,JVM会扩大堆到-Xmx指定的大小;空闲堆内存大于70%时,JVM会减小堆到-Xms指定的大小。如果在Full GC后满足不了内存需求会动态调整,这个阶段比较耗费资源。
新生代尽量设置大一些,让对象在新生代多存活一段时间,每次Minor GC 都要尽可能多的收集垃圾对象,防止或延迟对象进入老年代的机会,以减少应用程序发生Full GC的频率。
老年代如果使用CMS收集器,新生代可以不用太大,因为CMS的并行收集速度也很快,收集过程比较耗时的并发标记和并发清除阶段都可以与用户线程并发执行。
方法区大小的设置,1.6之前的需要考虑系统运行时动态增加的常量、静态变量等,1.7只要差不多能装下启动时和后期动态加载的类信息就行。
上面的调优分析是直接抄的上面的第二个博客的。盗用一下。
相关链接:
https://www.cnblogs.com/yjd_hycf_space/p/7753847.html
https://blog.csdn.net/mr__fang/article/details/68496248
使用jstack查看栈的信息: