写NIO程序经常使用ByteBuffer来读取或者写入数据,那么使用ByteBuffer.allocate(capability)还是使用ByteBuffer.allocteDirect(capability)来分配缓存了?第一种方式是分配JVM堆内存,属于GC管辖范围,由于需要拷贝所以速度相对较慢;第二种方式是分配OS本地内存,不属于GC管辖范围,由于不需要内存拷贝所以速度相对较快。

我们肯定想选择比较快的,但问题是直接内存不属于GC管辖范围,需要弄清楚这部分内存如何管理,否则造成内存泄露就麻烦了。本地内存在JAVA中有一个对应的包装类DirectByteBuffer,该类属于Java类,适当的时候会被GC回收,当它被回收前会调用本地方法把直接内存给释放了,所以本地内存可以随DirectByteBuffer对象被回收而自动回收,貌似没有问题;但如果不断分配本地内存,堆内存很少使用,那么JVM就不需要执行GC,DirectByteBuffer对象们就不会被回收,这时候堆内存充足,但本地内存可能已经使用光了,再次尝试分配本地内存就会出现OutOfMemoryError,那程序就直接崩溃了。

有没有解决方案?自动释放不靠谱,我们是否可以手动释放本地内存,把握主动权?果然DirectByteBuffer持有一个Cleaner对象,该对象有一个clean()方法可用于释放本地内存,所以需要的时候我们可以调用这个方法手动释放本地内存。

以下代码与测试场景帮助理解与证实以上描述。

代码1:

