JVM管理的内存可以总体划分为两部分:Heap Memory和Native Memory。前者供Java应用程序使用的;后者也称为C-Heap,是供JVM自身进程使用的。Native Memory没有相应的参数来控制大小,其大小依赖于操作系统进程的最大值,以及生成的Java字节码大小、创建的线程数量、维持java对象的状态信息大小(用于GC)以及一些第三方的包,比如JDBC驱动使用的native内存。

Native Memory里存些什么?
(1)管理java heap的状态数据(用于GC);
(2)JNI调用,也就是Native Stack;
(3)JIT(即使编译器)编译时使用Native Memory,并且JIT的输入(Java字节码)和输出(可执行代码)也都是保存在Native Memory;
(4)NIO direct buffer。对于IBM JVM和Hotspot,都可以通过-XX:MaxDirectMemorySize来设置nio直接缓冲区的最大值。默认是64M。超过这个时,会按照32M自动增大。
(5)对于IBM的JVM某些版本实现,类加载器和类信息都是保存在Native Memory中的。

DirectBuffer的好处
DirectBuffer访问更快,避免了从HeapBuffer还需要从java堆拷贝到本地堆,操作系统直接访问的是DirectBuffer。DirectBuffer对象的数据实际是保存在native heap中,但是引用保存在HeapBuffer中。
另外,DirectBuffer的引用是直接分配在堆得Old区的,因此其回收时机是在FullGC时。因此,需要避免频繁的分配DirectBuffer,这样很容易导致Native Memory溢出。

为什么会内存溢出?
简单理解java process memory = java heap + native memory。因此内存溢出时,首先要区分是堆内存溢出还是本地内存溢出。Native Memory本质上就是因为耗尽了进程地址空间。对于HotSpot JVM来书,不断的分配直接内存,会导致如下错误信息:Allocated 1953546760 bytes of native memory before running out

参考文章:

(1)https://blog.csdn.net/u013721793/article/details/51204001

(2)聊聊HotSpot VM的Native Memory Tracking https://cloud.tencent.com/developer/article/1406522

最新文章

  1. CSS3 滤镜
  2. Windows安装包制作指南——Advanced Installer的使用
  3. Ajax.ActionLink()方法的使用
  4. 【 Regular Expression Matching 】cpp
  5. hdu 1023(java实现进度计算)
  6. MVC - 基础
  7. 数据结构练习 02-线性结构3. Pop Sequence (25)
  8. 对SA权限的再突破 (对付xplog70.dll被删)转载
  9. 清北Day 2
  10. VM及centOS系统安装
  11. L2 约束的最小二乘学习法
  12. vue2.0 日历日程表 ,可进行二次开发.
  13. 【原创】大叔经验分享(23)spark sql插入表时的文件个数研究
  14. app ios info权限配置:
  15. Go学习笔记04-函数
  16. git第九节---git命令实战
  17. R中统计假设检验总结(一)
  18. Java之spilt()函数,trim()函数
  19. 01: RabbitMQ
  20. (转)Linux 文件目录特殊权限设定(SUID,SGID,SBIT)

热门文章

  1. springmvc处理json数据
  2. 来自GitHub的优秀开源项目系列
  3. vue生成pdf
  4. Java 之 ArrayList 集合
  5. Apache加固之目录、文件限制
  6. 模块化规范:AMD规范和CommonJs规范
  7. const关键字总结
  8. iOS 关于NavigationController返回的一些笔记
  9. Java DbUtils 操作数据库
  10. Mac 编译报错 symbol(s) not found for