领先的免费Web技术教程,涵盖HTML到ASP.NET

网站首页 > 知识剖析 正文

JVM性能调优之:Jmap

nixiaole 2024-12-08 17:24:55 知识剖析 11 ℃

jdk安装后会自带一些小工具,jmap命令(Java Memory Map)是其中之一。主要用于打印指定Java进程的共享对象内存映射或堆内存细节。

jmap命令可以获得运行中的jvm的堆的快照,从而可以离线分析堆,以检查内存泄漏,检查一些严重影响性能的大对象的创建,检查系统中什么对象最多,各种对象所占内存的大小等等。可以使用jmap生成Heap Dump。

语法:jmap [option] 参数

option:

heap : 显示Java堆详细信息

histo : 显示堆中对象的统计信息

permstat :Java堆内存的永久保存区域的类加载器的统计信息

finalizerinfo : 显示在F-Queue队列等待Finalizer线程执行finalizer方法的对象
dump : 生成堆转储快照
F : 当-dump没有响应时,强制生成dump快照


参数:

pid:java进程id,命令ps -ef | grep java获取

executable:产生核心dump的java可执行文件

core:需要打印配置信息的核心文件

remote-hostname-or-ip:远程调试的主机名或ip

server-id:可选的唯一id,如果相同的远程主机上运行了多台调试服务器,用此选项参数标识服务器

命令使用:

1、jmap -heap pid 展示pid的整体堆信息 #ps -ef|grep tomcat #获取tomcat的pid

public class Test6 {
	public static void main(String[] args) throws Exception {
		// 创建一个10M的byte数组
		byte[] by = new byte[1024 * 1024 * 10];
		Thread.sleep(10000);
	}
}

我们看下上面代码创建一个10M的byte数组后,堆内存里面的变化:

我们具体分析下上图的结果
Heap Usage:
PS Young Generation
Eden Space:				//堆内存:新生代Eden区
   //新生代Eden区总容量 16M  (这里的值每个人的显示的值不一样的,看自己电脑的内存大小)
   capacity = 16777216 (16.0MB)			
    //已经使用了11点多M,这里就包含了我们上面代码创建的一个10M的byte数组
   used     = 11828456 (11.280494689941406MB)   
   free     = 4948760 (4.719505310058594MB)  //新生代Eden区 空闲(剩余)内存还有4.7M
   70.50309181213379% used
From Space: //堆内存:新生代From区
   capacity = 2621440 (2.5MB)  //新生代From区总内存 
   used     = 0 (0.0MB) //新生代From区 已经使用0M
   free     = 2621440 (2.5MB)//新生代From区 剩余2.5M空间
   0.0% used
To Space:  //堆内存:新生代To区
   capacity = 2621440 (2.5MB)   //新生代To区总容量
   used     = 0 (0.0MB)   //新生代To区已经使用0M
   free     = 2621440 (2.5MB)  //新生代To区 剩余内存
   0.0% used
PS Old Generation  //堆内存:老年代
   capacity = 45088768 (43.0MB) //老年代总内存 
   used     = 0 (0.0MB)  //老年代已经使用0M
   free     = 45088768 (43.0MB) //老年代剩余43M
   0.0% used

2、获取堆上面所有活动的类(包括类对象的的数量,和总共大小):jmap -histo:live PID

import java.util.ArrayList;
import java.util.List;
public class Test6 {
	public static void main(String[] args) throws Exception {
    //创建一个Student01的集合
		List<Student01> studentList = new ArrayList<Student01>();
		for (int i = 0; i < 100; i++) {
      //循环添加一个Student01对象到集合中
			studentList.add(new Student01(i, "zhangsan" + i, i));
		}
		Thread.sleep(10000000);
	}
}


使用jmap -histo:live PID查询结果:
C:\Users\Administrator>jmap -histo:live 212
 num     #instances         #bytes  class name
----------------------------------------------
   1:          2374         304696  [C
   2:           513          58400  java.lang.Class
   3:          2232          53568  java.lang.String
   4:           836          33440  java.util.TreeMap$Entry
   5:           542          31088  [Ljava.lang.Object;
   6:            20          25832  [B
   7:           195           7976  [Ljava.lang.String;
   8:            79           5688  java.lang.reflect.Field
   9:           256           4096  java.lang.Integer
  10:            97           3880  java.lang.ref.SoftReference
  11:            60           3840  java.net.URL
  12:            93           3616  [I
  13:           113           3616  java.util.Hashtable$Entry
  14:            86           2752  java.util.HashMap$Node
  15:             7           2632  java.lang.Thread
  16:           100           2400  Student01    //看到了吗,我们的类在这里数量:100,占用2400个字节
  17:            49           1960  java.util.LinkedHashMap$Entry
  18:            57           1824  java.util.concurrent.ConcurrentHashMap$Node

3、堆到文件:jmap -dump:live,format=b,file=dump.hprof PID

dump堆到文件,format指定输出格式,live指明是活着的对象,file指定文件名

[root@localhost jdk1.7.0_79]# jmap -dump:live,format=b,file=dump.hprof 24971

Dumping heap to /usr/local/java/jdk1.7.0_79/dump.hprof ...

Heap dump file created

Tags:

最近发表
标签列表