【问题标题】:Memory details of JVM as a processJVM 作为进程的内存细节
【发布时间】:2017-04-23 07:49:34
【问题描述】:

我是这个主题的新手,所以,如果我的问题很明显,但在这里,很抱歉-
每当我们启动 Java 应用程序时,都会创建一个新的 JVM 实例。 JVM 本身是一个在操作系统上运行的进程,与任何其他进程一样,它也有自己的内存需求。
我知道堆和非堆内存结构以及如何配置和操作它们。我正在寻找的是jvm进程本身的内存细节, 整体内存如何划分即jvm自身内存需求+heap+non-heap+native stack
有多少段?
操作系统为JVM分配了多少内存,jvm如何进一步使用它?
运行应用程序时是否有任何命令或实用程序可以检查这些详细信息?
我搜索了很多,但没有找到任何具体的方向,几乎所有文章都解释了堆和非堆内存结构(eden / old / meta 等)。我还访问了以下链接-
JVM Memory Types
How is the java memory pool divided?
JVM Memory segments allocation
https://blog.codecentric.de/en/2010/01/the-java-memory-architecture-1-act/
JVM memory mapping over a Linux Process
Understanding JVM Memory Allocation and Java Out of Memory: Heap Space
看来我被困在这里了,任何关于这个主题的指针都会很棒,这样我就可以开始朝那个方向看。

【问题讨论】:

    标签: java memory-management jvm operating-system


    【解决方案1】:

    Java 8 的本机内存跟踪 (NMT) 功能有助于回答您的问题。

    使用选项 -XX:NativeMemoryTracking=summary 运行 Java
    然后在运行时执行以下命令打印 JVM 内存统计信息:

    jcmd <pid> VM.native_memory summary
    

    输出将如下所示:

    Total:  reserved=664192KB,  committed=253120KB
    
    -                 Java Heap (reserved=516096KB, committed=204800KB)
                                (mmap: reserved=516096KB, committed=204800KB)
    
    -                     Class (reserved=6568KB, committed=4140KB)
                                (classes #665)
                                (malloc=424KB, #1000)
                                (mmap: reserved=6144KB, committed=3716KB)
    
    -                    Thread (reserved=6868KB, committed=6868KB)
                                (thread #15)
                                (stack: reserved=6780KB, committed=6780KB)
                                (malloc=27KB, #66)
                                (arena=61KB, #30)
    
    -                      Code (reserved=102414KB, committed=6314KB)
                                (malloc=2574KB, #74316)
                                (mmap: reserved=99840KB, committed=3740KB)
    
    -                        GC (reserved=26154KB, committed=24938KB)
                                (malloc=486KB, #110)
                                (mmap: reserved=25668KB, committed=24452KB)
    
    -                  Compiler (reserved=106KB, committed=106KB)
                                (malloc=7KB, #90)
                                (arena=99KB, #3)
    
    -                  Internal (reserved=586KB, committed=554KB)
                                (malloc=554KB, #1677)
                                (mmap: reserved=32KB, committed=0KB)
    
    -                    Symbol (reserved=906KB, committed=906KB)
                                (malloc=514KB, #2736)
                                (arena=392KB, #1)
    
    -           Memory Tracking (reserved=3184KB, committed=3184KB)
                                (malloc=3184KB, #300)
    
    -        Pooled Free Chunks (reserved=1276KB, committed=1276KB)
                                (malloc=1276KB)
    
    -                   Unknown (reserved=33KB, committed=33KB)
                                (arena=33KB, #1)
    

    更多信息herehere

    【讨论】:

    • 正是我想要的。
    【解决方案2】:

    如果您正在寻找从jps 开始的命令行实用程序,它只打印所有正在运行的java 进程的PID。然后选择一个您想要发现的并使用jmap 及其PID。

    JDK 也带有可视化工具。旧的JConsoke 和更新更好的VisualVM

    【讨论】:

    • 我使用过 Jconsole 和 Visual VM。刚找到这篇文章,我在看这样的东西,blogs.vmware.com/apps/2011/06/…
    • 如果OS将X内存作为进程分配给JVM,那么在X之外,JVM会根据-Xms/-Xmx/-XX:PermSize,MaxPermSize,给heap/perm分配内存,比如说剩余内存是(X1 = X-heap-perm)。现在 X1 会发生什么,JVM 需要从 X1 中为自己提供多少内存,有多少用于其他段?正如文章所解释的,其他部分也很少
    猜你喜欢
    • 1970-01-01
    • 2011-06-21
    • 2011-10-10
    • 2012-02-27
    • 2016-05-31
    • 1970-01-01
    • 2021-03-29
    • 1970-01-01
    • 2023-03-15
    相关资源
    最近更新 更多