jvm调优-jmap(代码片段)

jiangtao1218 jiangtao1218     2023-01-28     459

关键词:

 

Java命令学习系列(三)——Jmap

阿里大牛珍藏架构资料,点击链接免费获取

Jmap

jmap是JDK自带的工具软件,主要用于打印指定Java进程(或核心文件、远程调试服务器)的共享对象内存映射或堆内存细节。可以使用jmap生成Heap Dump。在Java命令学习系列(零)——常见命令及Java Dump介绍Java命令学习系列(二)——Jstack中分别有关于Java Dump以及线程 Dump的介绍。 这篇文章主要介绍Java的堆Dump以及jamp命令

 

什么是堆Dump

堆Dump是反应Java堆使用情况的内存镜像,其中主要包括系统信息虚拟机属性完整的线程Dump所有类和对象的状态等。 一般,在内存不足、GC异常等情况下,我们就会怀疑有内存泄露。这个时候我们就可以制作堆Dump来查看具体情况。分析原因。

基础知识

Java虚拟机的内存组成以及堆内存介绍 Java GC工作原理 常见内存错误:

outOfMemoryError 年老代内存不足。 outOfMemoryError:PermGen Space 永久代内存不足。 outOfMemoryError:GC overhead limit exceed 垃圾回收时间占用系统运行时间的98%或以上。

jmap

用法摘要

Usage:
    jmap [option] <pid>
        (to connect to running process)
    jmap [option] <executable <core>
        (to connect to a core file)
    jmap [option] [[email protected]]<remote server IP or hostname>
        (to connect to remote debug server)

where <option> is one of:
    <none>               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:<dump-options> 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=<file>  dump heap to <file>
                         Example: jmap -dump:live,format=b,file=heap.bin <pid>
    -F                   force. Use with -dump:<dump-options> <pid> or -histo
                         to force a heap dump or histogram when <pid> does not
                         respond. The "live" suboption is not supported
                         in this mode.
    -h | -help           to print this help message
    -J<flag>             to pass <flag> directly to the runtime system

指定进程号(pid)的进程 jmap [ option ] 指定核心文件 jmap [ option ] 指定远程调试服务器 jmap [ option ] [[email protected]]


参数:

option 选项参数是互斥的(不可同时使用)。想要使用选项参数,直接跟在命令名称后即可。 pid 需要打印配置信息的进程ID。该进程必须是一个Java进程。想要获取运行的Java进程列表,你可以使用jps。 executable 产生核心dump的Java可执行文件。 core 需要打印配置信息的核心文件。 remote-hostname-or-IP 远程调试服务器的(请查看jsadebugd)主机名或IP地址。 server-id 可选的唯一id,如果相同的远程主机上运行了多台调试服务器,用此选项参数标识服务器。

选项:

<no option> 如果使用不带选项参数的jmap打印共享对象映射,将会打印目标虚拟机中加载的每个共享对象的起始地址、映射大小以及共享对象文件的路径全称。这与Solaris的pmap工具比较相似。 -dump:[live,]format=b,file=<filename> 以hprof二进制格式转储Java堆到指定filename的文件中。live子选项是可选的。如果指定了live子选项,堆中只有活动的对象会被转储。想要浏览heap dump,你可以使用jhat(Java堆分析工具)读取生成的文件。 -finalizerinfo 打印等待终结的对象信息。 -heap 打印一个堆的摘要信息,包括使用的GC算法、堆配置信息和generation wise heap usage。 -histo[:live] 打印堆的柱状图。其中包括每个Java类、对象数量、内存大小(单位:字节)、完全限定的类名。打印的虚拟机内部的类名称将会带有一个’*’前缀。如果指定了live子选项,则只计算活动的对象。 -permstat 打印Java堆内存的永久保存区域的类加载器的智能统计信息。对于每个类加载器而言,它的名称、活跃度、地址、父类加载器、它所加载的类的数量和大小都会被打印。此外,包含的字符串数量和大小也会被打印。 -F 强制模式。如果指定的pid没有响应,请使用jmap -dump或jmap -histo选项。此模式下,不支持live子选项。 -h 打印帮助信息。 -help 打印帮助信息。 -J<flag> 指定传递给运行jmap的JVM的参数。

