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