`
zhoushijun
  • 浏览: 267758 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

JDK 6u32前的版本 Direct ByteBuffer 的bug

阅读更多

Oracle JDK 6u32前的版本不会。

Direct ByteBuffer是在Java Heap外分配内存,NIO等东西里使用的比较多,但Direct ByteBuffer分配出去的内存其实也是由GC负责回收的,而不像之前一篇文章里的Unsafe是完全自行管理的,Hotspot在GC时会扫描Direct ByteBuffer对象是否有引用,如没有则同时也会回收其占用的堆外内存,但不幸的是在6u32前的版本里,CMS GC有bug会导致可能回收不掉,具体的bug id为 7112034,http://bugs.sun.com/view_bug.do?bug_id=7112034 ,在链接的Backport信息里,可以看到这个bug是在hotspot 20.7的版本里修复的(hotspot的版本号通过java -version的最后一行Java Hotspot Version之类的可以看到),6u32带的就是这个版本,所以6u32是会回收的。

回收不掉的情况下会造成的问题是明明已经不用了,但堆外内存仍然被消耗掉,悲惨的情况下可能会导致堆外内存耗光。

Direct ByteBuffer除了上面这个bug可能造成堆外内存耗光外,还有一种场景也可能会造成堆外内存耗光,如Direct ByteBuffer对象晋升到了Old区,那这个时候就只能等Full GC触发(CMS GC的情况下等CMS GC),因此在Direct ByteBuffer使用较多,存活时间较长的情况下,有可能会导致堆外内存耗光(因为Direct ByteBuffer本身对象所占用的空间是很小的)。

对于上面这种类型的应用,最好是在启动参数上增加-XX:MaxDirectMemorySize=x[m|g],例如-XX:MaxDirectMemorySize=500m

这个参数默认的大小是-Xmx的值(在没设置MaxDirectMemorySize参数的情况下,用jinfo -flag等方式会看到默认值是-1,但VM.maxDirectMemory这个方法里发现是-1,则会以-Xmx作为默认值),此参数的含义是当Direct ByteBuffer分配的堆外内存到达指定大小后,即触发Full GC(这段逻辑请见Bits.reserveMemory的代码),如Full GC后仍然分配不出Direct ByteBuffer需要的空间,则会报OOM错误:
java.lang.OutOfMemoryError: Direct buffer memory

因为上面所说的状况,如碰到堆外内存占用较多的场景,可以尝试强制执行Full GC(强制的方法为执行jmap -histo:live)看看,多执行一两次,如堆外内存下降的话,很有可能就是Direct ByteBuffer造成的,对于这种情况,通常加上上面的启动参数就可解决。

很多情况下,我们会看到Java进程占用的内存超过-Xmx的大小,原因就是类似Direct ByteBuffer、Unsafe、GC、编译、自己写的JNI模块等这些是需要占用堆外空间的。

 

分享到:
评论

相关推荐

    jdk版本6u27 solaris

    jdk 6u27 solaris 版本,jdk 6 最新

    JDK6,32位版本

    windonws 32位JDK6版本,jdk-6u29-windows-i586.exe windonws 32位JDK6版本,jdk-6u29-windows-i586.exe

    jdk6u45JDK6u45

    JDK6u45JDK6u45JDK6u45JDK6u45JDK6u45JDK6u45JDK6u45JDK6u45JDK6u45

    Linux版本jdk8u-211 对应jdk1.8.0_211版本

    Linux版本jdk8u-211 对应jdk1.8.9_211版本

    JDK8 U241版本 Windows版

    jdk-8u241-windows-x64.exe,windows版jdk。目前1.8的最新版本。由于220m上传限制,这里提供百度云下载文档。或者点击链接进去QQ群下载。QQ群地址 https://jq.qq.com/?_wv=1027&k=5dZTsqZ

    jdk-8u131-windows-x32下载【官方纯净版】

    jdk-8u131-windows-x32下载 - 官方纯净版【带环境变量...jdk-8u131-windows-x32 ,windows 版本32位,下载后双击.exe即可懒人安装,一直下一步即可,。 =========亲试可用^_^==========,在此下载比官网速度快不止10倍

    jdk6 windows 32位.rar

    jdk-6u39-windows-x32.exe 官方需要登录才下载,上传供大家使用

    jdk api-ServerSocketChannel、Selector、ByteBuffer结合实现网络报文间的通讯

    jdk api-ServerSocketChannel、Selector、ByteBuffer结合实现网络报文间的通讯

    jdk1.8包含linux版本,window版本,mac版本 具体版本:jdk-8u351

    jdk1.8包含linux版本(jdk-8u351-linux-x64.tar.gz),window版本(jdk-8u351-windows-x64.exe),mac版本(jdk-8u351-macosx-x64.dmg)。

    JDK8u181版本-window32+windows64+MacOS+Linux64组合包

    JDK8u181版本-window32+windows64+MacOS+Linux64组合包 其他操作系统版本请访问下面的页面: https://download.csdn.net/download/jeffgxy/18233105

    jdk-6u21-windows-x64

    jdk-6u21-windows-x64 jdk-6u21-windows-x64 jdk-6u21-windows-x64 jdk-6u21-windows-x64 jdk-6u21-windows-x64 jdk-6u21-windows-x64 jdk-6u21-windows-x64 jdk-6u21-windows-x64 jdk-6u21-windows-x64 jdk-6u21-...

    jdk-8u131-macosx-x64

    jdk-8u131-macosx-x64jdk-8u131-macosx-x64jdk-8u131-macosx-x64jdk-8u131-macosx-x64jdk-8u131-macosx-x64jdk-8u131-macosx-x64jdk-8u131-macosx-x64jdk-8u131-macosx-x64jdk-8u131-macosx-x64jdk-8u131-macosx-x64...

    jdk-6u39-windows-i586

    jdk-6u39-windows-i586,jdk-6u39-windows-i586,jdk-6u39-windows-i586,jdk-6u39-windows-i586,jdk-6u39-windows-i586,jdk-6u39-windows-i586,jdk-6u39-windows-i586,jdk-6u39-windows-i586,jdk-6u39-windows...

    jdk1.7 32位官方正式版 jdk-7u79-windows-i586 下载

    jdk-7u79-windows-i586.exe JDK7 稳定版 源官方下载地址: http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads-1880260.html

    jdk-6u32-linux-x64.part2

    jdk-6u32-linux-x64.part2.rar这是安装文件的第二部分,搜索下载jdk-6u32-linux-x64.part1.rar和jdk-6u32-linux-x64.part2.rar放到WINDOWS系统的同一个目录,用winrar解压会自动变成一个安装文件。创建/usr/java ,...

    jdk7 32位最新版本,官网下载

    jdk7 32位最新版本,官网下载jdk7 32位最新版本,官网下载jdk7 32位最新版本,官网下载jdk7 32位最新版本,官网下载jdk7 32位最新版本,官网下载jdk7 32位最新版本,官网下载

    jdk-8u131-windows-x64

    jdk-8u131-windows-x64jdk-8u131-windows-x64jdk-8u131-windows-x64jdk-8u131-windows-x64jdk-8u131-windows-x64jdk-8u131-windows-x64jdk-8u131-windows-x64jdk-8u131-windows-x64jdk-8u131-windows-x64jdk-8u131-...

    java-jdk1.8-8u361-all-jdk-win-linux

    该压缩包中包含jdk1.8-8u361下windows版本和linux版本,其包含快速安装包和对应的jdk压缩包版本,具体内容如下: jdk-8u361-linux-aarch64.rpm jdk-8u361-linux-i586.rpm jdk-8u361-linux-i586.tar.gz jdk-8u361-...

    jdk-8u191-windows-x64.exe,jdk最后一个免费版本

    jdk-8u191-windows-x64.exe,jdk最后一个免费版本,windows版本

    jdk-8u201 windows和linux版本

    内容概要:文件【jdk-8u201 windows和linux版本】解压后内含jdk-8u201-linux-x64.tar.gz、jdk-8u201-windows-x64.exe两个版本的安装包,可以在windows和linux环境进行jdk环境搭建 适合人群:常规Java开发人员以及...

Global site tag (gtag.js) - Google Analytics