举例

查看java 堆(heap)使用情况,执行命令: [email protected]:~/workspace/design_apaas/apaasweb/control/bin$ jmap -heap 31846

Attaching to process ID 31846, 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)//GC 方式

Heap Configuration: //堆内存初始化配置
   MinHeapFreeRatio = 0 //对应jvm启动参数-XX:MinHeapFreeRatio设置JVM堆最小空闲比率(default 40)
   MaxHeapFreeRatio = 100 //对应jvm启动参数 -XX:MaxHeapFreeRatio设置JVM堆最大空闲比率(default 70)
   MaxHeapSize      = 2082471936 (1986.0MB) //对应jvm启动参数-XX:MaxHeapSize=设置JVM堆的最大大小
   NewSize          = 1310720 (1.25MB)//对应jvm启动参数-XX:NewSize=设置JVM堆的‘新生代’的默认大小
   MaxNewSize       = 17592186044415 MB//对应jvm启动参数-XX:MaxNewSize=设置JVM堆的‘新生代’的最大大小
   OldSize          = 5439488 (5.1875MB)//对应jvm启动参数-XX:OldSize=<value>:设置JVM堆的‘老生代’的大小
   NewRatio         = 2 //对应jvm启动参数-XX:NewRatio=:‘新生代’和‘老生代’的大小比率
   SurvivorRatio    = 8 //对应jvm启动参数-XX:SurvivorRatio=设置年轻代中Eden区与Survivor区的大小比值 
   PermSize         = 21757952 (20.75MB)  //对应jvm启动参数-XX:PermSize=<value>:设置JVM堆的‘永生代’的初始大小
   MaxPermSize      = 85983232 (82.0MB)//对应jvm启动参数-XX:MaxPermSize=<value>:设置JVM堆的‘永生代’的最大大小
   G1HeapRegionSize = 0 (0.0MB)

Heap Usage://堆内存使用情况
PS Young Generation
Eden Space://Eden区内存分布
   capacity = 33030144 (31.5MB)//Eden区总容量
   used     = 1524040 (1.4534378051757812MB)  //Eden区已使用
   free     = 31506104 (30.04656219482422MB)  //Eden区剩余容量
   4.614088270399305% used //Eden区使用比率
From Space:  //其中一个Survivor区的内存分布
   capacity = 5242880 (5.0MB)
   used     = 0 (0.0MB)
   free     = 5242880 (5.0MB)
   0.0% used
To Space:  //另一个Survivor区的内存分布
   capacity = 5242880 (5.0MB)
   used     = 0 (0.0MB)
   free     = 5242880 (5.0MB)
   0.0% used
PS Old Generation //当前的Old区内存分布
   capacity = 86507520 (82.5MB)
   used     = 0 (0.0MB)
   free     = 86507520 (82.5MB)
   0.0% used
PS Perm Generation//当前的 “永生代” 内存分布
   capacity = 22020096 (21.0MB)
   used     = 2496528 (2.3808746337890625MB)
   free     = 19523568 (18.619125366210938MB)
   11.337498256138392% used

670 interned Strings occupying 43720 bytes.

查看堆内存(histogram)中的对象数量及大小。执行命令: [email protected]:~/workspace/design_apaas/apaasweb/control/bin$ jmap -histo 3331

