博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
NIO DirectByteBuffer 内存泄露的测试
阅读量:6809 次
发布时间:2019-06-26

本文共 918 字,大约阅读时间需要 3 分钟。

      写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:设置JVM参数-Xmx100m,运行异常,因为如果没设置-XX:MaxDirectMemorySize,则默认与-Xmx参数值相同,分配128M直接内存超出限制范围。

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

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

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

转载地址:http://cyhwl.baihongyu.com/

你可能感兴趣的文章
python字符串
查看>>
python所遇到的坑
查看>>
++i && i++
查看>>
Linux入门——文本处理三剑客之gnu awk
查看>>
CAS单点登录(SSO)
查看>>
关于Excel导入SQLServer的说明
查看>>
关系型数据库
查看>>
HDU 2685 I won't tell you this is about number theory
查看>>
华为三层交换机-路由-硬件防火墙的配置
查看>>
模型分离(选做)
查看>>
利用jira-python及selenium完成jira的统计报表及日报的填写
查看>>
事件绑定完整版2016/4/21
查看>>
Devextreme 与 Angular6 兼容问题解决
查看>>
JS基础
查看>>
【转载】利用向量积(叉积)计算三角形的面积和多边形的面积
查看>>
CentOS 7安装Mysql并设置开机自启动
查看>>
1491: [NOI2007]社交网络
查看>>
编译安装nginx,并使用systemd管理nginx
查看>>
红和绿
查看>>
IE 兼容性写法
查看>>