java - java 的 native 内存跟踪输出的 "other"部分有什么内容?

标签 java performance memory jvm java-11

我正在尝试调试具有高内存使用率的 Java 应用程序。使用 native 内存跟踪,我发现名为“其他”的部分使用了大量内存。我似乎无法在网上找到任何关于可能存储在这里的内容、可能导致它高的原因或如何进一步调试的信息。任何沿着这些路线的帮助将不胜感激。作为引用,这是我从 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)

最佳答案

Other NMT 报告的一部分通过 Direct ByteBuffers 计算应用程序分配的堆外内存或立即通过 Unsafe.allocateMemory . ByteBuffer.allocateDirect电话Unsafe.allocateMemory在引擎盖下。
您可以通过 JMX 监控 Direct ByteBuffers 的数量和它们占用的总内存 - 查找 BufferPool MBean:
BufferPool MBean
Async-profiler可以帮助找到堆外内存的分配位置。跑

profiler.sh -d <duration> -e jdk.internal.misc.Unsafe.allocateMemory -f profile.html <pid>
这将创建一个火焰图,显示所有位置的堆栈跟踪 Unsafe.allocateMemory (包括 ByteBuffer.allocateDirect )来自:
Unsafe.allocateMemory
有关 ByteBuffers 及其与堆外内存使用的关系的更多信息,请参阅 this presentation .

关于java - java 的 native 内存跟踪输出的 "other"部分有什么内容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65157496/

相关文章:

java - JPA - 可以在不提供可选参数的情况下调用存储过程吗?

java - 对 jTable 中的列求和?

java - TreeViewer.expandAll 方法的性能

r - 为什么R中的逻辑( boolean 值)需要4个字节?

c++ - 如何将数组指向嵌入式系统上的某个特定内存地址

java - 在Android NDK中调用C++类中的SO函数

java - --patch-module 是否会反射性地显示出来?

C++ 获取运行时间和内存使用情况

MySql MyISAM 插入缓慢

Java内存: Runtime. getRuntime().maxMemory()