jmap查看内存信息
jmap histo /pid > ./log.txt :查看某一进程实例个数,占用内存的字节数,以及所属的类
jmap -heap /pid :查看堆信息
jmap ‐dump:format=b,file=app.hprof /pid
通过jvisualvm命令启动jvm可视化管理界面可导入dump文件进行分析:查看类的实例
jstack
分析死锁:写一段死锁代码
public class DeadLockTest { private final static Object lock1 = new Object(); private final static Object lock2 = new Object(); public static void main(String[] args) { new Thread(new Runnable() { @Override public void run() { synchronized (lock1) { try { System.out.println(Thread.currentThread().getName() ": get the lock1"); Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } synchronized (lock2) { System.out.println(Thread.currentThread().getName() ": get the lock2"); } } } }).start(); new Thread(new Runnable() { @Override public void run() { synchronized (lock2) { try { System.out.println(Thread.currentThread().getName() ": get the lock2"); Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } synchronized (lock1) { System.out.println(Thread.currentThread().getName() ": get the lock1"); } } } }).start(); } }
"Thread-1" 线程名;prio=5 优先级=5; tid=0x0000000019aa9000线程id; nid=0x6c4线程对应的本地线程标识nid; java.lang.Thread.State: BLOCKED 线程状态
启动 jvisualvm命令选择对应的进程即可查看到死锁的线程
Jstack分析CPU使用率高的线程堆栈信息
启动一个while循环,使CPU一直工作
1、top -p /pid:查看进程占用资源情况
显而易见该进程导致CPU使用率几乎100%。
2、按H查看进程内每个线程占用资源的情况
3、找到CPU使用近100%的PID这列,表示线程tid为5027,通过转换器转为16进制为13a3,
4、通过jstack命令执行jstack 5026|grep -A 10 13a3,即可得到线程tid为13a3的堆栈信息,进而找到导致CPU占用100%的执行行号
jinfo查看jvm系统参数
jinfo -flags /pid :查看jvm参数
jinfo -sysprops /pid:查看java的系统参数
Jstat查看堆内存使用和类加载的数量信息
jstat -gc /pid:垃圾回收统计
S0C:第一个幸存区的大小,单位KB; S1C:第二个幸存区的大小; S0U:第一个幸存区的使用大小;S1U:第二个幸存区的使用大小; EC:伊甸园区的大小; EU:伊甸园区的使用大小; OC:老年代大小; OU:老年代使用大小; MC:方法区大小(元空间) ;MU:方法区使用大小; CCSC:压缩类空间大小; CCSU:压缩类空间使用大小; YGC:年轻代垃圾回收次数; YGCT:年轻代垃圾回收消耗时间,单位s; FGC:老年代垃圾回收次数; FGCT:老年代垃圾回收消耗时间,单位s; GCT:垃圾回收消耗总时间,单位s
jstat -gccapacity/pid: 堆内存统计
NGCMN:新生代最小容量;NGCMX:新生代最大容量;NGC:当前新生代容量;S0C:第一个幸存区大小;S1C:第二个幸存区的大小;EC:伊甸园区的大小;OGCMN:老年代最小容量;OGCMX:老年代最大容量;OGC:当前老年代大小;OC:当前老年代大小;MCMN:最小元数据容量;MCMX:最大元数据容量;MC:当前元数据空间大小;CCSMN:最小压缩类空间大小;CCSMX:最大压缩类空间大小;CCSC:当前压缩类空间大小;YGC:年轻代gc次数;FGC:老年代GC次数
jstat -gcnew /pid:查看新生代垃圾回收统计
TT:对象在新生代存活的次数; MTT:对象在新生代存活的最大次数; DSS:期望的幸存区大小
jstat -gcnewcapacity/pid:查看新生代内存容量
S0CMX:最大幸存1区大小;S1CMX:最大幸存2区大小;ECMX:最大伊甸园区大小
jstat -gcold /pid:查看老年代垃圾回收统计
jstat -gcoldcapacity/pid:查看老年代内存容量
jstat -gcmetacapacity/pid:查看元数据空间统计
通过jstat gc -pid命令可以优化java应用的启动参数,jstat -gc pid 1000 10 (每隔1秒执行1次命令,共执行10次)预估每秒Eden区会新增多少对象,可根据具体结果调整时间。优化思路其实简单来说就是尽量让每次Young GC后的存活对象小于Survivor区域的50%,都留存在年轻代里。尽量别让对象进入老年代。尽量减少Full GC的频率,避免频繁Full GC对JVM性能的影响。
内存泄漏
对于一些老旧的数据,比如jvm级别的内存没有及时清理,导致数据越堆越多,时间长了就会频繁导致full gc,从而导致内存泄漏。可以使用成熟缓存架构ehcache,他们有实现LRU数据淘汰策略。
到此这篇关于Java JVM虚拟机调优详解的文章就介绍到这了,更多相关Java JVM调优内容请搜索Devmax以前的文章或继续浏览下面的相关文章希望大家以后多多支持Devmax!