Java内存监控工具(上)

概述

JDK本身提供了很多方便的JVM性能调优监控工具,除了集成式的VisualVM和jConsole外,还有jps、jstack、jmap、jhat、jstat等小巧的工具,接下来逐一对各种工具作一介绍。

jps(Java Virtual Machine Process Status Tool)

作用

用于输出JVM进程状态信息

语法(说明)

jps [options] [hostid]
1.options

命令选项,用来对输出格式进行控制,jps命令选项如下:

-q

不输出类名、Jar名和传入main方法的参数,只输出本地虚拟机唯一ID,例如

D:\Program_Files\java\jdk1.8.0_91\bin>jps -q
7872
-m

输出传入main方法的参数,例如

4316 Jps -m
-l

输出main类或Jar的全限名,例如

1916 sun.tools.jps.Jps
-v

输出传入JVM的参数,例如

9024 Jps -Dapplication.home=D:\Program_Files\java\jdk1.8.0_91 -Xms8m
2.hostid

指定监控主机,默认为当前主机;

jmap

作用

监控内存内的Java对象

语法(说明)

jmap [option] <pid>
option

命令选项,常用选项如下:

-heap

打印Java堆概要信息,包括使用的GC算法、堆配置参数和各代中堆内存使用情况;

C:\Users\liuyingjie>jmap -heap 2764
Attaching to process ID 2764, please wait...
Debugger attached successfully.
Client compiler detected.
JVM version is 25.201-b09

using thread-local object allocation.
Garbage-First (G1) GC with 4 thread(s)

Heap Configuration:
   MinHeapFreeRatio         = 40
   MaxHeapFreeRatio         = 70
   MaxHeapSize              = 1073741824 (1024.0MB)
   NewSize                  = 1048576 (1.0MB)
   MaxNewSize               = 643825664 (614.0MB)
   OldSize                  = 4194304 (4.0MB)
   NewRatio                 = 2
   SurvivorRatio            = 8
   MetaspaceSize            = 12582912 (12.0MB)
   CompressedClassSpaceSize = 1073741824 (1024.0MB)
   MaxMetaspaceSize         = 4294901760 (4095.9375MB)
   G1HeapRegionSize         = 1048576 (1.0MB)

Heap Usage:
G1 Heap:
   regions  = 1024
   capacity = 1073741824 (1024.0MB)
   used     = 128709824 (122.74725341796875MB)
   free     = 945032000 (901.2527465820312MB)
   11.98703646659851% used
G1 Young Generation:
Eden Space:
   regions  = 34
   capacity = 150994944 (144.0MB)
   used     = 35651584 (34.0MB)
   free     = 115343360 (110.0MB)
   23.61111111111111% used
Survivor Space:
   regions  = 3
   capacity = 3145728 (3.0MB)
   used     = 3145728 (3.0MB)
   free     = 0 (0.0MB)
   100.0% used
G1 Old Generation:
   regions  = 87
   capacity = 114294784 (109.0MB)
   used     = 89912512 (85.74725341796875MB)
   free     = 24382272 (23.25274658203125MB)
   78.66720497061353% used

56640 interned Strings occupying 5528928 bytes.
-histo[:live]

打印Java堆中对象直方图,通过该图可以获取每个class的对象数目,占用内存大小和类全名信息,带上:live,则只统计活着的对象,如下命令:
jmap -histo 2764

 num     #instances         #bytes  class name
----------------------------------------------
   1:        245237       26378800  [C
   2:         18355       19262448  [B
   3:         45062       14682856  [I
   4:        245389        5889336  java.util.HashMap$Node
   5:        274529        4392464  java.lang.String
   6:         44989        4087960  [Ljava.util.HashMap$Node;
   7:         68684        3150440  [Ljava.lang.Object;
   8:         18342        1841288  java.lang.Class
   9:         28573        1828672  java.lang.reflect.Field
  10:         42818        1712720  java.util.HashMap
  11:         30488        1556088  [Ljava.lang.String;
  12:         32420        1037440  java.util.LinkedHashMap$Entry

class name列出现了[C、[B、[L等很奇怪的内容,这些属于非自定义类,具体为:
在这里插入图片描述

-permstat

打印永久代统计信息

-finalizerinfo

打印等待回收的对象信息,如下命令:
jmap -finalizerinfo 2764

Attaching to process ID 2764, please wait...
Debugger attached successfully.
Client compiler detected.
JVM version is 25.201-b09
Number of objects pending for finalization: 0

Number of objects pending for finalization: 0 说明当前F-QUEUE队列中并没有等待Fializer线程执行finalizer方法的对象。

-dump

带有参数
<dump-options>
以hprof二进制格式将Java堆信息输出到文件内,该文件可以用MAT、VisualVM或jhat等工具查看;

live

只输出活着的对象;不指定,则输出堆中所有对象

format=b

指定输出格式为二进制

file= (file)

指定文件名及文件存储位置,例如:

jmap -dump:live,format=b,file=D:\heap.bin 2764
<pid>Dumping heap to D:\heap.bin ...
Heap dump file created

-F

与-dump: 或-histo一起使用,当没有响应时,强制执行;
注意:不支持live子选项

pid

进程id

jhat

用于分析产生的堆文件,可以将堆中的对象以html的形式显示出来,包括对象的数量,大小等等,并支持对象查询语言。

1.导出堆文件

jmap -dump:live,format=b,file=D:\heap.bin 2764
<pid>Dumping heap to D:\heap.bin ...
Heap dump file created

注意:除jmap命令外,还可以通过以下方式获取堆文件:
1、使用 jconsole 选项通过 HotSpotDiagnosticMXBean 从运行时获得堆转储(生成dump文件);
2、JVM启动时如果指定了 -XX:+HeapDumpOnOutOfMemoryError 选项, 则在抛出 OutOfMemoryError异常时, 会自动执行堆转储。

2.分析堆文件:

jhat -J-Xmx512m 解析Java堆转储文件,并启动一个 web server;
说明:有时dump出来的堆文件很大,在启动时报堆空间不足的错误,可添加-J-Xmx512M参数;

jhat -J-Xmx512M D:\heap.log
Reading from D:\heap.bin...
Dump file created Mon Jul 22 15:08:03 CST 2019
Snapshot read, resolving...
Resolving 1670770 objects...
Chasing references, expect 334 dots..............................................................................................................................................................................................................................................................................................................................................
Eliminating duplicate references..............................................................................................................................................................................................................................................................................................................................................
Snapshot resolved.
Started HTTP server on port 7000 //端口号
Server is ready.

3、查看html

在浏览器中输入主机地址:端口号(见上图注释部分):
在这里插入图片描述
说明:
All classes including platform 显示所有创建堆中对象的类
Show all members of the rootset 显示rootset能引用到的所有对象
Show instance counts for all classes (including platform) 显示所有类(包括JDK中定义的Java类)的实例数量
Show instance counts for all classes (excluding platform) 显示所有类(不包括JDK中定义的Java类)的实例数量
Show heap histogram 显示堆内对象直方图
Show finalizer summary 显示等待回收的对象信息
Execute Object Query Language (OQL) query 执行对象查询语句

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值