我两周前开始寻找一个不断增长的Java内存。我正在使用以下命令来防止堆栈过度增长,并进行一些调试。
我在Ubuntu 16.04上运行,使用Oracle Java 8,因为OpenJDK 8没有我需要使jemaloc提供正确数据的调试符号。
-XX:NativeMemoryTracking=detail -XX:+UseG1GC -XX:+UseStringDeduplication -Xms64m -Xmx256m -XX:MaxMetaspaceSize=128m -Xss256k
如您所见,我的Xmx设置为256m。然而,top
目前显示我的进程为1.1G。
经过使用JProfiler和JVisualVm以及我在谷歌上找到的其他许多东西后,我得出结论,这必须是一个非堆问题。
经过长时间的搜索,我发现了jemaloc
,并且我阅读的有关它的文章似乎很有希望。但是我现在遇到了一些解释数据的问题,并且需要找出问题的根源。
本机内存跟踪数据
Native Memory Tracking:
Total: reserved=1678MB, committed=498MB
- Java Heap (reserved=256MB, committed=256MB)
(mmap: reserved=256MB, committed=256MB)
- Class (reserved=1103MB, committed=89MB)
(classes #14604)
(malloc=3MB #32346)
(mmap: reserved=1100MB, committed=85MB)
- Thread (reserved=26MB, committed=26MB)
(thread #53)
(stack: reserved=26MB, committed=26MB)
- Code (reserved=261MB, committed=96MB)
(malloc=17MB #17740)
(mmap: reserved=244MB, committed=79MB)
- GC (reserved=1MB, committed=1MB)
(mmap: reserved=1MB, committed=1MB)
- Internal (reserved=6MB, committed=6MB)
(malloc=6MB #48332)
- Symbol (reserved=19MB, committed=19MB)
(malloc=16MB #168491)
(arena=4MB #1)
- Native Memory Tracking (reserved=5MB, committed=5MB)
(tracking overhead=4MB)
mprotect
和mmap
生成的.jfr文件中没有内存信息,只有CPU分析。这是否是预期的?@apangin - expert-e mprotect
或-e mmap
时,您将对这些函数的调用进行分析,而不是CPU采样。在这里,分配配置文件是无关紧要的。所以是的,这是预期的。 - apangin