DirectBuffer及内存泄漏
来源:互联网 发布:sql select 创建表 编辑:程序博客网 时间:2024/05/24 07:28
创建Buffer对象时,可以选择从JVM堆中分配内存,也可以OS本地内存中分配,由于本地缓冲区避免了缓冲区复制,在性能上相对堆缓冲区有一定优势,但同时也存在一些弊端。
两种缓冲区对应的API如下:
- JVM堆缓冲区:ByteBuffer.allocate(size)
- 本地缓冲区:ByteBuffer.allocateDirect(size)
从堆中分配的缓冲区为普通的Java对象,生命周期与普通的Java对象一样,当不再被引用时,Buffer对象会被回收。而直接缓冲区(DirectBuffer)为本地内存,并不在Java堆中,也不能被JVM垃圾回收。由于直接缓冲区在JVM里被包装进Java对象DirectByteBuffer中,当它的包装类被垃圾回收时,会调用相应的JNI方法释放本地内存,所以本地内存的释放也依赖于JVM中DirectByteBuffer对象的回收。
由于垃圾回收本身成本较高,一般JVM在堆内存未耗尽时,不会进行垃圾回收操作。我们知道在32位机器上,每个进程的最大可用内存为4G,用户可用内存在大概为3G左右,如果为堆分配过大的内存时,本地内存可用空间就会相应减少。当我们为堆分配较多的内存时,JVM可能会在相当长的时间内不会进行垃圾回收操作,从而本地内存不断分配,无法释放,最终导致OutOfMemoryError。
由此可见,在使用直接缓冲区之前,需要做出权衡:
- 堆缓冲区的性能已经相当高,若无必要,使用堆缓冲区足矣。若确实有提升性能的必要时,再考虑使用本地缓冲区。
- 为JVM分配堆内存时,并不是越大越好,堆内存越大,本地内存就越小,根据具体情况决定,主要针对32位机器,64位机器上不存在该问题。
- DirectBuffer及内存泄漏
- DirectBuffer及内存泄漏
- DirectBuffer及内存泄漏
- 直接内存DirectBuffer
- 内存泄漏及防护
- 内存泄漏及检测
- 内存泄漏及解决方案
- 内存泄漏及检测
- 内存泄漏及解决方法
- 内存泄漏及内存溢出
- js 内存泄漏及解决方案
- Js内存泄漏及解决方案
- 内存泄漏及常见解决方法
- 内存泄漏及手动回收
- Js内存泄漏及解决方案
- 内存泄漏问题及解决
- Js内存泄漏及解决方案
- C++内存泄漏及解决方法
- 走进WebKit
- 通过代码切换组织
- hdu 3074 Multiply game(线段树模版)
- 读取图片 优化android内存
- hibernate多表关联配置
- DirectBuffer及内存泄漏
- 数位DP+二分搜索——HDU3943 K-th Nya Number
- vpn 服务器linux 客户端windows
- 归并排序 (不采用哨兵) 算法导论2.3-2答案
- 只有apk时robotium测试程序启动相应时间(一)
- Android 9 patch 图片 (.9.png 格式图片) 的特点和制作
- 关于在for循环的switch语句使用break和continue问题
- 日文發音中的PTK法則
- 原厂文档介绍以及阅读路线