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()方法,通过这个方法我们可以通过手动方式释放了。

测试

  1. 分配-Xmx=100m,没有设置-XX:MaxDirectMemorySize,默认大小和-Xmx大小相同 //分配128MB直接内存 ByteBuffer bb = ByteBuffer.allocateDirect(10241024128);

产生OOM;

  1. 设置JVM参数-Xmx256m -XX:MaxDirectMemorySize=100M

同样的代码产生OOM;

  1. 手动释放

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()方法生效了。

原文发布于微信公众号 - 服务端技术杂谈(ITIBB2014)

原文发表时间:2018-04-13

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏技术博客

Asp.Net Web API 2第十一课——在Web API中使用Dependency Resolver

阅读本文之前,您也可以到Asp.Net Web API 2 系列导航进行查看 http://www.cnblogs.com/aehyok/p/3446289.h...

1084
来自专栏Elson's web

从webpack4打包文件说起

一堆的webpack配置教程看腻了?这里有webpack4的打包及加载机制,要不了解一下?而这一切就得从打包文件说起。

3606
来自专栏Java编程技术

使用数据库悲观锁实现不可重入的分布式锁

在同一个jvm进程中时,可以使用JUC提供的一些锁来解决多个线程竞争同一个共享资源时候的线程安全问题,但是当多个不同机器上的不同jvm进程共同竞争同一个共享资源...

751
来自专栏雨尘分享

2018 - iOS 面试题汇总一般面试题BAT面试题

4.2K3
来自专栏JAVA烂猪皮

JVM难学?那是因为你没认真看完这篇文章

JAVA程序运行与虚拟机之上,运行时需要内存空间。虚拟机执行JAVA程序的过程中会把它管理的内存划分为不同的数据区域方便管理。

1044
来自专栏java 成神之路

RocketMQ 底层通信机制 源码分析

RocketMQ 底层通讯是使用Netty来实现的。 下面我们通过源码分析下RocketMQ是怎么利用Netty进行通讯的。

1522
来自专栏Java编程技术

基于Java注解和模块化生成树形业务文档的实践

一个新人快速掌握一个新系统业务逻辑的最好的工具是什么,是看代码?是debug?是看uc?是看demo?答案应该都不是,因为看代码和debug一来太耗时,二来系统...

1151
来自专栏从零开始学自动化测试

python笔记9-多线程Threading之阻塞(join)和守护线程(setDaemon)

前言 今天小编YOYO请xiaoming和xiaowang吃火锅,吃完火锅的时候会有以下三种场景: - 场景一:小编(主)先吃完了,xiaoming(客)和xi...

3746
来自专栏分布式系统进阶

Influxdb的Meta data分析

Influxdb定义了一个Service:Precreator Serivec(services/precreator/service.go),实现比较简单,周...

1272
来自专栏JavaEdge

Java并发编程实战系列13之显式锁 (Explicit Locks)

Java5之前只能用synchronized和volatile,5后Doug Lea加入了ReentrantLock,并不是替代内置锁,而是当内置锁机制不适用时...

4927

扫码关注云+社区

领取腾讯云代金券