JAVA NIO内存泄漏
时间:2022-05-10
本文章向大家介绍JAVA NIO内存泄漏,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
前言
写NIO程序时,经常使用ByteBuffer来读取写入数据,那使用ByteBuffer.allocate()还是ByteBuffer.allocateDirect分配呢?
- allocate()分配的是jvm堆内存,属于GC管理范畴,需要堆内拷贝,速度较慢。
- allocateDireact()直接分配堆外内存,属于OS范畴,没有GC管理,速度较快。
我们希望使用速度更快的方式,但是没有GC管理会产生OOM的问题。
好在OS内存在java中有个DirectByteBuffer与之对应,当GC发生时,这个类会被回收,对应的OS内存会被回收,这样就满足了我们的想法。 但是如果堆内一直够用,不触发GC,DirectByteBuffer不进行GC呢?对应的OS内存也不会回收。
既然自动GC方式不靠谱,好在DirectByteBuffer里面有个Cleaner对象,里面有个clean()方法,通过这个方法我们可以通过手动方式释放了。
测试
- 分配-Xmx=100m,没有设置-XX:MaxDirectMemorySize,默认大小和-Xmx大小相同 //分配128MB直接内存 ByteBuffer bb = ByteBuffer.allocateDirect(10241024128);
产生OOM;
- 设置JVM参数-Xmx256m -XX:MaxDirectMemorySize=100M
同样的代码产生OOM;
- 手动释放
public static void main(String[] args) throws InterruptedException{ //分配512MB直接缓存 ByteBuffer bb = ByteBuffer.allocateDirect(10241024512);
TimeUnit.SECONDS.sleep(10);
//清除直接缓存
((DirectBuffer)bb).cleaner().clean();
TimeUnit.SECONDS.sleep(10);
System.out.println("ok");
}
之后通过观察内存使用变化,发现从之前一直升高,到调用clean()之后,内存降下来,说明clean()方法生效了。
- java一些常用并发工具示例
- 机器人来“抢工作”了,瑞典人为何能淡定处之
- 线性代数01 线性的大脑
- spring cloud 学习(10) - 利用springfox集成swagger
- Hadoop(六)之HDFS的存储原理(运行原理)
- Blockchain Global CEO Sam Lee:以大数据为基础,区块链技术加快决策生成速度
- Hadoop(五)搭建Hadoop客户端与Java访问HDFS集群
- 被解放的姜戈08 远走高飞
- mxnet安装及NDArray初体验
- MySQL(十五)之数据备份中mysqldump详解
- 安卓第十夜 亚当的诞生
- MySQL(十四)之数据备份与还原
- MySQL(十三)之MySQL事务
- 安卓第三夜 概念漫游(上)
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- 聊聊 Python 代码覆盖率工具 - Coverage
- 目标检测模型YOLO-V1损失函数详解
- 轻松学Pytorch-使用ResNet50实现图像分类
- IDEA奇淫小技巧
- [PHP框架] ThinkPHP6 介绍、安装及配置
- 【翻译】withoutboats 的 io-uring 笔记
- [Python]随机生成大量的虚拟信息测试数据(姓名,手机号,ID,家庭住址等)
- Java核心技术之动态代理
- 开源verilog仿真工具iverilog+GTKWave初体验
- [算法] 数组排序 - 冒泡排序法与直接选择排序法
- TS 设计模式01 - 工厂模式
- Spring与Mybatis的整合
- Python中的计数 - Counter类
- vue 记账本
- c/c++补完计划(三): 素数统计