您好,欢迎访问一九零五行业门户网

Java JVM虚拟机调优的方法

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虚拟机调优的方法的详细内容。
其它类似信息

推荐信息