Java中元空间和本机内存的区别

Java中元空间和本机内存的区别,java,java-8,jvm,nio,metaspace,Java,Java 8,Jvm,Nio,Metaspace,元空间和本机内存之间有什么区别 可以使用jconsole、jvisualvm、jstat cmds跟踪元空间。 似乎可以使用jcmd跟踪本机内存 元空间也是本机内存吗 NIO缓冲区存储在哪里?在元空间或本机内存中?元空间也是本机内存吗? 是的,元空间是本机内存(进程内存)的一部分,并且 受主机操作系统限制 您可以使用jmap-permstat-PID监视它。如果您的应用程序最终在元空间中分配了大量内存,那么它将影响整个系统,而不仅仅是JVM。这就是为什么建议您使用-XX:MetaspaceS

元空间和本机内存之间有什么区别

可以使用jconsole、jvisualvm、jstat cmds跟踪元空间。
似乎可以使用jcmd跟踪本机内存

元空间也是本机内存吗


NIO缓冲区存储在哪里?在元空间或本机内存中?

元空间也是本机内存吗?

是的,元空间是本机内存(进程内存)的一部分,并且 受主机操作系统限制

您可以使用
jmap-permstat-PID
监视它。如果您的应用程序最终在元空间中分配了大量内存,那么它将影响整个系统,而不仅仅是JVM。这就是为什么建议您使用
-XX:MetaspaceSize
显式设置应用程序的最大元空间大小

JavaNIOAPI使用ByteBuffers作为I/O的源和目标 电话,有两种口味:

  • 堆字节缓冲区(包装一个字节[]数组,在垃圾收集的Java堆中分配)
  • 直接字节缓冲区(在Java堆外部分配的包装内存)
因为只有“本机”内存可以传递给操作系统调用,所以 它不会被垃圾收集器移动,这意味着当您使用 一个堆字节缓冲区对于I/O,它被复制到一个临时直接 ByteBuffer。JDK为每个线程缓存一个临时缓冲区,而不使用 任何内存限制(即无限缓存)。因此,如果 从多个线程调用具有大堆字节缓冲区的I/O方法, 您的进程可能会使用大量额外的本机内存

有关更多详细信息,请参阅(&D)

已更新

RSS=堆外(映射文件、JVM内部代码(.bss段)、线程堆栈、直接缓冲区)+GC内部结构+堆+本机库使用和分配的结构(例如IO库)+元空间+JVM的共享库+CodeCache

您可以在linux上使用来分析JVM进程的内存映射。此外,通过设置适当的内存分配/堆栈跟踪,可以帮助在每x GB/x kB内存分配/堆栈跟踪之后将配置文件写入磁盘。生成文件后,请尝试使用Jeprof for。例如

 jeprof --show_bytes --pdf `which w` jeprof.heap > sample.pdf

为调用图生成PDF。

我正在使用启用了NIO连接器的Tomcat。unix cmd中的RSS值与(堆+元空间)不匹配。所以,如果本机内存大于元空间,那么如何度量它。如果可能的话,你能提到使用的内存中断(RSS)可能有很多原因,比如很多线程,可能是glibc版本>2.10的问题,等等。你可以使用
pmap-x
对内存进行更深入的了解。你的答案中有很大一部分是从@TheLostMind我重新格式化了我的帖子,由于某些原因,第一次没有正确应用格式。现在我知道了元空间应该没问题,但在得到这个答案之前,我从来没有听说过“meatspace”是JVM为tube Streak分配内存的地方吗?