jvm05
虚拟机工具
jps
java process status
本地虚拟机唯一id lvmid local virtual machine id
1 public class Main { 2 3 public static void main(String[] args) { 4 5 Scanner sc = new Scanner(System.in); 6 sc.next(); 7 8 } 9 10 }
连续执行3次,jps显示
jps -l
显示进程所执行的主类或者jar文件
jps -m
显示所运行的主类所接受的参数
program arguments aaa
jps -v
显示所接受的 vm arguments参数
2196 -Dosgi.requiredJavaVersion=1.8 -Dosgi.instance.area.default=@user.home/eclipse-workspace -XX:+UseG1GC -XX:+UseStringDeduplication -Dosgi.requiredJavaVersion=1.8 -Xms256m -Xmx1024m 14472 Jps -Denv.class.path=.;C:\Program Files\Java\jdk1.8.0_161\lib;C:\Program Files\Java\jdk1.8.0_161\lib\tools.jar -Dapplication.home=C:\Program Files\Java\jdk1.8.0_161 -Xms8m 392 Main -Dfile.encoding=UTF-8 5864 Main -Dfile.encoding=UTF-8 8504 Main -Dfile.encoding=UTF-8
jps -mlv
显示以上所有参数
jstat
类加载,内存,垃圾收集,jit编译的信息
详情:https://docs.oracle.com/javase/8/docs/technotes/tools/unix/jstat.html
M即元空间,元空间的本质和永久代类似,都是对JVM规范中方法区的实现,不过元空间与永久代最大的区别在于:元空间并不在虚拟机中,而是使用本地内存,因此原空间的大小仅受本地内存影响。
jinfo
实时查看和调整虚拟机的各项参数。
+表示启用,-禁用
-flag [+|-]<name> to enable or disable the named VM flag -XX:[+/-] option
-flag <name>=<value> -XX:option=value
jmap
Jhat(JVM heap Analysis Tools)
默认会开启一个Server ,端口7000
jstack
用于生成虚拟机当前时刻的线程快照,定位线程长时间停顿的原因
用代码达到同样效果
1 public class Main { 2 3 public static void main(String[] args) { 4 5 Map<Thread,StackTraceElement[]> m = Thread.getAllStackTraces(); 6 for(Map.Entry<Thread, StackTraceElement[]> en : m.entrySet()) { 7 Thread t = en.getKey(); 8 StackTraceElement[] v = en.getValue(); 9 10 System.out.println("Thread name is "+t.getName()); 11 for(StackTraceElement s : v) { 12 System.out.println("\t"+s.toString()); 13 } 14 } 15 } 16 }
Console
1 Thread name is Signal Dispatcher 2 Thread name is Finalizer 3 java.lang.Object.wait(Native Method) 4 java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:143) 5 java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:164) 6 java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:209) 7 Thread name is Attach Listener 8 Thread name is Reference Handler 9 java.lang.Object.wait(Native Method) 10 java.lang.Object.wait(Object.java:502) 11 java.lang.ref.Reference.tryHandlePending(Reference.java:191) 12 java.lang.ref.Reference$ReferenceHandler.run(Reference.java:153) 13 Thread name is main 14 java.lang.Thread.dumpThreads(Native Method) 15 java.lang.Thread.getAllStackTraces(Thread.java:1610) 16 com.roocon.test5.Main.main(Main.java:9)
图形化工具
JConsole
内存监控
线程监控
关于线程监控,模拟runnable状态和wait状态
1 public class Main { 2 3 public static void main(String[] args) { 4 5 Scanner sc = new Scanner(System.in); 6 sc.next(); 7 8 new Thread(new Runnable() { 9 10 @Override 11 public void run() { 12 while(true) { 13 14 } 15 } 16 //定义线程名 17 },"while true").start(); 18 19 sc.next(); 20 testWait(new Object()); 21 22 } 23 24 private static void testWait(Object obj) { 25 new Thread(new Runnable() { 26 27 @Override 28 public void run() { 29 30 synchronized (obj) { 31 try { 32 obj.wait(); 33 } catch (InterruptedException e) { 34 e.printStackTrace(); 35 } 36 37 } 38 39 } 40 },"wait").start(); 41 42 43 } 44 }
45
VisualVM
地址:https://visualvm.github.io/index.html