Java本机内存使用情况

有没有工具可以知道我的java应用程序使用了多少本机内存? 我从我的应用程序中经历过outofmemory:当前设置是:-Xmx900m

电脑,Windows 2003 Server 32bit,RAM 4GB。

也是在Windows上将boot.ini更改为/ 3GB,会有什么不同吗? 如果设置为Xmx900m,那么可以为此进程分配多少最大本机内存? 是1100米?

(在我的情况下,我使用java 8)

添加到命令行: -XX:NativeMemoryTracking=summary

然后启动jcmd VM.native_memory

你应该得到这样的东西:

 Total: reserved=3863657KB, committed=1679977KB - Java Heap (reserved=1843200KB, committed=824320KB) (mmap: reserved=1843200KB, committed=824320KB) - Class (reserved=1311974KB, committed=298726KB) (classes #52579) (malloc=5350KB #76340) (mmap: reserved=1306624KB, committed=293376KB) - Thread (reserved=263278KB, committed=263278KB) (thread #256) (stack: reserved=262140KB, committed=262140KB) (malloc=839KB #1280) (arena=299KB #510) - Code (reserved=278521KB, committed=164773KB) (malloc=28921KB #37983) (mmap: reserved=249600KB, committed=135852KB) - GC (reserved=114897KB, committed=77093KB) (malloc=13729KB #67925) (mmap: reserved=101168KB, committed=63364KB) - Compiler (reserved=461KB, committed=461KB) (malloc=330KB #1138) (arena=131KB #3) - Internal (reserved=13877KB, committed=13877KB) (malloc=13845KB #72978) (mmap: reserved=32KB, committed=32KB) - Symbol (reserved=28871KB, committed=28871KB) (malloc=24740KB #275452) (arena=4131KB #1) - Native Memory Tracking (reserved=8393KB, committed=8393KB) (malloc=45KB #523) (tracking overhead=8348KB) - Arena Chunk (reserved=184KB, committed=184KB) (malloc=184KB) 

有关更多信息,请参阅https://docs.oracle.com/javase/8/docs/technotes/guides/troubleshoot/tooldescr007.html

本文提供了一些有关捕获本机内存问题的好信息,并解释了如何耗尽本机内存。

对于那些后来的人,VMMap会给你答案。 它将显示本机内存分配。 根据我的经验,我认为-Xss在操作系统分配块中的最小数量为124K。 操作系统分配的块数会增加一倍,直到达到1GB(然后就完成了。)如果无法减少线程,请尝试减少最大堆和最大permgen设置,或尝试使用/ 3GB开关。

自由进程空间略小于2GB – Xmx。 (假设是Sun JVM)您必须将您的permgen空间添加到Xmx,然后为OS的内核填充减去大约150-200MB左右。 如果真正的问题是真正的内存不足,3GB开关或减少你的Xmx和PermGen空间应该可以减轻它。 有时候,至少在Windows上,操作系统只需要花费比JVM愿意等待分配线程更长的时间,问题就在于你发送线程产生垃圾邮件而不是耗尽内存。 你应该有几千个线程的内存空间。 在它放弃之前你有多少人?

还有一个-Xss开关来控制JVM要求的线程堆栈的大小。 YMMV如果更改它实际上在Windows上做任何事情。

本机内存是JVM通常用于内部操作和执行JNI代码的区域。 JVM使用本机内存进行代码优化,并加载类和库以及中间代码生成。 本机内存的大小取决于操作系统的体系结构和已提交给Java堆的内存量。 本机内存是加载JNI代码或加载JVM库或加载本机性能包和代理模块的进程区。 没有JVM选项可用于调整Native Area的大小。 但我们可以使用以下公式计算它:

NativeMemory =(ProcessSize – MaxHeapSize – MaxPermSize)

在devopsconsole发现了这个

如果你使用例如jvisualvm(它随jdk一起提供),你可以看到你的应用程序使用了多少内存,你也可以更详细地描述它。