本文继续介绍Java自带的性能监测工具,本文使用jmap工具来玩~

jmap (Java Memory Map) 命令可以生成Java应用程序的堆快照和对象统计信息,对生成的堆快照进行分析,可以分析堆中对象所占用内存的情况,检查大对象等~

先使用jmap -help查看一下jmap命令的基本语法以及选择项(option)说明~

[root@dev18 ~]# jmap -help

Usage:

jmap [option]

(to connect to running process)

jmap [option]

(to connect to a core file)

jmap [option] [server_id@]

(to connect to remote debug server)

where is one of:

to print same info as Solaris pmap

-heap to print java heap summary

-histo[:live] to print histogram of java object heap; if the "live"

suboption is specified, only count live objects

-permstat to print permanent generation statistics

-finalizerinfo to print information on objects awaiting finalization

-dump: to dump java heap in hprof binary format

dump-options:

live dump only live objects; if not specified,

all objects in the heap are dumped.

format=b binary format

file= dump heap to

Example: jmap -dump:live,format=b,file=heap.bin

-F force. Use with -dump: or -histo

to force a heap dump or histogram when does not

respond. The "live" suboption is not supported

in this mode.

-h | -help to print this help message

-J to pass directly to the runtime system

[root@dev18 ~]#

jmap基本语法:

jmap [option]

jmap需要pid,所以需要和jps配合使用,也就是先使用jps获取pid信息,然后使用jmap来处理~

[root@dev18 ~]# jps -l

1656 org.elasticsearch.bootstrap.Elasticsearch

12905 org.apache.zookeeper.server.quorum.QuorumPeerMain

4308 /srv/activemq/apache-activemq-5.14.3//bin/activemq.jar

27265 sun.tools.jps.Jps

[root@dev18 ~]#

接下来,本文使用Zookeeper的服务进程为例,其pid为12905

使用 jmap -heap 12905打印java heap的情况,如

[root@dev18 ~]# jmap -heap 12905

Attaching to process ID 12905, please wait...

Debugger attached successfully.

Server compiler detected.

JVM version is 24.71-b01

using thread-local object allocation.

Parallel GC with 2 thread(s)

Heap Configuration:

MinHeapFreeRatio = 0

MaxHeapFreeRatio = 100

MaxHeapSize = 1004535808 (958.0MB)

NewSize = 1310720 (1.25MB)

MaxNewSize = 17592186044415 MB

OldSize = 5439488 (5.1875MB)

NewRatio = 2

SurvivorRatio = 8

PermSize = 21757952 (20.75MB)

MaxPermSize = 85983232 (82.0MB)

G1HeapRegionSize = 0 (0.0MB)

Heap Usage:

PS Young Generation

Eden Space:

capacity = 15204352 (14.5MB)

used = 12229848 (11.663291931152344MB)

free = 2974504 (2.8367080688476562MB)

80.43649607691272% used

From Space:

capacity = 524288 (0.5MB)

used = 32768 (0.03125MB)

free = 491520 (0.46875MB)

6.25% used

To Space:

capacity = 524288 (0.5MB)

used = 0 (0.0MB)

free = 524288 (0.5MB)

0.0% used

PS Old Generation

capacity = 41418752 (39.5MB)

used = 3584192 (3.41815185546875MB)

free = 37834560 (36.08184814453125MB)

8.65354900118671% used

PS Perm Generation

capacity = 22020096 (21.0MB)

used = 8938800 (8.524703979492188MB)

free = 13081296 (12.475296020507812MB)

40.59382847377232% used

2776 interned Strings occupying 230000 bytes.

[root@dev18 ~]#

使用jmap -histo打印jvm heap的直方图。其输出信息包括类名,对象数量,对象占用大小。

下面的例子使用jmap生成pid为12905的Java程序的对象统计信息(直方图的形式),并将生成的统计信息输出到时/usr/local目录下的12905.histo文件中,如:

[root@dev18 ~]# jmap -histo 12905 >/usr/local/12905.histo

打开12905.histo文件,查看详细的信息如:

[root@dev18 ~]# vim /usr/local/12905.histo

num #instances #bytes class name

----------------------------------------------

