`
yuanc00
  • 浏览: 29926 次
社区版块
存档分类
最新评论

GC问题记录 – DirectByteBuffer

    博客分类:
  • java
 
阅读更多

GC问题记录 – DirectByteBuffer


        我们的一个系统在之前的运行中发现一个问题,系统内存的占用非常高,但是通过dump JVM内存,发现java的堆内存的使用是正常的。
        经过一系列排查,发现问题主要在DirectByteBuffer的使用上面。


        1.    系统使用Netty进行服务器之间的通信,而NIO使用的DirectByteBuffer,其申请的native memory只有在old gen GC(full GC/major GC或者concurrent GC)时才可以回收。主要原理是Full GC的会对old gen做reference processing,进而可以触发Cleaner对已死的DirectByteBuffer对象做清理工作;而如果很长一段时间没做过GC或者只做了young GC,则不会在old gen触发Cleaner的工作,那么就可能让本来已经死了的、但已经晋升到old gen的DirectByteBuffer关联的native memory得不到及时释放;
        2.    为DirectByteBuffer分配空间的过程中,会通过System.gc()的显示调用强迫已经无用的DirectByteBuffer对象释放掉他们关联的native memory;但是如果系统在运行的时候,设置了JVM参数:-XX:DisableExplicitGC,那么System.gc()的显示调用将变成空调用;
        3.    此时只有自然触发old gen GC进行内存回收,或者等待native memory占用达到了设置的MaxDirectMemorySize之后,出现内存溢出;
        4.    另外,如果不使用-XX:MaxDirectMemorySize={size}进行设置,MaxDirectMemorySize其值将默认为JVM可以使用最大对内存(-Xmx)减去一个Survivor space的值。


        事实上,如果直接设置了-XX:DisableExplicitGC,并且系统运行情况良好(长时间不会出现FullGC),并且大量使用了NIO的native memory,这样将很有可能导致native memory无法及时回收,最终出现内存溢出的情况“java.lang.OutOfMemoryError: Direct buffer memory”。


        在这里,我们问题是,系统的应用内存占用量很大,而实际的堆内存占比非常小,影响到了系统的运行。
        调优方法相应的有两种:
        1.    调整-Xmx的大小;我们可以把应用的最大内存设置小一些,这样尽可能快地使native memory达到MaxDirectMemorySize的上限,进行回收。这样的话,其实应用的内存使用受到了限制,除非应用本身对于内存的使用不敏感,这样才是可行的;否则反而会浪费内存。
        2.    显式设置MaxDirectMemorySize。我们可以直接把native memory设置小一些;让native memory的回收尽可能地快。


        我们这里使用的是方案1。因为系统的特点:本身应用使用量很小,但是会通过调度运行一些任务(JOB);这些任务对内存的需求还是比较多的。所以不存在内存浪费的问题,设置-Xmx小一些,反而可以节省出来一部分的内存资源给需要调度的JOB。
        结合本次问题排查的经验,我们在排查问题的时候,需要尽可能地结合应用本身的特点,找到一些合适的解决方案。

参考资料:
http://hllvm.group.iteye.com/group/topic/28866
http://hllvm.group.iteye.com/group/topic/27945

分享到:
评论

相关推荐

    gcviewer监控gc工具

    1. **获取GC日志**:首先,确保JVM开启GC日志记录,可以通过JVM参数`-XX:+PrintGCDetails -XX:+PrintGCDateStamps`来设置。 2. **下载GCViewer**:从官方网站或GitHub仓库获取GCViewer的源码或已编译的二进制文件。 ...

    GC2053_1,2.9"GC2053sensor_格科微_GC2053_gc2053datasheet_galaxycore_

    首先,GC2053传感器的核心规格是其1/2.9"的尺寸,这意味着它拥有相对较小的物理尺寸,这使得它在移动设备、监控摄像头、行车记录仪等领域具有广泛应用。1/2.9"的大小不仅节省了空间,还降低了设备的整体重量,提高了...

    SENSOR_GC1054.rar_1054-sensor_SENSOR_GC1054_gc1054

    标题中的"SENSOR_GC1054.rar_1054-sensor_SENSOR_GC1054_gc1054"暗示了我们正在处理一种名为GC1054的传感器,这可能是一款专用于图像处理的传感器。在IT行业中,这类传感器通常被应用于摄像头设备、机器视觉系统或...

    MT65xx_GC032A_Driver_20170614_GC032A_GC032A_Drive

    GC032A是一款常见的图像传感器,广泛应用于手机、监控摄像头、行车记录仪等设备中。它提供了高分辨率的图像捕捉能力,能够捕捉清晰、细腻的影像。驱动程序作为连接硬件和操作系统之间的桥梁,其性能直接影响到GC032A...

    GC6153_SERIAL_GC6153

    标题 "GC6153_SERIAL_GC6153" 指向的是一款基于MTK(MediaTek)平台的驱动程序,专为控制SPI接口的GC6153芯片而设计。这款驱动程序的主要功能是确保GC6153芯片在系统中能够正确地被初始化、配置和操作,从而实现其...

    RGW 的GC深入解析与调优

    需要注意的是每个 gc 的记录会生成两种类型的索引记录,0 开头的以名称为标识和 1 开头以时间戳为标识,最终插入到 gc Object 所在 OSD 的 omap 的 LevelDB 记录中。 GC 流程概览图: 最后一张图来总结整个 GC 的...

    MT6261_GC6153_Driver_V0_格科微gc61538w_GC6153_格科微_格科微GC6153@_mt6261

    《MT6261_GC6153_Driver_V0:格科微GC6153模组驱动解析》 在电子技术领域,驱动程序扮演着至关重要的角色,它是硬件设备与操作系统之间的桥梁,使得软件能够有效控制硬件设备。本文将深入探讨"MT6261_GC6153_Driver...

    gc02m1 datasheet

    GC02M1 datasheet GC02M1是一款CMOS图像传感器,具有高分辨率、低噪声和高灵敏度等特点。下面是根据GC02M1 datasheet的内容生成的相关知识点: 1. 传感器概述 GC02M1是一款1/5英寸的CMOS图像传感器,具有200万像素...

    gc4023 datasheet

    GC4023 CMOS图像传感器数据手册 GC4023是一款高性能的CMOS图像传感器,用于capturing高质量图像。该传感器具有1/2.7英寸的感光面积、4Mega像素的高分辨率和低噪音的特点。该传感器的datasheet提供了详细的技术规格...

    GCViewer-FullGC分析工具

    GCViewer会详细记录每次Full GC的开始、结束时间以及消耗的时间,这对于识别和优化潜在的性能瓶颈至关重要。 4. **事件时间线**:GCViewer提供了一个时间线视图,显示了所有GC事件的发生顺序,帮助开发者理解GC活动...

    GC5025.tar.gz_RK camera_camera_gc5025 RK3368_gc5025驱动_rk摄像头驱动

    5. **优化和调试**:根据测试结果,对驱动进行调参,优化性能,解决可能出现的问题。 在RK3368平台中,摄像头驱动还需要与平台的多媒体框架如V4L2(Video for Linux 2)接口配合,以提供标准的API供上层应用调用。...

    GC2093 CSP Datasheet Beta0.3 .pdf

    文档修订历史显示,GC2093的规格经过多次迭代改进,例如在Beta0.3版本中修复了I2C_ID的寄存器问题,表明了制造商对于产品品质的持续关注和提升。 总的来说,GC2093是一款针对高要求图像应用设计的先进CMOS图像...

    摄像头gc0308资料.rar

    摄像头GC0308是一款广泛应用于嵌入式系统和物联网设备中的数字摄像头模块。这款摄像头主要基于CMOS图像传感器技术,提供高质量的静态图像和视频流。GC0308的寄存器初始化配置是其正常工作的重要环节,因为这些寄存器...

    GC2023 DataSheet

    GC2023在成像质量方面有所保证的同时,还兼顾了客户的成本要求,使其在运动DV、行车记录仪和监控摄像机等领域应用广泛。产品的数据手册详细记录了其各个方面的性能参数和操作指导,有助于工程师和开发者设计出满足...

    gc2145 datasheet

    GC2145 CMOS图像传感器数据手册 GC2145是一种1/5英寸的UXGA CMOS图像传感器,用于图像采集和处理应用场景。下面是GC2145数据手册的详细解读: Sensor Overview GC2145是一种高性能的CMOS图像传感器,具有高分辨率...

    visualGC.zip

    其次,VisualGC还能够记录和显示GC事件的历史数据,包括每次GC的时间、类型以及回收的对象数量。这些信息有助于我们分析GC策略的效果,比如是否需要调整新生代和老年代的比例,或者是否需要调整CMS、G1等不同的GC...

    GCviewer-1.35 GC分析工具

    然而,过度或不适当的GC活动可能导致性能问题,如暂停时间过长或内存利用率低下。 ### 二、GCviewer的作用 GCviewer是用于可视化和分析这些GC活动的工具,它可以显示GC事件的详细日志,包括: 1. **GC事件的频率*...

    visualgc插件离线安装包

    尤其在处理大规模应用或者遇到性能问题时,VisualGC的直观展示能够为问题定位提供有力的支持。 当我们在VisualVM中找不到VisualGC模块时,可以手动进行离线安装。首先,我们需要下载VisualGC的插件文件,这个文件...

    必须收藏的 速显微GC9002 GC9003 GC9005系列车规级仪表方案

    必须收藏的 速显微GC9002 GC9003 GC9005系列车规级仪表方案

Global site tag (gtag.js) - Google Analytics