Java中Metaspace和Native Memory的区别

时间:2016-09-24 10:36:28

标签: java java-8 jvm nio metaspace

Metaspace 本机内存有什么区别?

可以使用jconsole,jvisualvm,jstat cmds跟踪元空间 似乎可以使用jcmd跟踪Native Memory。 Link

metaspace还是Native Memory吗?

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

1 个答案:

答案 0 :(得分:19)

metaspace还是Native Memory吗?

  

是的,Metaspace是Native Memory(进程内存)的一部分,而且是   受主机操作系统的限制

source http://karunsubramanian.com/websphere/one-important-change-in-memory-management-in-java-8/ 您可以使用jmap -permstat PID对其进行监控。如果您的应用程序最终在元空间中分配大量内存,那么它将影响整个系统而不仅仅是JVM。这就是为什么它建议您使用-XX:MetaspaceSize来明确设置应用的最大元空间大小。

  

Java NIO API使用ByteBuffers作为I / O的源和目标   电话,有两种形式:

     
      
  • Heap Byte Buffer(包装在垃圾收集的Java堆中分配的byte []数组)
  •   
  • 直接字节缓冲区(在Java堆外部分配的包装内存)
  •   
     

因为只有" native"内存可以传递给操作系统调用,所以   它不会被垃圾收集器移动,这意味着当你使用时   对于I / O,堆ByteBuffer ,它被复制到临时直接   字节缓冲区即可。 JDK为每个线程缓存一个临时缓冲区,没有   任何内存限制(即无限高速缓存)。结果,如果你   使用来自多个线程的大堆ByteBuffers调用I / O方法,   您的流程可以使用大量额外的本机内存

您可以参考this& this article了解更多详情。

已更新

RSS = OffHeap(映射文件,JVM内部代码(.bss段),线程堆栈,直接缓冲区)+ GC内部结构+使用的Heap + Structures&由本机库(例如IO库)+ Metaspace + JVM + CodeCache的共享库分配

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

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

为调用图生成PDF。