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 FilesJavajdk1.8.0_161lib;C:Program FilesJavajdk1.8.0_161lib	ools.jar -Dapplication.home=C:Program FilesJavajdk1.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("	"+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

原文地址:https://www.cnblogs.com/quyangyang/p/11013917.html