num     #instances         #bytes  class name
编号     个数                字节     类名
----------------------------------------------
   1:             7        1322080  [I
   2:          5603         722368  <methodKlass>
   3:          5603         641944  <constMethodKlass>
   4:         34022         544352  java.lang.Integer
   5:           371         437208  <constantPoolKlass>
   6:           336         270624  <constantPoolCacheKlass>
   7:           371         253816  <instanceKlassKlass>

jmap -histo:live 这个命令执行,JVM会先触发gc,然后再统计信息。

将内存使用的详细情况输出到文件,执行命令: [email protected]:~/workspace/design_apaas/apaasweb/control/bin$  jmap -dump:format=b,file=heapDump 6900

然后用jhat命令可以参看 jhat -port 5000 heapDump 在浏览器中访问:http://localhost:5000/ 查看详细信息

这个命令执行,JVM会将整个heap的信息dump写入到一个文件,heap如果比较大的话,就会导致这个过程比较耗时,并且执行的过程中为了保证dump的信息是可靠的,所以会暂停应用。

总结

1.如果程序内存不足或者频繁GC,很有可能存在内存泄露情况,这时候就要借助Java堆Dump查看对象的情况。 2.要制作堆Dump可以直接使用jvm自带的jmap命令 3.可以先使用jmap -heap命令查看堆的使用情况,看一下各个堆空间的占用情况。 4.使用jmap -histo:[live]查看堆内存中的对象的情况。如果有大量对象在持续被引用,并没有被释放掉,那就产生了内存泄露,就要结合代码,把不用的对象释放掉。 5.也可以使用 jmap -dump:format=b,file=<fileName>命令将堆信息保存到一个文件中,再借助jhat命令查看详细内容 6.在内存出现泄露、溢出或者其它前提条件下,建议多dump几次内存,把内存文件进行编号归档,便于后续内存整理分析。

Error attaching to process: sun.jvm.hotspot.debugger.DebuggerException: Can’t attach to the process

在ubuntu中第一次使用jmap会报错:Error attaching to process: sun.jvm.hotspot.debugger.DebuggerException: Can‘t attach to the process,这是oracla文档中提到的一个bug:http://bugs.java.com/bugdatabase/view_bug.do?bug_id=7050524,解决方式如下:

  1. echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope 该方法在下次重启前有效。

  2. 永久有效方法 sudo vi /etc/sysctl.d/10-ptrace.conf 编辑下面这行: kernel.yama.ptrace_scope = 1 修改为: kernel.yama.ptrace_scope = 0 重启系统,使修改生效。

 

 

转:https://www.hollischuang.com/archives/303

性能调优案例(代码片段)

性能调优案例时间2021-09-02环境centos7.6,jmeter,redis,mysql,java应用文章目录性能调优案例一、jmeter的命令行使用二、JVM调优js、jmap、jstat(1)官网文档https://docs.oracle.com/javase/1.5.0/docs/tooldocs/share/jmap.html(2)Jmap命令(3)调优参数(4)检查调优情... 查看详情

性能调优案例(代码片段)

性能调优案例时间2021-09-02环境centos7.6,jmeter,redis,mysql,java应用文章目录性能调优案例一、jmeter的命令行使用二、JVM调优js、jmap、jstat(1)官网文档https://docs.oracle.com/javase/1.5.0/docs/tooldocs/share/jmap.html(2)Jmap命令(3)调优参数(4)检查调优情... 查看详情

java的jvm调优相关工具——jvm调优gc压测linux命令(代码片段)

jmapjdk自带命令。jmap是一个多功能的命令,查看JVM内存使用情况。它可以生成java程序的dump文件,也可以查看堆内对象示例的统计信息、查看ClassLoader的信息以及finalizer队列。jmap-dump:live,format=b,file=myjmapfile.txt19570jstack... 查看详情

jvm调优-jhat(代码片段)

  Java命令学习系列(五)——jhat2016-01-21分类:Java阅读(8708)评论(3)阿里大牛珍藏架构资料,点击链接免费获取jhat(JavaHeapAnalysisTool),是一个用来分析java的堆情况的命令。之前的文章讲到过,使用jmap可以生成Java堆的Dump文件... 查看详情

jvm性能调优-jmap_jstack

具体的请参考这两篇文章:https://blog.csdn.net/dragonassassin/article/details/51010947https://blog.csdn.net/liangrui1988/article/details/50684117 查看详情

jvm性能监控与gc调优(代码片段)

目录一提出问题二基于JDK命令行工具的监控1.JVM的三种参数类型1.1标准参数1.2X参数1.3XX参数1.4常用命令2.jstat查看虚拟机统计信息2.1类加载信息2.2垃圾回收信息2.3JIT编译信息3.jmap+MAT分析内存溢出[实战]3.1模拟内存溢出3.2导出内存影... 查看详情

jvm调优-推荐启动参数

...较充足,也容易出现运行缓慢或OutOfMemory的状况。对JVM的调优首先要了解JVM的执行状况,Java提供了一些工具帮助我们了解JVM的情况。其中jmap可以看到启动程序的参数设定后的总体状况。使用jmap-heap可以总体上了解目前JVM的设定... 查看详情

jvm性能调优监控工具jpsjmapjstackjstat使用详解(代码片段)

JDK本身提供了很多方便的JVM性能调优监控工具,除了集成式的VisualVM和jConsole外,还有jps、jstack、jmap、jhat、jstat等小巧的工具,本博客希望能起抛砖引玉之用,让大家能开始对JVM性能调优的常用工具有所了解。现... 查看详情

jvm调优--03---性能优化步骤常用的jvm图形化界面(代码片段)

...能优化步骤第一步:性能监控第二步:性能分析第三步:性能调优实际案例业务背景:1.代码:2.设置参数java-Xms200M-Xmx200M-XX:+PrintGCT15_FullGC_Problem013.一般是运维团队首先受到报警信息(CPUMemory)4.top命令观察到问题:内存不... 查看详情

jvm性能调优工具之jmap

 jvm性能调优工具之jmap  概述命令jmap是一个多功能的命令。它可以生成java程序的dump文件,也可以查看堆内对象示例的统计信息、查看ClassLoader的信息以及finalizer队列。jmap用法  参数:option:选项参数。pid:需... 查看详情

jvm中常用的性能监控和调优工具介绍与使用(代码片段)

目录1、引言2、性能监控工具概述3、使用方式及应用3.1jps:虚拟机进程状况工具3.1.1语法格式3.1.2用例 3.2 jstat:虚拟机统计信息监控工具3.2.1语法格式3.2.2用例3.2.3  jstat的局限性3.3jinfo:显示虚拟机配置信息3.3.1语法格式3.3.2用例3.4jm... 查看详情

jvm内存堆栈监控之jmap篇(代码片段)

jmap命令可以获得运行中的jvm的堆的快照,从而可以离线分析堆,以检查内存泄漏,检查一些严重影响性能的大对象的创建,检查系统中什么对象最多,各种对象所占内存的大小等等jmap(linux下特有,也是很常用的一个命令)观... 查看详情

jvm性能调优工具之jmap

参考技术A命令jmap是一个多功能的命令。它可以生成java程序的dump文件,也可以查看堆内对象示例的统计信息、查看ClassLoader的信息以及finalizer队列。命令:jmappid描述:查看进程的内存映像信息,类似Solarispmap命令。使用不带选项... 查看详情

jvm调优的常见命令行工具都有哪些?

JVM调优的常见命令工具包括:1)jps命令用于查询正在运行的JVM进程,2)jstat可以实时显示本地或远程JVM进程中类装载、内存、垃圾收集、JIT编译等数据3)jinfo用于查询当前运行这的JVM属性和参数的值。4)jmap用于显示当前Java堆... 查看详情

