元空间和本机内存有什么区别?
可以使用 jconsole、jvisualvm、jstat cmds 跟踪元空间。
似乎可以使用 jcmd 跟踪本机内存。关联
元空间也是本机内存吗?
NIO 缓冲区存储在哪里?在元空间或本机内存中?
元空间也是本机内存吗?
是的,元空间是本机内存(进程内存)的一部分,受主机操作系统的限制
您可以使用jmap -permstat PID
. 如果您的应用程序最终在元空间中分配了大量内存,那么它将影响整个系统而不仅仅是 JVM。这就是为什么它建议您使用-XX:MetaspaceSize
显式设置应用程序的最大元空间大小。
Java NIO API 使用 ByteBuffers 作为 I/O 调用的源和目标,有两种形式:
- Heap Byte Buffer(包装一个 byte[] 数组,分配在垃圾回收的 Java 堆中)
- 直接字节缓冲区(包装在 Java 堆外分配的内存)
由于只能将“本机”内存传递给操作系统调用,因此垃圾收集器不会移动它,这意味着当您使用堆 ByteBuffer进行 I/O 时,它会被复制到临时直接 ByteBuffer中。JDK 为每个线程缓存一个临时缓冲区,没有任何内存限制(即无限缓存)。因此,如果您从多个线程调用具有大堆 ByteBuffers 的 I/O 方法,您的进程可能会使用大量额外的本机内存。
您可以参考this & this article了解更多详情。
更新
RSS =OffHeap(映射文件、JVM 内部代码(.bss 段)、线程堆栈、直接缓冲区)+ GC 内部结构+ 堆 + 本地库(例如 IO 库)使用和分配的结构 + 元空间 + JVM 的共享库 + CodeCache
您可以在 linux pmap -x上使用来分析 JVM 进程的内存映射。此外,通过设置适当的MALLOC_CONF 环境变量, Jemalloc可以帮助在每 x GB/ x kB 的内存分配/堆栈跟踪之后将配置文件写入磁盘。生成文件后,尝试使用Jeprof 进行可视化。例如
jeprof --show_bytes --pdf `which w` jeprof.heap > sample.pdf
为调用图生成 PDF。