1、jps 工具
jps(Java Virtual Machine Process Status Tool)是JDK提供的一个可以列出正在运行的Java虚拟机的进程信息的命令行工具,它可以显示 Java 虚拟机进程的执行主类(Main Class,main()函数所在的类)名称、本地虚拟机唯一ID(LVMID,Local Virtual Machine Identifier)等信息。另外,jps命令只能显示它有访问权限的Java进程的信息。
通过 jps 命令可以查看当前系统中有哪些 java 进程。
命令语法:
jps [-q] [-mlvV] [hostid] jps [-help]
命令参数说明:
- -q:不显示主类名称、JAR文件名和传递给主方法的参数,只显示本地虚拟机唯一ID。
- -mlvV:我们可以指定这些参数的任意组合。
- -m:显示Java虚拟机启动时传递给main()方法的参数。
- -l:显示主类的完整包名,如果进程执行的是JAR文件,也会显示JAR文件的完整路径。
- -v:显示Java虚拟机启动时传递的JVM参数。
- -V:不显示主类名称、JAR文件名和传递给主方法的参数,只显示本地虚拟机唯一ID。
- hostid:指定的远程主机,可以是ip地址和域名, 也可以指定具体协议,端口。如果不指定,则显示本机的Java虚拟机的进程信息。
- -help:显示jps命令的帮助信息。
2、jmap 工具
jmap(Java Virtual Machine Memory Map)是 JDK 提供的一个可以生成 Java 虚拟机的堆转储快照 dump 文件的命令行工具。
通过命令: jmap - heap 进程id 可以查看堆内存占用情况。
命令语法:
jmap [options] pid
pid
:要打印配置信息的Java虚拟机的进程ID。option
:jmap命令的可选参数。如果没有指定这个参数,jinfo命令会显示Java虚拟机进程的内存映像信息,如下图:
2.1、常见参数
2.1.1、jmap -heap pid
显示Java堆的如下信息:
- 被指定的垃圾回收算法的信息,包括垃圾回收算法的名称和垃圾回收算法的详细信息。
- 堆的配置信息,可能是由命令行选项指定,或者由Java虚拟机根据服务器配置选择的。
- 堆的内存空间使用信息,包括分代情况,每个代的总容量、已使用内存、可使用内存。如果某一代被继续细分(例如,年轻代),则包含细分的空间的内存使用信息。
代码演示,通过以下步骤演示使用 jmap 分析代码执行过程中的堆内存。
package cn.itcast.jvm.t1.heap; /** * 演示堆内存 */ public class Demo1_4 { public static void main(String[] args) throws InterruptedException { System.out.println("1..."); Thread.sleep(30000); byte[] array = new byte[1024 * 1024 * 10]; // 10 Mb System.out.println("2..."); Thread.sleep(20000); array = null; System.gc(); System.out.println("3..."); Thread.sleep(1000000L); } }
以上代码将依次输出1、2、3,如下:
我们将依次在程序输出1、2、3时打印出此时的堆内存。
如下,在输出 1 时打印的堆内存,可以看到此时程序刚开始启动,堆内存占用并不大。
在输出 2 时打印堆内存如下,因为此时已经创建了一个 10m 大小的字节数组对象,所以可以看到堆内存增加了差不多 10m 的大小。
在输出 3 时打印堆内存如下,因为此时我们没有代码指向那个字节数组对象,并且主动调用了垃圾回收,所以可以看到堆内存减少了差不多 10m 的大小,这是因为那个字节数组对象被垃圾回收掉了。
3、jconsole
Jconsole 是 jdk 自带的一套java虚拟机执行状况监视器,它能够用来监控虚拟机的内存,线程,cpu使用情况以及相关的java进程相关的MBean,主界面例如以下:
演示,假如我们执行以下代码:
package cn.itcast.jvm.t1.heap; /** * 演示堆内存 */ public class Demo1_4 { public static void main(String[] args) throws InterruptedException { System.out.println("1..."); Thread.sleep(30000); byte[] array = new byte[1024 * 1024 * 10]; // 10 Mb System.out.println("2..."); Thread.sleep(20000); array = null; System.gc(); System.out.println("3..."); Thread.sleep(1000000L); } }
在启动 main 方法后,在命令行中直接输入 jconsole,可以看到堆内存的趋势,如下:
可以看到,堆内存在一个时间点急剧上升,这是因为我们创建了一个接近 10m 的字节数组对象,然后又在一个时间点急剧下降,这是因为此时那个字节数组对象已经没有引用,并且我们主动调用了垃圾回收,所以可以看到堆内存减少了差不多 10m 的大小,。
标签:Java,虚拟机,System,内存,工具,jmap,jps From: https://www.cnblogs.com/wenxuehai/p/16600216.html