Java常用分析工具之jmap

news/2024/7/5 8:49:49 标签: JMAP

简介

jmap是JDK中提供的一个用来监视进程运行中的jvm物理内存的占用情况的工具。该进程内存内,所有对象的情况,例如产生了哪些对象,对象数量。当系统崩溃时,jmap 可以从core文件或进程中获得内存的具体匹配情况,包括Heap size, Perm size等。

使用jmap会影响线上运行的应用,所以尽量不要在线上执行此命令。如果想dump堆信息,可以使用gcore命令,比jmap -dump快。

使用

jmap的使用很简单,可以通过以下命令查看。

jmap -h
Usage:
    jmap [option] <pid>
        (to connect to running process)
    jmap [option] <executable <core>
        (to connect to a core file)
    jmap [option] [server_id@]<remote server IP or hostname>
        (to connect to remote debug server)
.......

案例

查看堆heap占用情况

jmap -heap 90099
Attaching to process ID 90099, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 24.71-b01

using thread-local object allocation.
Parallel GC with 4 thread(s)  #垃圾回收的方式

Heap Configuration: #堆配置信息
   MinHeapFreeRatio = 0
   MaxHeapFreeRatio = 100
   MaxHeapSize      = 2147483648 (2048.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 = 34603008 (33.0MB)
   used     = 9773032 (9.320289611816406MB)
   free     = 24829976 (23.679710388183594MB)
   28.24330185398911% used
From Space:
   capacity = 5242880 (5.0MB)
   used     = 0 (0.0MB)
   free     = 5242880 (5.0MB)
   0.0% used
To Space:
   capacity = 5242880 (5.0MB)
   used     = 0 (0.0MB)
   free     = 5242880 (5.0MB)
   0.0% used
PS Old Generation
   capacity = 89128960 (85.0MB)
   used     = 0 (0.0MB)
   free     = 89128960 (85.0MB)
   0.0% used
PS Perm Generation
   capacity = 22020096 (21.0MB)
   used     = 2666808 (2.5432662963867188MB)
   free     = 19353288 (18.45673370361328MB)
   12.110791887555804% used

677 interned Strings occupying 44048 bytes.

查看对象占用内存情况

$ jmap -histo:live 96176

 num     #instances         #bytes  class name
----------------------------------------------
   1:          5948         766656  <methodKlass>
   2:          5948         679168  <constMethodKlass>
   3:           401         474448  <constantPoolKlass>
   4:           365         289664  <constantPoolCacheKlass>
   5:           401         276112  <instanceKlassKlass>
   6:           562          93176  [B
   7:           900          86256  [C
   8:           463          45328  java.lang.Class
   9:           653          43216  [[I
  10:           608          37144  [S
  11:            45          24480  <objArrayKlassKlass>

输出内容的一些说明:

[C is a char[]

[S is a short[]

[I is a int[]

[B is a byte[]

[[I is a int[][]

上面的输出中[C对象占用Heap这么多,往往跟String有关,String其内部使用final char[]数组来保存数据的。

constMethodKlass/ methodKlass/ constantPoolKlass/ constantPoolCacheKlass/ instanceKlassKlass/ methodDataKlass

与Classloader相关,常驻与Perm区。

导出堆信息

可以使用jmap把堆信息导出,并使用可视化工具mat分析。导出的命令如下:

$ jmap -dump:format=b,file=a.dmp 96185
Dumping heap to /Users/canglong/dev/test/a.dmp ...
Heap dump file created

http://www.niftyadmin.cn/n/811423.html

相关文章

java命令--jstat 工具使用

jstat(JVM Statistics Monitoring Tool)是用于监控虚拟机各种运行状态信息的命令行工具。他可以显示本地或远程虚拟机进程中的类装载、内存、垃圾收集、JIT编译等运行数据&#xff0c;在没有GUI图形的服务器上&#xff0c;它是运行期定位虚拟机性能问题的首选工具。 一、介绍用…

jstat命令查看jvm的GC情况

jstat命令可以查看堆内存各部分的使用量&#xff0c;以及加载类的数量。命令的格式如下&#xff1a;jstat [-命令选项] [vmid] [间隔时间/毫秒] [查询次数]注意&#xff01;&#xff01;&#xff01;&#xff1a;使用的jdk版本是jdk8.类加载统计&#xff1a;Loaded:加载class的…

进程和线程、协程的区别

现在多进程多线程已经是老生常谈了&#xff0c;协程也在最近几年流行起来。python中有协程库gevent&#xff0c;py web框架tornado中也用了gevent封装好的协程。本文主要介绍进程、线程和协程三者之间的区别。 一、概念1、进程 进程是具有一定独立功能的程序关于某个数据集合上…

浅谈我对协程的理解

一句话说明什么是线程&#xff1a;协程是一种用户态的轻量级线程。 一句话并不能完全概括协程的全部&#xff0c;但是起码能让我们对协程这个概念有一个基本的印象。从硬件发展来看&#xff0c;从最初的单核单CPU&#xff0c;到单核多CPU&#xff0c;多核多CPU&#xff0c;似乎…

gRPC线程模型分析

1. RPC线程模型 1.1. BIO线程模型 在JDK 1.4推出Java NIO之前&#xff0c;基于Java的所有Socket通信都采用了同步阻塞模式&#xff08;BIO&#xff09;&#xff0c;这种一请求一应答的通信模型简化了上层的应用开发&#xff0c;但是在性能和可靠性方面却存在着巨大的瓶颈。因此…

Java JDK代理、CGLIB、AspectJ代理分析比较

前言 什么是代理,在Design patterns In java这个本书中是这样描述的&#xff0c;简单的说就是为某个对象提供一个代理&#xff0c;以控制对这个对象的访问。在不修改源代码的基础上做方法增强,代理是一种设计模式&#xff0c;又简单的分为两种。 静态代理:代理类和委托类在代码…

理解JMX之介绍和简单使用

近期在项目上需要添加一些功能&#xff0c;想把一个开源工程整合进来&#xff0c;虽说是整合&#xff0c;但是觉得跟开发有查不了多少&#xff0c;要让这个开源工程的编码风格和设计方式与我们的工程保持一致&#xff0c;其中涉及到应用程序的监控和管理&#xff0c;不可避免的…

Java中的纤程库 – Quasar

最近遇到的一个问题大概是微服务架构中经常会遇到的一个问题&#xff1a; 服务 A 是我们开发的系统&#xff0c;它的业务需要调用 B、C、D 等多个服务&#xff0c;这些服务是通过http的访问提供的。 问题是 B、C、D 这些服务都是第三方提供的&#xff0c;不能保证它们的响应时间…