`
zhoushijun
  • 浏览: 270359 次
  • 性别: 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模块等这些是需要占用堆外空间的。

 

分享到:
评论

相关推荐

    jdk6 windows 32位.rar

    标题中的"jdk6 windows 32位.rar"指的是JDK 6的32位版本,适用于Windows操作系统。这个版本的JDK是专门为在32位Windows系统上运行和开发Java程序设计的。 JDK 6,全称Java SE(Standard Edition)6,是Java平台的一...

    JDK6,32位版本

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

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

    Linux版本的JDK8u-211是Java Development Kit的一个特定版本,它针对Linux操作系统进行了优化和适配。这个版本对应的是JDK1.8.0_211,这意味着它是Java 8的主要更新之一,其中“u”代表“update”,数字211则表示该...

    jdk-8u211 32位 64位 官方版本 windows 集合版

    本文将详细解析"jdk-8u211 32位 64位 官方版本 windows 集合版"的相关知识点。 首先,JDK 8u211 是Java 8的更新版本,"u211"表示更新211,这是对Java 8的一个特定修补程序集,包含了安全性修复、性能优化和其他改进...

    jdk6u45JDK6u45

    Java Development Kit (JDK) 6 Update 45(简称JDK6u45)是Oracle公司发布的Java编程环境的一个重要版本,专为开发者提供在Windows操作系统上进行32位开发的支持。这个版本是JDK 6的32位Windows平台上的最后一个维护...

    jdk-6u45-linux-x64.zip_jdk-1.6u45_jdk-6u45_jdk-6u45-linux-x64_jd

    这个压缩包文件"jdk-6u45-linux-x64.zip"包含的是JDK 1.6.0_45(也被称为6u45或1.6u45)的64位Linux版本。JDK 1.6是Java平台标准版的一个重要版本,它提供了许多功能和性能改进,是许多企业级应用的基础。 JDK 1.6u...

    jdk-8u25、jdk-8u111、jdk-8u131、jdk-8u181、jdk-8u201

    标题和描述中提到的"jdk-8u25、jdk-8u111、jdk-8u131、jdk-8u181、jdk-8u201"代表了不同版本的JDK,这些版本都是针对Java 8的更新版本,"u"后面的数字代表更新(Update)次数。 Java 8是Oracle公司发布的Java平台...

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

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

    JDK-1.6u45-Windows 32位

    JDK 1.6u45-Windows 32位是Java Development Kit的一个特定版本,由Oracle公司发布,适用于32位Windows操作系统。这个版本是JDK 1.6系列中的更新45,通常称为Java 6 Update 45。在Java开发和运行环境中,JDK扮演着至...

    JDK1.8u162 Windows64位版本

    **JDK 1.8u162 Windows 64位版本详解** JDK(Java Development Kit)是Oracle公司发布的Java编程语言的开发环境,它包含了一组工具和API,用于编写、编译、测试以及部署Java应用程序。JDK 1.8u162是JDK 8的一个更新...

    jdk8-32位版本下载.zip

    这个“jdk8-32位版本下载.zip”压缩包包含了适用于32位操作系统的JDK8版本。在本文中,我们将深入探讨JDK8的关键特性、安装过程以及它在32位系统中的应用。 JDK8是Oracle公司发布的Java平台标准版(Java SE)的一个...

    JDK-6u21-Windows版

    - **下载**:提供的`jdk-6u21-windows-i586.exe`是适用于32位Windows系统的安装程序,它将引导用户完成整个安装过程。 - **安装过程**:运行安装程序,按照提示设置安装路径,接受许可协议,然后选择要安装的组件...

    JDK8 U241版本 Windows版

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

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

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

    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-...

    JDK1.8u162 Windows32位版本

    **JDK 1.8u162 Windows 32位**是Java开发工具包的一个特定版本,适用于在Windows操作系统32位环境下运行和开发Java应用程序。这个版本的JDK,全称为Java Development Kit,是Oracle公司提供的核心Java开发工具,包含...

    jdk1.8u144 官方版本windows

    JDK8.0是Java虚拟机的最新版本,加入了很多新的特性。Oracle甲骨文公司Oracle公司如期发布了Java 8正式版!现在你就可以下载Java 8正式版了,同期发布的还有JDK 8。JDK8的特性已经基本准备就绪,虽然一些特性还不是...

    linux 32位的jdk8,版本:jdk-8u221-linux-i586.rpm

    使用ftp工具将jdk-8u191-linux-i586.rpm传至linux系统,移动到/usr/local下,chmod 755 jdk-8u191-linux-i586.rpm 赋权,使用rpm -ivh jdk-8u191-linux-i586.rpm安装配置环境变量,vi /etc/profile,在末尾(就是最...

    32位1.8版本的JDK

    《32位1.8版本JDK详解》 32位1.8版本的Java Development Kit(JDK)是Oracle公司推出的一个针对32位操作系统的重要软件开发工具,主要用于Java程序的开发和运行。这个版本的JDK在Java社区中具有广泛的应用,因为它...

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

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

Global site tag (gtag.js) - Google Analytics