一、java虚拟机内存分析
java使用的内存分:New(新生代)、Old(老年代)、Perm(永久内存,方法区)、线程栈
新生代包括:1个Eden,2个Survivor
Survivor的存在意义,就是减少被送到老年代的对象,进而减少Full GC的发生。Survivor的预筛选保证,只有经历16次Minor GC还能在新生代中存活的对象,才会被送到老年代。设置两个Survivor区最大的好处就是解决了碎片化。
设置比例:
NewRatio=X:老年代比新生代是X:1,默认值一般是2。
SurvivorRatio=X:Eden比Survivor是X:1:1(因为有2个Survivor区域),默认值一般是8。
常用词汇:
Minor GC:新生代回收
Major GC:老年代回收
YGC(年轻代GC次数)、YGCT(年轻代GC时间)、FGC、FGCT、GCT:变量统计的时间是应用程序启动累计到统计时刻。
jvm内存设置(New和Old):java -server -Xms64m -Xmx128m -XX:MaxNewSize=48m common.Main
附注:8.0开始PermSize相关设置不在支持。
二、java进程分析常用命令
jmap -heap pid:查看jvm内存使用整体情况。
jmap -histo[:live] pid | head -20:查看类的实例数以及占用的内存,live会触发垃圾回收。
jmap -dump:format=b,file=heap.bin pid:堆转储到文件。
jstat -gcutil pid:查看gc情况。
jstat -gc pid:查看gc情况,gc比gcutil信息更多。
jstack pid:查看线程情况,pid是jvm的线程id,nid是操作系统的线程id。
jinfo pid:查看java运行时环境变量,如编码格式,非默认jvm参数,命令行参数。
jps:Java Virtual Machine Process Status Tool,查看java进程列表的工具。
常用参数:
-l 显示包名
-m 显示参数
-v 显示JVM参数
jps调用示例:
jps -lm
8893 org.apache.catalina.startup.Bootstrap start
4977 jps.jar
5002 jps.Main class
5014 sun.tools.jps.Jps -lm