常用JVM命令
一、查看一台机器上最耗cpu的线程
1、top -c 查看最耗cpu的进程
2、top -Hp pid 找出进程中最耗cpu的线程
3、printf "%x\n" 21742 线程id转16进制
jstack 进程id| grep 16进制线程id
二、分析某进程中内存收回情况
1、ps -ef|grep 进程名 查找运行中的进程
2、jstat -gcutil pid 500 3 (24253 pid;500 0.5秒;3次)
通过 jstat 来监视23998的Java进程统计信息,各项监视参数:
S0、S1 代表两个Survivor区;
E 代表 Eden 区;
O(Old)代表老年代;
P(Permanent)代表永久代;
YGC(Young GC)代表Minor GC;
YGCT代表Minor GC耗时;
FGC(Full GC)代表Full GC耗时;
GCT代表Minor & Full GC共计耗时。
1、使用top查看消耗用户态cpu高的进程
可以在交互区输入shift+p 按照cpu排序
可以在交互区输入shift+m 按照内存排序
可以在交互区输入shift+H 查看进程下的线程
top -p 进程号,查看某个进程
top,查看所有进程
2、查看进程下的所有线程信息
top -H -p 1963(进程号)
可以在交互区输入shift+t 按照占用cpu时间排序
将占用时间高的线程号1966 转化为十六进制
printf %x 1966 ===》7ae
3、查看线程下的哪个方法造成cpu高
jstack 1963|grep 0x7ae
4、jmap -heap pid 展示pid的整体堆信息
jmap -histo pid 展示class的内存情况
jmap -dump:live,format=b,file=a.log pid 将内存使用的详细情况输出到文件
1.如果程序内存不足或者频繁GC,很有可能存在内存泄露情况,这时候就要借助Java堆Dump查看对象的情况。
2.要制作堆Dump可以直接使用jvm自带的jmap命令
3.可以先使用jmap -heap
命令查看堆的使用情况,看一下各个堆空间的占用情况。
4.使用jmap -histo:[live]
查看堆内存中的对象的情况。如果有大量对象在持续被引用,并没有被释放掉,那就产生了内存泄露,就要结合代码,把不用的对象释放掉。
5.也可以使用 jmap -dump:format=b,file=<fileName>
命令将堆信息保存到一个文件中,再借助jhat命令查看详细内容
6.在内存出现泄露、溢出或者其它前提条件下,建议多dump几次内存,把内存文件进行编号归档,便于后续内存整理分析。
7.在用cms gc的情况下,执行jmap -heap有些时候会导致进程变T,因此强烈建议别执行这个命令,如果想获取内存目前每个区域的使用状况,可通过jstat -gc或jstat -gccapacity来拿到。
Java 堆分为新生代和老年代,新生代一般划分为三块区域,Eden + From Survivor + To Survivor,Eden 和 Survivor 的内存比为8:1,每次只使用一个Eden 和一个 Survivor 区域,另一个 Survivor 用于复制收集算法回收内存。
对象一般尽量分配到新生代中,而对于大对象(长字符串和大数组)直接分配在老年代中,同时“年龄”长的的对象会从新生代自动晋升到老年代中。
Java 方法区称为永久代,只有 HotSpot 虚拟机才存在永久代。
当 Eden 区域分配不足时,自动发生一次 Minor GC。
当发生 Minor GC 时,虚拟机会自动检测(比较)新生代晋升到老年代的对象内存大小和老年代剩余内存大小,如果晋升>剩余,则发生一次Full GC;如果晋升<剩余,则去检测老年代的内存担保 HandlePromotionFailure 是否允许担保失败,如果不允许担保失败,则发生一次Full GC,如果允许失败,则进行一次Minor GC。
引用:https://www.cnblogs.com/orientsun/archive/2012/07/25/2608545.html
活跃数据的大小是指,应用程序稳定运行时长期存活对象在堆中占用的空间大小,也就是Full GC后堆中老年代占用空间的大小。可以通过GC日志中Full GC之后老年代数据大小得出,比较准确的方法是在程序稳定后,多次获取GC数据,通过取平均值的方式计算活跃数据的大小
官方推荐新生代占堆的3/8
幸存代占新生代的1/10
-Xms4:初始时堆内存
-Xmx4:最大堆内存
-Xmn1g:年轻代内存
-Xss1024K:一个线程的堆栈大小(1M)
-XX:PermSize=512m:初始永久代内存
-XX:MaxPermSize=512m:最大永久代内存
-XX:ParallelGCThreads=8:并行收集器的线程数
-XX:+UseConcMarkSweepGC:并发标记清除(CMS)收集器
-XX:+UseParNewGC:并行收集
-XX:+UseCMSCompactAtFullCollection://在FULL GC的时候对年老代的压缩
-XX:NewRatio:新生代与老年代比值,例如:4,表示新生代:老年代=1:4,即新生代占整个堆的1/5
-XX:SurvivorRatio=4:设置两个Survivor区和eden的比值,例如:4,表示两个Survivor:eden=2:4,即一个Survivor占年轻代的1/6
-XX:MaxTenuringThreshold=10:垃圾最大年龄
-XX:CMSInitiatingOccupancyFraction=80://使用80%后開始CMS收集