网页设计怎么分析网站啊,静态学校网站做毕业设计,网络营销环境分析,宝安公司网站制作哪家公司好上一篇#xff1a;09-JVM垃圾收集底层算法实现
前置启动程序 事先启动一个web应用程序#xff0c;用jps查看其进程id#xff0c;接着用各种jdk自带命令优化应用
1.Jmap
此命令可以用来查看内存信息#xff0c;实例个数以及占用内存大小
jmap -histo 14660 #查看历史…上一篇09-JVM垃圾收集底层算法实现
前置启动程序 事先启动一个web应用程序用jps查看其进程id接着用各种jdk自带命令优化应用
1.Jmap
此命令可以用来查看内存信息实例个数以及占用内存大小
jmap -histo 14660 #查看历史生成的实例
jmap -histo:live 14660 #查看当前存活的实例执行过程中可能会触发一次full gc打开log.txt文件内容如下
num序号instances实例数量bytes占用空间大小class name类名称[C is a char[][S is a short[][I is a int[][B is a byte[][[I is a int[][]
2.堆信息 3.堆内存dump
jmap -dump:formatb,fileeureka.hprof 14660也可以设置内存溢出自动导出dump文件(内存很大的时候可能会导不出来)
-XX:HeapDumpOnOutOfMemoryError-XX:HeapDumpPath./ 路径
示例代码
public class OOMTest {public static ListObject list new ArrayList();// JVM设置 // -Xms10M -Xmx10M -XX:PrintGCDetails -XX:HeapDumpOnOutOfMemoryError -XX:HeapDumpPathD:\jvm.dump public static void main(String[] args) {ListObject list new ArrayList();int i 0;int j 0;while (true) {list.add(new User(i, UUID.randomUUID().toString()));new User(j--, UUID.randomUUID().toString());}}
}可以用jvisualvm命令工具导入该dump文件分析
4.Jstack
用jstack加进程id查找死锁见如下示例
public class DeadLockTest {private static Object lock1 new Object();private static Object lock2 new Object();public static void main(String[] args) {new Thread(() - {synchronized (lock1) {try {System.out.println(thread1 begin);Thread.sleep(5000);} catch (InterruptedException e) {}synchronized (lock2) {System.out.println(thread1 end);}}}).start();new Thread(() - {synchronized (lock2) {try {System.out.println(thread2 begin);Thread.sleep(5000);} catch (InterruptedException e) {}synchronized (lock1) {System.out.println(thread2 end);}}}).start();System.out.println(main thread end);}
}“Thread-1” 线程名 prio5 优先级5 tid0x000000001fa9e000 线程id nid0x2d64 线程对应的本地线程标识nid java.lang.Thread.State: BLOCKED 线程状态 还可以用jvisualvm自动检测死锁
远程连接jvisualvm 启动普通的jar程序JMX端口配置
java -Dcom.sun.management.jmxremote.port8888 -Djava.rmi.server.hostname192.168.65.60 -Dcom.sun.management.jmxremote.sslfalse -Dcom.sun.management.jmxremote.authenticatefalse -jar microservice-eureka-server.jarPS
-Dcom.sun.management.jmxremote.port 为远程机器的JMX端口-Djava.rmi.server.hostname 为远程机器IP tomcat的JMX配置在catalina.sh文件里的最后一个JAVA_OPTS的赋值语句下一行增加如下配置行
JAVA_OPTS$JAVA_OPTS -Dcom.sun.management.jmxremote.port8888 -Djava.rmi.server.hostname192.168.50.60 -Dcom.sun.management.jmxremote.sslfalse -Dcom.sun.management.jmxremote.authenticatefalse连接时确认下端口是否通畅可以临时关闭下防火墙
systemctl stop firewalld #临时关闭防火墙Jstack找出占用cpu最高的线程堆栈信息
/*** 运行此代码cpu会飙高*/
public class Math {public static final int initData 666;public static User user new User();public int compute() { //一个方法对应一块栈帧内存区域int a 1;int b 2;int c (a b) * 10;return c;}public static void main(String[] args) {Math math new Math();while (true){math.compute();}}
}使用命令top -p 显示你的java进程的内存情况pid是你的java进程号比如19663 按H获取每个线程的内存情况 找到内存和cpu占用最高的线程tid比如19664 转为十六进制得到 0x4cd0此为线程id的十六进制表示 执行 jstack 19663|grep -A 10 4cd0得到线程堆栈信息中 4cd0 这个线程所在行的后面10行从堆栈中可以发现导致cpu飙高的调用方法 查看对应的堆栈信息找出可能存在问题的代码
5.Jinfo
查看正在运行的Java应用程序的扩展参数 查看jvm的参数
查看java系统参数
6.Jstat
jstat命令可以查看堆内存各部分的使用量以及加载类的数量。命令的格式如下
jstat [-命令选项] [vmid] [间隔时间(毫秒)] [查询次数]
注意使用的jdk版本是jdk8
下一篇11-JVM调优实战-1