JVM除了堆内存、栈内存,还有DirectMemory内存,DirectMemory是java nio引入的。

在JDK1.4中新加入了NIO(New INput/Output)类,引入了一种基于通道(Channel)与缓冲区(Buffer)的I/O方式,它可以使用Native函数库直接分配堆外内存,

然后通过一个存储在Java堆中的DirectByteBuffer对象作为这块内存的引用进行操作。这样能在一些场景中显著提高性能,因此避免了在Java堆和Native堆中来回复制数据。

Direct Memory是受GC控制的,例如ByteBuffer bb = ByteBuffer.allocateDirect(1024),这段代码的执行会在堆外占用1k的内存,Java堆内只会占用一个对象的指针引用的大小,堆外的这1k的空间只有当bb对象被回收时,才会被回收,这里会发现一个明显的不对称现象,就是堆外可能占用了很多,而堆内没占用多少,导致还没触发GC,那就很容易出现Direct Memory造成物理内存耗光。

垃圾收集进行时,虚拟机虽然会对Direct Memory进行回收,但是Direct Memory却不能像新生代、老年代那样,发现空间不足了就通知收集器进行垃圾回收,它只能等待老年代满了后Full GC,然后顺便棒它清理内存的废弃对象。否则它只能一直等到抛出内存异常时,先catch掉,再在catch块里System.gc()。

可通过-XX:MaxDirectMemorySize调整大小,内存不足时抛出OutOfMemoryError或者OutOfMemoryError:Direct buffer mempry

最新文章

  1. Flash跨域传输数据 crossdomain.xml
  2. Python dir
  3. JSON.parse
  4. DOM之节点层次
  5. jersey处理支付宝异步回调通知的问题:java.lang.IllegalArgumentException: Error parsing media type 'application/x-www-form-urlencoded; text/html; charset=UTF-8'
  6. HDU 5675 ztr loves math (数学推导)
  7. Ubuntu12.04 配置Java开发环境:JDK1.7+Eclipse+Tomcat7.0
  8. HTML之学习笔记(九)表单
  9. BC 2015在百度之星程序设计大赛 - 预赛(1)(系列转换-二分法答案贪婪)
  10. Hadoop之MapReduce分布式计算
  11. Java GUI+mysql+分页查询
  12. 通过路由url携带参数进行参数传递
  13. 自建MySQL5.6数据库查询优化
  14. Linux 学习 (九) 网络基础
  15. Noj - 在线强化训练3
  16. linux 用户密码过期时间
  17. c#switch语句的用法
  18. 使用JAVA反射技术实现代码零耦合与功能无限扩展!
  19. ERROR 1050 (42S01): Table xxx already exists
  20. 软件测试-历史bug回顾(持续更新~)

热门文章

  1. linux上的常用的系统自带命令
  2. webrtc相关概念
  3. java jar 服务自启动存在的坑及解决办法
  4. Go Int转string几种方式性能测试
  5. delphi 跨版本DLL调用嵌入窗体实现
  6. 阶段3 1.Mybatis_12.Mybatis注解开发_7 Mybatis注解开发一对多的查询配置
  7. Spring MVC集成Swagger2.0
  8. windows环境下PostgreSQL的安装
  9. oracle-只读数据文件的备份与恢复
  10. IIS安全狗问题