1: 30204 5384536 [B

2: 17521 2252160

3: 17521 2186552

4: 1515 1644272

5: 39568 1582720 java.util.HashMap$KeyIterator

6: 10809 1457680 [C

7: 1515 1040840

8: 1368 1032128

9: 40162 919944 [Ljava.lang.Object;

10: 36461 875064 java.util.ArrayList

11: 35427 850248 java.lang.Long

12: 15953 765744 java.nio.HeapByteBuffer

13: 5384 387648 org.apache.zookeeper.server.Request

14: 11669 373408 java.util.HashMap$Entry

15: 3771 301296 [Ljava.util.HashMap$Entry;

16: 612 296376 [I

17: 5687 272976 java.util.HashMap

18: 3805 254448 [S

19: 7029 224928 java.util.concurrent.locks.AbstractQueuedSynchronizer$Node

20: 453 203136

21: 7138 171312 java.util.concurrent.LinkedBlockingQueue$Node

22: 7008 168192 java.lang.String

23: 1671 161696 java.lang.Class

24: 2507 133624 [[I

25: 5223 125352 java.util.Collections$UnmodifiableRandomAccessList

26: 3513 112416 java.io.DataInputStream

27: 3513 112416 java.io.DataOutputStream

28: 3511 112352 org.apache.zookeeper.proto.ReplyHeader

29: 1872 89856 org.apache.zookeeper.txn.TxnHeader

30: 5486 87776 java.util.HashSet

31: 3513 84312 org.apache.jute.BinaryOutputArchive

32: 3512 84288 java.io.ByteArrayOutputStream

33: 139 75616

34: 1506 72288 org.apache.zookeeper.KeeperException$NodeExistsException

35: 1871 59872 org.apache.zookeeper.server.quorum.QuorumPacket

36: 3561 56976 java.util.HashMap$KeySet

37: 3513 56208 org.apache.zookeeper.server.ByteBufferInputStream

38: 3513 56208 org.apache.jute.BinaryInputArchive

39: 3512 56192 org.apache.zookeeper.server.SessionTrackerImpl$SessionSet

40: 1873 44952 java.util.LinkedList$Node

41: 1871 44904 org.apache.zookeeper.server.quorum.Leader$Proposal

42: 516 41280 java.lang.reflect.Method

43: 1045 33440 java.util.concurrent.ConcurrentHashMap$HashEntry

44: 1694 27104 java.lang.Object

45: 1506 24096 org.apache.zookeeper.txn.ErrorTxn

46: 106 16960 org.apache.zookeeper.server.NIOServerCnxn

47: 426 13632 java.util.concurrent.locks.ReentrantLock$NonfairSync

48: 230 12704 [Ljava.util.concurrent.ConcurrentHashMap$HashEntry;

#instances, #bytes以及class name列说明:

instances列:表示当前类有多少个实例。

bytes列:说明当前类的实例总共占用了多少个字节

class name列:表示的就是当前类的名称,class name 解读:

B代表byte

C代表char

D代表double

F代表float

I代表int

J代表long

Z代表boolean

前边有[代表数组,[I 就相当于int[]

对象用[L+类名表示

也可以不生成文件,直接使用jmap -histo 12905查看,因为内容比较多,可以采用添加| more来限定~

[root@dev18 ~]# jmap -histo 12905 | more

num #instances #bytes class name

----------------------------------------------

1: 30330 5407864 [B

2: 17521 2252160

3: 17521 2186552

4: 1515 1644272

5: 39770 1590800 java.util.HashMap$KeyIterator

6: 10827 1460848 [C

7: 1515 1040840

8: 1368 1032128

9: 40346 923032 [Ljava.lang.Object;

10: 36645 879480 java.util.ArrayList

11: 35608 854592 java.lang.Long

12: 16025 769200 java.nio.HeapByteBuffer

13: 5402 388944 org.apache.zookeeper.server.Request

14: 11723 375136 java.util.HashMap$Entry

15: 613 357464 [I

16: 3789 302736 [Ljava.util.HashMap$Entry;

17: 5705 273840 java.util.HashMap

18: 3805 254448 [S

19: 7065 226080 java.util.concurrent.locks.AbstractQueuedSynchronizer$Node

20: 453 203136

21: 7174 172176 java.util.concurrent.LinkedBlockingQueue$Node

22: 7008 168192 java.lang.String

23: 1671 161696 java.lang.Class

24: 2507 133624 [[I

25: 5241 125784 java.util.Collections$UnmodifiableRandomAccessList

26: 3531 112992 java.io.DataInputStream

27: 3531 112992 java.io.DataOutputStream

28: 3529 112928 org.apache.zookeeper.proto.ReplyHeader

29: 1872 89856 org.apache.zookeeper.txn.TxnHeader

30: 5504 88064 java.util.HashSet

31: 3531 84744 org.apache.jute.BinaryOutputArchive

32: 3530 84720 java.io.ByteArrayOutputStream

33: 139 75616

34: 1506 72288 org.apache.zookeeper.KeeperException$NodeExistsException

35: 1871 59872 org.apache.zookeeper.server.quorum.QuorumPacket

36: 3579 57264 java.util.HashMap$KeySet

37: 3531 56496 org.apache.zookeeper.server.ByteBufferInputStream

38: 3531 56496 org.apache.jute.BinaryInputArchive

39: 3530 56480 org.apache.zookeeper.server.SessionTrackerImpl$SessionSet

40: 1873 44952 java.util.LinkedList$Node

41: 1871 44904 org.apache.zookeeper.server.quorum.Leader$Proposal

42: 516 41280 java.lang.reflect.Method

43: 1045 33440 java.util.concurrent.ConcurrentHashMap$HashEntry

44: 1694 27104 java.lang.Object

45: 1506 24096 org.apache.zookeeper.txn.ErrorTxn

46: 106 16960 org.apache.zookeeper.server.NIOServerCnxn

47: 426 13632 java.util.concurrent.locks.ReentrantLock$NonfairSync

48: 230 12704 [Ljava.util.concurrent.ConcurrentHashMap$HashEntry;

49: 308 12320 java.lang.ref.SoftReference

使用jmap -permstat 12905打印permanent generation heap情况

[root@dev18 ~]# jmap -permstat 12905

Attaching to process ID 12905, please wait...

Debugger attached successfully.

Server compiler detected.

JVM version is 24.71-b01

finding class loader instances ..done.

computing per loader stat ..done.

please wait.. computing liveness.liveness analysis may be inaccurate ...

class_loaderclassesbytesparent_loaderalive?type

12677343336 null live

0x00000000c429213013048 null deadsun/reflect/DelegatingClassLoader@0x00000000bf04ffc8

0x00000000c420b21000 null deadsun/misc/Launcher$ExtClassLoader@0x00000000bf1c0120

0x00000000c429217011888 null deadsun/reflect/DelegatingClassLoader@0x00000000bf04ffc8

0x00000000c42921b011888 null deadsun/reflect/DelegatingClassLoader@0x00000000bf04ffc8

0x00000000c4292358232144 null deadjavax/management/remote/rmi/NoCallStackClassLoader@0x00000000bf546b68

0x00000000c42921f011888 null deadsun/reflect/DelegatingClassLoader@0x00000000bf04ffc8

0x00000000c420b1c040126572560x00000000c420b210deadsun/misc/Launcher$AppClassLoader@0x00000000bf21a9c8

0x00000000c42920e0413776 null deadjavax/management/remote/rmi/NoCallStackClassLoader@0x00000000bf546b68

0x00000000c429231813048 null deadsun/reflect/DelegatingClassLoader@0x00000000bf04ffc8

0x00000000c42922d811888 null deadsun/reflect/DelegatingClassLoader@0x00000000bf04ffc8

0x00000000c429229813048 null deadsun/reflect/DelegatingClassLoader@0x00000000bf04ffc8

0x00000000c4312bc8000x00000000c420b1c0deadjava/util/ResourceBundle$RBClassLoader@0x00000000bf6dce70

0x00000000c429225813056 null deadsun/reflect/DelegatingClassLoader@0x00000000bf04ffc8

total = 14168210066264 N/A alive=1, dead=13 N/A

[root@dev18 ~]#

jmap还有一个功能是可以手工生成指定程序的堆快照文件~ 使用-dump选项~

如:

jmap -dump:format=b,file=/usr/local/12905.hprof 12905

该示例为pid为12905的程序生成一个二进制的dump文件,文件放置在/usr/local目录下,

名字为12905.hprof~

[root@dev18 ~]# jmap -dump:format=b,file=/usr/local/12905.hprof 12905

Dumping heap to /usr/local/12905.hprof ...

Heap dump file created

[root@dev18 ~]#

针对这种产生的dump文件,可以使用JDK自带jhat(Java Heap Analyse Tool)小工具来查看,可以将对中的对象以html的形式展示,包括对象的数量、大小等信息,并支持对象查询语言 (OQL),jhat将会在下一篇文章中介绍~

java性能检测工具_Java自带的性能监测工具之jmap相关推荐

  1. java gc检测工具_Java自带的性能监测工具之jstat

    本文使用jstat命令工具~ jstat简介 jstat (Java Virtual Machine Statistics Monitoring Tool) 是一个可以用于观察Java应用程序运行时信 ...

  2. java 自带thread分析工具_java自带的jvm分析工具

    这段时间觉得很有必要对java的内存分析工具进行熟悉,这样以后出现机器负载较高,或者反应很慢的时候,我就可以查找原因了.上网搜了搜,发现下面这些是比较常用的,然后我在机器上试试了,把结果也贴出来哈. ...

  3. 深入理解Java虚拟机-如何利用 JDK 自带的命令行工具监控上百万的高并发的虚拟机性能...

    虚拟机系列文章 深入理解 Java 虚拟机(第一弹) - Java 内存区域透彻分析 深入理解 Java 虚拟机(第二弹) - 常用 vm 参数分析 深入理解 Java 虚拟机-如何利用 Visual ...

  4. 深入理解Java虚拟机-如何利用 JDK 自带的命令行工具监控上百万的高并发的虚拟机性能

    点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达 今日推荐:打卡活动第二期来啦,100% 能获得奖品个人原创+1博客:点击前往,查看更多 虚拟机系列文章 深入理解 Java ...

  5. java 如何检测死锁_Java如何查看死锁

    Java中当我们的开发涉及到多线程的时候,这个时候就很容易遇到死锁问题,刚开始遇到死锁问题的时候,我们很容易觉得莫名其妙,而且定位问题也很困难. 因为涉及到java多线程的时候,有的问题会特别复杂,而 ...

  6. java 开发人员工具_Java开发人员的5种工具

    java 开发人员工具 改善我们编写的Java代码的一种方法是使用最好的工具. 因此,让我们看看IDR Solutions建议使用的5种最常用的工具来帮助Java开发人员编写更好的代码. 查找错误 F ...

  7. java定时器检测状态_java 定时检测服务器端口状态方法(一)

    最近在写运维管理平台的定时检测集群中各台服务器端口开放状态来判断进程状态的定时任务.顺便整理了下java如何检测服务器一个或者多个端口,以及如何加到定时任务中. 一.java中用Socket检测服务器 ...

  8. Win10下系统自带的各种监测工具

    1.先说缘由.使用360后开机速度明显变慢,反正不管怎么说都是360的锅(坦白讲,就是不喜欢360...的流氓): 2.使用自带的杀毒Windows Defender.虽然有点傻但是一下子世界清静了. ...

  9. java需要会的工具_Java开发者必备的几款工具,一定要掌握!

    原标题:Java开发者必备的几款工具,一定要掌握! Notepad++ Notepad++是用于编辑xml.脚本以及记笔记的最佳工具.这个工具的最好部分在于,你在Notepad++上打开的任何一个文档 ...

最新文章

  1. 经典排序算法 - 鸽巢排序Pigeonhole sort
  2. : Android之linux基础教学之三 分页机制
  3. Linux服务器负载均衡LB
  4. Re-installation failed due to different application signatures.
  5. Knative 实战:一个微服务应用的部署
  6. Android——本地服务基础(一)
  7. 2022图书出版行业营销白皮书
  8. NS 2.35 柯志亨书-实验3笔记-TCP UDP模拟
  9. 数据库查询的table结果转成对应实体类
  10. 福晶科技与九章量子计算机,量子计算机“九章”横空出世,还要光刻机吗?12月3日,中国量子计算机“九章”横空...
  11. vue调用日期_Vue 前端开发——打印功能实现
  12. Greenplum 实时数据仓库实践(10)——集成机器学习库MADlib
  13. establish connection
  14. MySQL必知必会,我的MySql复习宝典
  15. 可视化展示炫酷3D图表
  16. Tensorflow操作与函数全面解析
  17. sublime text3安装python插件和flake8_Sublime Text环境配置(Python、Latex、Markdown)及常见问题汇总...
  18. iOS开发-进阶:被误解的MVC和被神化的MVVM(作者:唐巧)
  19. python中一个星号(*)与两个星号(**)的作用
  20. 【电脑讲解】宽带连接错误711的两种解决方法

热门文章

  1. 2009年世界顶级杀毒软件排名
  2. matlab实指数序列,matlab入门篇正弦信号实指数信号和复指数信号的仿真
  3. MATLAB编写遗传算法求解vrp问题
  4. 电脑重启bootmgr_Windows系统启动不了如何修复?Bootmgr/NTLDR is missing解决方法
  5. wayos维盟JMV7500河南维盟一级代理商专供四WAN全千M智能流控路由器
  6. C语言二级考试未来教育大题参考
  7. 图文教你把PDF格式转换为CAD格式
  8. 【python】matplotlib画图
  9. 智能建筑系统(中英)
  10. Ibatis使用大于小于