zoukankan      html  css  js  c++  java
  • 性能调优命令之jmap

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

    option:

    • no option: 查看进程的内存映像信息,类似 Solaris pmap 命令。
    • heap: 显示Java堆详细信息
    • histo[:live]: 显示堆中对象的统计信息
    • clstats:打印类加载器信息
    • finalizerinfo: 显示在F-Queue队列等待Finalizer线程执行finalizer方法的对象
    • dump::生成堆转储快照
    • F: 当-dump没有响应时,使用-dump或者-histo参数. 在这个模式下,live子参数无效.
    • help:打印帮助信息
    • J:指定传递给运行jmap的JVM的参数

    例1:
    命令:jmap -heap pid
    描述:显示Java堆详细信息
    打印一个堆的摘要信息,包括使用的GC算法、堆配置信息和各内存区域内存使用信息

    jmap -heap 5611
    Attaching to process ID 5611, please wait...
    Debugger attached successfully.
    Client compiler detected.
    JVM version is 25.271-b09
    
    using thread-local object allocation.
    Mark Sweep Compact GC
    
    Heap Configuration:
       MinHeapFreeRatio         = 40
       MaxHeapFreeRatio         = 70
       MaxHeapSize              = 268435456 (256.0MB)
       NewSize                  = 5570560 (5.3125MB)
       MaxNewSize               = 89456640 (85.3125MB)
       OldSize                  = 11206656 (10.6875MB)
       NewRatio                 = 2
       SurvivorRatio            = 8
       MetaspaceSize            = 12582912 (12.0MB)
       CompressedClassSpaceSize = 1073741824 (1024.0MB)
       MaxMetaspaceSize         = 4294963200 (4095.99609375MB)
       G1HeapRegionSize         = 0 (0.0MB)
    
    Heap Usage:
    New Generation (Eden + 1 Survivor Space): #年轻代
       capacity = 5046272 (4.8125MB)
       used     = 1646832 (1.5705413818359375MB)
       free     = 3399440 (3.2419586181640625MB)
       32.63462611607143% used
    Eden Space:   # 伊甸园区
       capacity = 4521984 (4.3125MB)
       used     = 1614560 (1.539764404296875MB)
       free     = 2907424 (2.772735595703125MB)
       35.70468183876812% used
    From Space:		#存活区
       capacity = 524288 (0.5MB)
       used     = 32272 (0.0307769775390625MB)
       free     = 492016 (0.4692230224609375MB)
       6.1553955078125% used
    To Space:		#存活区
       capacity = 524288 (0.5MB)
       used     = 0 (0.0MB)
       free     = 524288 (0.5MB)
       0.0% used
    tenured generation:		#老年代
       capacity = 11206656 (10.6875MB)
       used     = 7409520 (7.0662689208984375MB)
       free     = 3797136 (3.6212310791015625MB)
       66.11713610197368% used
    
    5109 interned Strings occupying 397496 bytes.
    

    例2
    命令:jmap -histo:live pid
    描述:显示堆中对象的统计信息

    其中包括每个Java类、对象数量、内存大小(单位:字节)、完全限定的类名。打印的虚拟机内部的类名称将会带有一个’*’前缀。如果指定了live子选项,则只计算活动的对象。
    此命令常用来查看内存溢出

    num     #instances         #bytes  class name
    ----------------------------------------------
       1:          2580        2986640  [B
       2:         27304        2316368  [C
       3:          7626        1577272  [I
       4:          8714         418272  java.util.concurrent.ConcurrentHashMap$EntryIterator
       5:         25061         400976  java.lang.String
       6:          6301         296872  [Ljava.lang.Object;
       7:          2981         284776  java.lang.Class
       8:          8714         209136  java.util.concurrent.ConcurrentHashMap$MapEntry
       9:          8679         208296  java.util.HashMap$Node
      10:          4289         171560  java.util.HashMap
      11:          3617         146984  [Ljava.util.HashMap$Node;
      12:          1425         125400  java.lang.reflect.Method
      13:          1676         120672  java.lang.reflect.Constructor
      14:          1776         113664  java.util.regex.Matcher
      15:          3480          83520  java.util.Hashtable$Entry
      16:          3046          73104  java.util.concurrent.ConcurrentHashMap$Node
      17:           687          71448  java.io.ObjectStreamClass
      18:           723          63816  [Ljava.util.Hashtable$Entry;
      19:           155          58280  java.lang.Thread
      20:          1750          56000  java.io.ObjectStreamClass$WeakClassKey
    

    例3:
    命令:jmap -dump:format=b,file=heapdump.phrof pid
    描述:生成堆转储快照dump文件。

    以hprof二进制格式转储Java堆到指定filename的文件中。live子选项是可选的。如果指定了live子选项,堆中只有活动的对象会被转储。想要浏览heap dump,你可以使用jhat(Java堆分析工具)读取生成的文件。

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

    [root@chenshifengdeLinuxServer ~]# jmap -dump:live,format=b,file=heap.bin 5611
    Dumping heap to /root/heap.bin ...
    Heap dump file created
    

    然后会在当前目录生成一个heap.bin的二进制文件,可以使用jhat命令去解析

    [root@chenshifengdeLinuxServer ~]# jhat -J-mx512 heap.bin 
    Error occurred during initialization of VM
    Initial heap size set to a larger value than the maximum heap size
    [root@chenshifengdeLinuxServer ~]# jhat -J-mx512m heap.bin 
    Reading from heap.bin...
    Dump file created Sun Jun 06 21:40:36 CST 2021
    Snapshot read, resolving...
    Resolving 76088 objects...
    Chasing references, expect 15 dots...............
    Eliminating duplicate references...............
    Snapshot resolved.
    Started HTTP server on port 7000
    Server is ready.
    

    然后访问7000端口
    image
    最下面可以查看堆内存大小,和jmap -histo 一样
    image

    如果您觉得本篇文章还不错,欢迎点赞,转发分享(转发请注明出处),感谢~~
  • 相关阅读:
    Day08_固化命令、grep、sed及awk命令
    Day07_网络管理、SSH、shell及元字符
    Day06_nginx及反向代理、共享存储nfs
    安装Apache所踩的的坑
    使用JS制作小游戏贪吃蛇
    清除浮动的几种方式
    纯CSS3图片反转
    在JAVASCRIPT中,为什么document.getElementById不可以再全局(函数外)使用?
    关于钉钉开发,心得
    javascript计算两个时间差
  • 原文地址:https://www.cnblogs.com/feng0815/p/14856453.html
Copyright © 2011-2022 走看看