zoukankan      html  css  js  c++  java
  • JDK本地内存追踪NMT

    通常情况下, JVM占用的内存不仅仅是-Xmx, -Xms等指定的大小, 因为JVM也是一个应用, 它需要额外的空间去完成它的工作, 除了堆外, JVM会分配内存的地方包括以下这些:

    Metaspace: 元数据区, 存储类, 及方法的元数据信息

    Threads: 线程, 线程里的栈还是比较耗内存的, 在64位操作系统上, 默认栈的大小为1MB, 当然可以通过-Xss配置。

    因为一般情况下线程的数量是没有限制的, 因此可能会占用极其多的内存。

    Code Cache: JVM通过JIT把字节码转换成机器指令, 然后把这些指令放到一个非堆区域Code Cache。

    配置参数:

    -XX:InitialCodeCacheSize: 初始大小

    -XX:ReservedCodeCacheSize: 最大的空间大小

    Garbage Collection: JVM的垃圾回收器需要使用到一个空间去完成它们的任务, 一些运行时的数据等等, 这个空间使用的更多的是本地内存(native memory)

    符号表

    String Pool: JVM复用字面量字符串的地方。

    配置参数:

    -XX:StringTableSize: 常量池大小

    运行时常量池,JVM用来存储编译时的字面量或方法以及属性地址(reference)。

    Native Byte Buffers:

    开发者可以直接使用本地内存, 如通过JNI的malloc或者NIO的ByteBuffers等。

     

    Native Memory Tracking

    那么怎么监控JVM使用到的这些内存吗, 答案就是通过NMT(Native Memory Tracking), 但是使用它之前需要设置JVM的启动参数:

    -XX:NativeMemoryTracking, 可能的值为off, 关闭,也为默认值, summary, 显示汇总信息, detail, 显示详细信息。

    使用方法:

    首先通过jps找到对应的Java程序的pid,然后使用如下命令:

    jcmd <pid> VM.native_memory
    

     
    我在本地运行jcmd后输出结果为:

    11132:
    
    Native Memory Tracking:
    
    Total: reserved=3517807KB, committed=548183KB
    -                 Java Heap (reserved=2045952KB, committed=366080KB)
                                (mmap: reserved=2045952KB, committed=366080KB)
    
    -                     Class (reserved=1089619KB, committed=46803KB)
                                (classes #8341)
                                (malloc=6227KB #11407)
                                (mmap: reserved=1083392KB, committed=40576KB)
    
    -                    Thread (reserved=29820KB, committed=29820KB)
                                (thread #30)
                                (stack: reserved=29696KB, committed=29696KB)
                                (malloc=89KB #152)
                                (arena=35KB #59)
    
    -                      Code (reserved=251467KB, committed=10383KB)
                                (malloc=1867KB #4673)
                                (mmap: reserved=249600KB, committed=8516KB)
    
    -                        GC (reserved=80655KB, committed=74803KB)
                                (malloc=5775KB #218)
                                (mmap: reserved=74880KB, committed=69028KB)
    
    -                  Compiler (reserved=149KB, committed=149KB)
                                (malloc=18KB #478)
                                (arena=131KB #3)
    
    -                  Internal (reserved=6719KB, committed=6719KB)
                                (malloc=6655KB #11664)
                                (mmap: reserved=64KB, committed=64KB)
    
    -                    Symbol (reserved=11371KB, committed=11371KB)
                                (malloc=9477KB #85817)
                                (arena=1894KB #1)
    
    -    Native Memory Tracking (reserved=1880KB, committed=1880KB)
                                (malloc=72KB #1130)
                                (tracking overhead=1807KB)
    
    -               Arena Chunk (reserved=176KB, committed=176KB)
                                (malloc=176KB)
    

    11132是进程号pid

    然后出现的很多reserved是指总共可用的内存大小, 而commited是指已经使用的内存大小。

     

    追踪本地内存的变化

    NMT可以让我们看到随时间增长本地内存的变化。

    首先需要设置一个对照的内存状态:

    jcmd <pid> VM.native_memory baseline
    

    然后过一段时间如果需要查看变化状态即:

    jcmd <pid> VM.native_memory detail.diff
    

    NMT通过+和-来显示内存的变化:

    Total: reserved=1771487KB +3373KB, committed=491491KB +6873KB
    -             Java Heap (reserved=307200KB, committed=307200KB)
                            (mmap: reserved=307200KB, committed=307200KB)
      
    -             Class (reserved=1084300KB +2103KB, committed=39356KB +2871KB)
    

    Refer: https://www.baeldung.com/native-memory-tracking-in-jvm

  • 相关阅读:
    博客园的第一篇博客
    I-如何办好比赛
    塞特斯玛斯塔
    字典序最大的子序列
    百练POJ 1657:Distance on Chessboard
    百练POJ2750:鸡兔同笼
    HDU3790最短路径问题
    HDU 2544最短路Dijkstra算法
    快速幂【倍增+二分】
    树的高度
  • 原文地址:https://www.cnblogs.com/helloz/p/11582109.html
Copyright © 2011-2022 走看看