jvm参数调优详解(代码片段)

文章目录JVM调优什么是JVM调优?为什么要JVM调优?总结JVM参数调优JVM参数类型JVM常见参数JVM调优建议年轻代大小选择老年代大小选择较小堆引起的碎片问题JVM调优实战VM堆内存调优调整最大堆内存和最小堆内存调整新生代... 查看详情

jvm参数调优详解(代码片段)

文章目录JVM调优什么是JVM调优?为什么要JVM调优?总结JVM参数调优JVM参数类型JVM常见参数JVM调优建议年轻代大小选择老年代大小选择较小堆引起的碎片问题JVM调优实战VM堆内存调优调整最大堆内存和最小堆内存调整新生代... 查看详情

jvm性能调优监控工具jpsjstackjmapjhatjstatjinfojconsole使用详解(代码片段)

JDK本身提供了很多方便的JVM性能调优监控工具,除了集成式的VisualVM和jConsole外,还有jps、jstack、jmap、jhat、jstat等小巧的工具,本博客希望能起抛砖引玉之用,让大家能开始对JVM性能调优的常用工具有所了解。  ... 查看详情

jvm参数设置(代码片段)

...#xff0c;随着JVM版本的变化可能会发生变化,主要用于JVM调优和debug。JVM常用指令熟悉查看java默认的垃圾收集器类型,显示信息如下,代表当前使用的垃圾收集器是UseParallelGC(默认),InitialHeapSize等参数的单位是kbjava-XX... 查看详情