博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java.lang.OutOfMemoryError:Direct buffer memory 分析
阅读量:4045 次
发布时间:2019-05-24

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

java.lang.OutOfMemoryError:Direct buffer memory

导致原因:

     写NIO程序经常使用ByteBuffer来读取或者写入数据,这是一种基于通道(Channel)与缓冲区(Buffer)的I/O方式,它可以使用Native函数库直接分配堆外内存,然后通过一个存储在Java堆里面的DirectByteBuffer对象作为这块内存的引用进行操作。这样能在一些场景中显著提高性能,因为避免了在java堆和Native堆中来回复制数据。
     ByteBuffer.allocate(capability)第一种方式是分配JVM堆内存,属于GC管辖范围,由于需要拷贝所以速度相对较慢。
     ByteBuffer.allocateDirect(capability)第一种方式是分配OS本地内存,不属于GC管辖范围,由于不需要内存拷贝,所以速度相对较快。
      但如果不断分配内存,堆内存很少使用,那么JVM就不需要执行GC,DirectByteBuffer对象们就不会被回收,这时候堆内存充足,但本地内存可能已经使用光了,再次尝试分配本地内存就会出现OutOfMemoryError,那程序就直接崩溃了。

/** * Exception in thread "main" java.lang.OutOfMemoryError: Direct buffer memory * * JVM 配置参数 * -Xms10m -Xmx10m -XX:+PrintGCDetails -XX:MaxDirectMemorySize=5m * MaxDirectMemorySize 默认为 1/4 PC内存 * * 导致原因: * 写NIO程序经常使用ByteBuffer来读取或者写入数据,这是一种基于通道(Channel)与缓冲区(Buffer)的I/O方式, * 它可以使用Native函数库直接分配堆外内存,然后通过一个存储在Java堆里面的DirectByteBuffer对象作为这块内存的引用进行操作。 * 这样能在一些场景中显著提高性能,因为避免了在java堆和Native堆中来回复制数据。 * * ByteBuffer.allocate(capability)第一种方式是分配JVM堆内存,属于GC管辖范围,由于需要拷贝所以速度相对较慢。 * * ByteBuffer.allocateDirect(capability)第2种方式是分配OS本地内存,不属于GC管辖范围,由于不需要内存拷贝,所以速度相对较快。 * * 但如果不断分配内存,堆内存很少使用,那么JVM就不需要执行GC,DirectByteBuffer对象们就不会被回收, * 这时候堆内存充足,但本地内存可能已经使用光了,再次尝试分配本地内存就会出现OutOfMemoryError,那程序就直接崩溃了。 */public class DirectBufferMemoryDemo {    public static void main(String[] args) {        System.out.println("配置的maxDirectMemory:"+(sun.misc.VM.maxDirectMemory()/(double)1024/1024)+"MB");        try {            TimeUnit.SECONDS.sleep(3);        } catch (InterruptedException e) {            e.printStackTrace();        }        //-XX:MaxDirectMemorySize=5m 配置为 5m 实际使用为 6m        ByteBuffer bb = ByteBuffer.allocateDirect(6*1024*1024);    }}

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

你可能感兴趣的文章
理解Node.js中间件以及Connect 模块
查看>>
Nodejs基础中间件Connect
查看>>
Http头介绍:Expires,Cache-Control,Last-Modified,ETag
查看>>
Nginx+Tomcat实现负载均衡、Redis实现Tomcat session会话共享
查看>>
MySQL集群
查看>>
mongodb mongoexprt 导出数据 json csv格式
查看>>
MySQL MERGE存储引擎 简
查看>>
数据库分片(Sharding)与分区(Partition)的区别
查看>>
node.js递归打印文件目录、文件名
查看>>
本地与远程linux上传下载
查看>>
NodeJS的代码调试和性能调优
查看>>
浅谈V8引擎中的垃圾回收机制
查看>>
引擎V8及优化技术
查看>>
Node.js domain异常捕获的一些实践
查看>>
mac下修改环境变量
查看>>
JVM性能调优
查看>>
JVM调优总结
查看>>
Redis与Memcached的区别
查看>>
WebSocket(1)-- WebSocket API简介
查看>>
WebSocket(2)--为什么引入WebSocket协议
查看>>