package com.stevex.app.nio;import java.nio.ByteBuffer;
import java.util.concurrent.TimeUnit;public class DirectByteBufferTest {public static void main(String[] args) throws InterruptedException{//分配128MB直接内存ByteBuffer bb = ByteBuffer.allocateDirect(1024*1024*128);TimeUnit.SECONDS.sleep(10);System.out.println("ok");}}

测试用例1:设置JVM参数-Xmx100m,运行异常,因为如果没设置-XX:MaxDirectMemorySize,则默认与-Xmx参数值相同,分配128M直接内存超出限制范围。

Exception in thread "main" java.lang.OutOfMemoryError: Direct buffer memoryat java.nio.Bits.reserveMemory(Bits.java:658)at java.nio.DirectByteBuffer.<init>(DirectByteBuffer.java:123)at java.nio.ByteBuffer.allocateDirect(ByteBuffer.java:306)at com.stevex.app.nio.DirectByteBufferTest.main(DirectByteBufferTest.java:8)

测试用例2:设置JVM参数-Xmx256m,运行正常,因为128M小于256M,属于范围内分配。

ok

测试用例3:设置JVM参数-Xmx256m -XX:MaxDirectMemorySize=100M,运行异常,分配的直接内存128M超过限定的100M。

Exception in thread "main" java.lang.OutOfMemoryError: Direct buffer memoryat java.nio.Bits.reserveMemory(Bits.java:658)at java.nio.DirectByteBuffer.<init>(DirectByteBuffer.java:123)at java.nio.ByteBuffer.allocateDirect(ByteBuffer.java:306)at com.stevex.app.nio.DirectByteBufferTest.main(DirectByteBufferTest.java:8)

代码2:

package com.stevex.app.nio;import java.nio.ByteBuffer;
import java.util.concurrent.TimeUnit;
import sun.nio.ch.DirectBuffer;public class DirectByteBufferTest {public static void main(String[] args) throws InterruptedException{//分配512MB直接缓存ByteBuffer bb = ByteBuffer.allocateDirect(1024*1024*512);TimeUnit.SECONDS.sleep(10);//清除直接缓存((DirectBuffer)bb).cleaner().clean();TimeUnit.SECONDS.sleep(10);System.out.println("ok");}}

测试用例4:设置JVM参数-Xmx768m,运行程序观察内存使用变化,会发现clean()后内存马上下降,说明使用clean()方法能有效及时回收直接缓存。

转载于:https://blog.51cto.com/stevex/1582209

JAVA NIO 内存泄露相关推荐

  1. java 代码 内存泄露_如何用Java编写一段代码引发内存泄露

    Q:刚才我参加了面试,面试官问我如何写出会发生内存泄露的Java代码.这个问题我一点思路都没有,好囧. A1:通过以下步骤可以很容易产生内存泄露(程序代码不能访问到某些对象,但是它们仍然保存在内存中) ...

  2. java 解决内存泄露_Java内存泄露的理解与解决

    Java内存管理机制 在C++语言中,如果需要动态分配一块内存,程序员需要负责这块内存的整个生命周期.从申请分配.到使用.再到最后的释放.这样的过程非常灵活,但是却十分繁琐,程序员很容易由于疏忽而忘记 ...

  3. 记一次 JAVA 的内存泄露分析

    记一次 JAVA 的内存泄露分析 摘要:本文属于原创,欢迎转载,转载请保留出处:https://github.com/jasonGeng88/blog 当前环境 jdk == 1.8 httpasyn ...

  4. Java NIO内存映射文件

    Java NIO 内存映射文件 文件操作的四大方法 效率对比 内存映射文件 缓冲区 缓冲区的获得: 文件加锁机制 文件锁使用注意点: 文件操作的四大方法 前提:内存的访问速度比磁盘高几个数量级,但是基 ...

  5. java查看内存泄露_Java内存泄露如何排查

    Java内存泄露是常常出现的问题,Java攀登网进行了该问题的整理,具体的如下所示: 1.2 内存泄露Memory Leak,是指程序在申请内存后,无法释放已申请的内存空间,一次内 存泄露危害可以忽略 ...

  6. java io内存泄露_java内存泄露和OutOfMemory

    1.内存泄露: Java的内存泄漏是指某些对象不再被应用程序使用,而垃圾收集器(Garbage Collector)却没能识别它们是"不再使用的",所以没有对这些对象进行回收,或者 ...

  7. java thread 内存泄露_Java ThreadLocal 内存泄露问题分析及解决方法。

    前言 在分析ThreadLocal导致的内存泄露前,需要普及了解一下内存泄露.强引用与弱引用以及GC回收机制,这样才能更好的分析为什么ThreadLocal会导致内存泄露呢?更重要的是知道该如何避免这 ...

  8. java thread 内存泄露_记一次ThreadLocal引发的内存泄露

    概念 ​首先解释下内存溢出和内存泄露的概念.内存溢出一般指的是out of memory,也就是我们经常说的OOM,常发生在堆,方法区和方法栈.内存泄露指的是一段程序在申请内存空间后,无法释放已经申请 ...

  9. java没错泄露_记一次尴尬的Java应用内存泄露排查

    这星期被线上JVM内存占用不断增大的问题所困扰,自己提出了一些假设,然后去实施验证都一一失败了,有一些经验和教训在这里分享下. 之所以是尴尬,是最后因为修复了另一个看似不相关的问题导致内存不再上升,但 ...

最新文章

  1. 异步fifo的设计(FPGA)
  2. 从Android的结构看HarmonyOS
  3. SpringMVC框架 学习DAY_01:框架概括 / 简易应用 / 核心执行流程图 /在框架下显示HTML模板页面/ 接受请求
  4. 帝国cms内部会员组的使用方法以及应用场景
  5. template模板中插入自定义参数
  6. 音视频技术开发周刊 60期
  7. 欢乐纪中A组赛【2019.8.18】
  8. android 拼图课程设计,拼图游戏设计_课程设计报告.docx
  9. 95-855-040-源码-调度-Flink Schedule Mode 调度模式
  10. Iocomp Crack和ProEssentials Crack
  11. 实践 | 打印机扫描文件到电脑
  12. vim 退格键(backspace)不能用
  13. 阿里云总监课,存储系统设计——NVMe SSD性能影响因素一探究竟
  14. 宝塔搭建TY博客附好看模板
  15. 数字集成电路与系统设计
  16. 智能优化算法——哈里斯鹰算法(Matlab代码实现)
  17. 【成都云计算培训机构哪家好?】
  18. WebAssembly中级——网络连接websocket
  19. 中国移动董事长杨杰:明确新发展航向!(附PPT)
  20. 职场晋升岗位PPT模板-优页文档

热门文章

  1. 【科普】AI的分类与演进
  2. “新视野”和“最远点”的约会
  3. DeepMind集成AI智能体架构「MERLIN」:基于目标导向智能体中的无监督预测记忆
  4. 30亿美金投入!一文读懂英伟达性能凶残的Tesla V100牛在哪?
  5. CCF大数据专家委:2018年大数据发展趋势预测
  6. 库克:苹果收取 30% 佣金很合理!
  7. 一场由FPGA触发的芯片战争
  8. Fundebug后端Java异常监控插件更新至0.2.0,支持Spring及Maven
  9. 元组Tuple、数组Array、映射Map
  10. 数据流图和数据字典 (笔记 )