一、 jps(Java Virtual Machine Process Status Tool)
- jps主要用来输出JVM中运行的进程状态信息。语法格式如下:
- 命令行参数选项说明如下:
1.1 案例
public class StackOnTest { public static void alloc() { byte[] b = new byte[2]; b[0] = 1; } public static void main(String[] args) { Scanner sc=new Scanner(System.in); sc.nextLine(); } }
- 上述代码执行三次,就有三个进程,注意此时不能在console里输入信息,这样程序就会卡在 Scanner sc=new Scanner(System.in); 这里,执行三次就有三个进程
二、jstack
- jstack主要用来查看某个Java进程内的线程堆栈信息。语法格式如下:
- 命令行参数选项说明如下:
三、jstat:类装载、内存、垃圾手机、JIT编译的信息
- 语法格式如下:
- vmid是Java虚拟机ID,在Linux/Unix系统上一般就是进程ID。interval是采样时间间隔。count是采样数目。
结果
解释结果图各列含义
四、jinfo:实时查看和调整虚拟机的各项参数
- jinfo使用介绍
可以用来查看正在运行的Java应用程序的扩展参数,甚至支持在运行时,修改部分参数
-flag <name> pid:打印指定JVM的参数值
-flag [+|-]<name> pid:设置指定JVM参数的布尔值
-flag <name>=<value> pid:设置指定JVM参数的值
4.1 案例
public class JInfoTest { private static void s2() { String name = ManagementFactory.getRuntimeMXBean().getName(); // get pid String pid = name.split("@")[0]; System.out.println("Pid is:" + pid); while (true) { byte[] b = null; for (int i = 0; i < 10; i++) b = new byte[1 * 1024 * 1024]; try { Thread.sleep(5000); } catch (InterruptedException e) { e.printStackTrace(); } } } public static void main(String[] args) { s2(); } }
- 设置jvm启动参数,如下:
- 运行程序,此时结果如下:
- 使用jinfo,修改jvm参数
有一点必须注意:PrintGC必须开启,只开启PrintGCDetails、PrintGCTimeStamps不会输出GC,必须PrintGC同时开启
- 查看控制台,结果如下:
五、jmap
- jmap是输出内存中对象的工具,甚至可以将VM 中的heap以二进制输出成文本。可以监控JAVA程序是否有内存泄漏。
- 两种使用方法:
一、jmap -histo PID在内存使用峰值前后分别dump一次,可以对比出GC回收了哪些对象。
二、jmap -dump:format=b,file=f1 PID 将该内存heap输出到f1文件里,配合eclipse插件MemoryAnalyzer来使用