JVM作为一个进程的内存细节

4

我对这个主题还不熟悉,所以如果我的问题很明显,我向您道歉-每当我们启动一个Java应用程序时,都会创建一个新的JVM实例。 JVM本身是在操作系统上运行的进程,像其他进程一样,它具有自己的内存要求。
我知道堆和非堆内存结构以及它们如何配置和操作。我要寻找的是jvm进程本身的内存细节,整体内存如何划分,即jvm自身的内存需求+堆+非堆+本地堆栈
有多少个段?
操作系统分配给JVM多少内存,JVM如何进一步使用它?
在运行应用程序时是否有任何命令或实用程序可以检查这些详细信息?
我已经搜索了很多,但没有找到任何关于这个方向的具体内容,几乎所有的文章都解释了堆和非堆内存结构(伊甸园/老年代/元数据等)。我也访问了以下链接-
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
看来我被卡住了,在这个主题上的任何指针都将是伟大的,这样我就可以开始朝着那个方向寻找。
2个回答

6

Java 8 的原生内存追踪(Native Memory Tracking,简称NMT)功能有助于回答您的问题。

运行 Java 并使用选项 -XX:NativeMemoryTracking=summary
然后在运行时执行以下命令来打印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)

更多信息在此在此


此处提供更多有关IT技术的信息,具体可以参考上述链接。

正是我所寻找的。 - the-dumb-programmer

1
如果您正在寻找命令行实用程序,请从jps开始,它只打印所有正在运行的Java进程的PID。然后选择您想要发现并使用jmap和其PID。
JDK还带有可视化工具。旧的是JConsole,新的更好的是VisualVM

我曾使用过Jconsole和Visual VM。刚刚发现了这篇文章,我正在寻找类似于这样的内容,http://blogs.vmware.com/apps/2011/06/taking-a-closer-look-at-sizing-the-java-process.html - the-dumb-programmer
1
如果操作系统将X内存分配给JVM作为进程,那么在X中,JVM将根据-Xms / -Xmx / -XX:PermSize,MaxPermSize将内存分配给堆/ perm,假设剩余内存为(X1 = X-heap-perm)。现在X1会发生什么情况,JVM需要多少内存用于自身,多少内存用于其他段?正如文章所解释的,还有一些其他段。 - the-dumb-programmer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接