性能java的本机内存跟踪输出的“其他”部分是什么?
我正在尝试调试一个高内存使用率的Java应用程序。使用本机内存跟踪,我发现一个名为“Other”的部分正在使用大量内存。我似乎在网上找不到任何关于这里可能存储了什么、什么可能导致它变高或如何进一步调试它的信息。在此方面的任何帮助都将不胜感激。以下是我从jcmd获得的输出,供参考:
Total: reserved=49GB, committed=48GB
- Java Heap (reserved=32GB, committed=32GB)
(mmap: reserved=32GB, committed=32GB)
- Thread (reserved=1GB, committed=0GB)
(thread #1291)
(stack: reserved=1GB, committed=0GB)
- GC (reserved=2GB, committed=2GB)
(mmap: reserved=1GB, committed=1GB)
- Other (reserved=14GB, committed=14GB)
(malloc=14GB #1520)
# 1 楼答案
NMT报告的
Other
部分统计应用程序通过Direct ByteBuffers或立即通过Unsafe.allocateMemory
分配的堆内存ByteBuffer.allocateDirect
在引擎盖下呼叫Unsafe.allocateMemory
您可以通过JMX监视直接字节缓冲区的数量和它们占用的总内存-查找缓冲池MBean:
Async-profiler可以帮助找到堆外内存的分配位置。跑
这将创建一个火焰图,显示调用
Unsafe.allocateMemory
(包括ByteBuffer.allocateDirect
)的所有位置的堆栈轨迹:有关字节缓冲区及其与堆外内存使用的关系的更多信息,请参阅this presentation
# 2 楼答案
你应该说你使用了
java-11
(或更高版本),因为之前它被称为Internal
(包括更多)这是通过
ByteBuffer::allocateDirect
进行的每一次分配