jvm dump
jvm性能调优6大步骤?
jvm性能调优6大步骤?
VM内存的系统级的调优主要的目的是减少GC的频率和Full GC的次数。
1.Full GC
会对整个堆进行整理,包括Young、Tenured和Perm。Full GC因为需要对整个堆进行回收,所以比较慢,因此应该尽可能减少Full GC的次数。
2.导致Full GC的原因
1)年老代(Tenured)被写满
调优时尽量让对象在新生代GC时被回收、让对象在新生代多存活一段时间和不要创建过大的对象及数组避免直接在旧生代创建对象 。
2)持久代Pemanet Generation空间不足
增大Perm Gen空间,避免太多静态对象 , 控制好新生代和旧生代的比例
3)System.gc()被显示调用
垃圾回收不要手动触发,尽量依靠JVM自身的机制
在对JVM调优的过程中,很大一部分工作就是对于FullGC的调节,下面详细介绍对应JVM调优的方法和步骤。
二、JVM性能调优方法和步骤
如何获取JVM的dump文件?
获取JVM的dump文件的两种方式
1. JVM启动时增加两个参数:
#出现 OOME 时生成堆 dump:
-XX: HeapDumpOnOutOfMemoryError
#生成堆文件地址:
-XX:HeapDumpPath=/home/liuke/jvmlogs/
2. 发现程序异常前通过执行指令,直接生成当前JVM的dmp文件,6214是指JVM的进程号
jmap -dump:format=b,file=serviceDump.dat 6214
由于第一种方式是一种事后方式,需要等待当前JVM出现问题后才能生成dmp文件,实时性不高,第二种方式在执行时,JVM是暂停服务的,所以对线上的运行会产生影响。所以建议第一种方式。
JVM的线程状态及如何排查死锁原因?
一般通过查看发生死锁时当时的内存占用情况找原因。具体的方式为:通过jmap或者jstat命令导出当前的dump日志,然后分析日志中线程执行情况和内存占用情况。常用命令如下:// 打印出内存占用情况jstat -gcutil 12564 1000 5 // 打印出内存占用情况jmap -heap 12564 // 打印出jvm中各个资源占用情况,比较合适细节查找jmap -histo 12564 | ./jmap -histo:live 12564 gt /home/xxx/jvmdump.txt // 打印出整个dump的信息(不建议,太复杂)jmap -dump:format=b,file=/home/xxx/jvmalldump.txt 12564//打印出各个内存分区的使用情况jstat -gccapacity 12564更多细节可以看看这个文章blog.yemou.net/article/query/info/tytfjhfascvhzxcyt121