什么进入了“市场”;其他";java';本机内存跟踪输出?

什么进入了“市场”;其他";java';本机内存跟踪输出?,java,performance,memory,jvm,java-11,Java,Performance,Memory,Jvm,Java 11,我正在尝试调试一个高内存使用率的Java应用程序。使用本机内存跟踪,我发现一个名为“Other”的部分正在使用大量内存。我似乎在网上找不到任何关于这里可能存储了什么、什么可能导致它变高或如何进一步调试它的信息。在此方面的任何帮助都将不胜感激。以下是我从jcmd获得的输出,供参考: Total: reserved=49GB, committed=48GB - Java Heap (reserved=32GB, committed=32GB)

我正在尝试调试一个高内存使用率的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)

您应该说您使用的是
java-11
(或更高版本),因为之前它被称为
Internal
(它包含了更多)


这是通过NMT报告的
ByteBuffer::allocateDirect

Other
部分进行的每一次分配,通过或立即通过
Unsafe.allocateMemory对应用程序分配的堆内存进行计数
ByteBuffer.allocateDirect
调用
不安全。allocateMemory
在引擎盖下

您可以通过JMX-查找缓冲池MBean监视直接字节缓冲区的数量和它们占用的总内存:

可以帮助找到堆外内存的分配位置。跑

profiler.sh -d <duration> -e jdk.internal.misc.Unsafe.allocateMemory -f profile.html <pid>
profiler.sh-d-e jdk.internal.misc.Unsafe.allocateMemory-f profile.html
这将创建一个火焰图,显示从以下位置调用
不安全的所有位置的堆栈跟踪。allocateMemory
(包括
ByteBuffer.allocateDirect
):


有关ByteBuffers及其与堆外内存使用的关系的更多信息,请参阅。

可能是一些直接ByteBuffer?@cello不可能-但完全正确。NMT不跟踪映射ByteBuffers(即FileChannel.map)消耗的内存。@apangin哦,真的吗?我真的认为是的。非常感谢。