CMSGC造成内存碎片的解决方法
我们知道,CMSGC在老生代回收时产生的内存碎片会导致老生代的利用率变低;或者可能在老生代总内存大小足够的情况下,却不能容纳新生代的晋升行为(由于没有连续的内存空间可用),导致触发FullGC。针对这个问题,Sun官方给出了以下的四种解决方法:
- 增大Xmx或者减少Xmn
- 在应用访问量最低的时候,在程序中主动调用System.gc(),比如每天凌晨。
- 在应用启动并完成所有初始化工作后,主动调用System.gc(),它可以将初始化的数据压缩到一个单独的chunk中,以腾出更多的连续内存空间给新生代晋升使用。
- 降低-XX:CMSInitiatingOccupancyFraction参数以提早执行CMSGC动作,虽然CMSGC不会进行内存碎片的压缩整理,但它会合并老生代中相邻的free空间。这样就可以容纳更多的新生代晋升行为。
原文引用:
Try 5.0.
Or you could try a larger total heap and/or smaller young
generation. If your application is on the edge, it might give you just
enough extra space to fit all your live data. But often it just delays
the problem.
Or you can try to make you application do a full, compacting
collection at a time which will not disturb your users. If your
application can go for a day without hitting a fragmentation problem,
try a System.gc() in the middle of the night. That will compact the heap
and you can hopefully go another day without hitting the fragmentation
problem. Clearly no help for an application that does not have a logical
"middle of the night".
Or if by chance most of the data in the tenured generation is read
in when your application first starts up and you can do a System.gc()
after you complete initialization, that might help by compacting all
data into a single chunk leaving the rest of the tenured generation
available for promotions. Depending on the allocation pattern of the
application, that might be adequate.
Or you might want to start the concurrent collections earlier. The
low pause collector tries to start a concurrent collection just in time
(with some safety factor) to collect the tenured generation before it is
full. If you are doing concurrent collections and freeing enough space,
you can try starting a concurrent collection sooner so that it finishes
before the fragmentation becomes a problem. The concurrent collections
don't do a compaction, but they do coalese adjacent free blocks so
larger chunks of free space can result from a concurrent collection. One
of the triggers for starting a concurrent collection is the amount of
free space in the tenured generation. You can cause a concurrent
collection to occur early by setting the option
-XX:CMSInitiatingOccupancyFraction= where NNN is the percentage of the
tenured generation that is in use above which a concurrent collection is
started. This will increase the overall time you spend doing GC but may
avoid the fragmentation problem. And this will be more effective with
5.0 because a single contiguous chunk of space is not required for
promotions.
我在实际应用中的调优是:
- 在应用启动并完成所有初始化工作后,主动调用System.gc()。
- 在Xmx不变的情况下,保持SuvivorSpace不变(为了不让每次MinorGC的晋升大小增加),降低Xmn。
- 降低-XX:CMSInitiatingOccupancyFraction
我认为在程序中调用System.gc()并不是一个很好的选择,因为:
- FullGC一定会导致应用暂停,而有些高并发应用是不允许有一次FullGC的,so...
- 在jdk1.6的某个版本中,调用System.gc()并且应用中有nio操作的话,会导致应用挂起的Bug
另外的一种方法是(没用过,仅供参考):
http://kenwublog.com/avoid-full-gc-in-hbase-using-arena-allocation
CMSGC造成内存碎片的解决方法的更多相关文章
- 分享.net常见的内存泄露及解决方法
分享.net常见的内存泄露及解决方法 关于内存泄漏的问题,之前也为大家介绍过,比如:<C++中内存泄漏的检测方法介绍>,是关于C++内存泄漏的.今天为大家介绍的是关于.NET内存泄漏的问题 ...
- Tcp编程常见问题及解决方法总结
问题1.粘包问题 解决方法一:TCP提供了强制数据立即传送的操作指令push,TCP软件收到该操作指令后,就立即将本段数据发送出去,而不必等待发送缓冲区满: 解决方法二:发送固定长度的消息 解决方法三 ...
- 服务器php-cgi.exe进程过多,导致CPU占用100%的解决方法
再使用iis服务器中经常会出现php-cgi.exe进程过多,导致CPU占用100%,最终造成网站运行过慢甚至卡死的情况,重启iis会好一会,过一段时间久出现这种情况,为什么会出现这种情况呢,应该怎么 ...
- IE6、7下html标签间存在空白符,导致渲染后占用多余空白位置的原因及解决方法
直接上图:原因:该div包含的内容是靠后台进行print操作,输出的.如果没有输出任何内容,浏览器会默认给该空白区域添加空白符.在IE6.7下,浏览器解析渲染时,会认为空白符也是占位置的,默认其具有字 ...
- MVVM框架从WPF移植到UWP遇到的问题和解决方法
MVVM框架从WPF移植到UWP遇到的问题和解决方法 0x00 起因 这几天开始学习UWP了,之前有WPF经验,所以总体感觉还可以,看了一些基础概念和主题,写了几个测试程序,突然想起来了前一段时间在W ...
- iPhone Anywehre虚拟定位提示“后台服务未启动,请重新安装应用后使用”的解决方法
问题描述: iPhone越狱了,之后在Cydia中安装Anywhere虚拟定位,但是打开app提示:后台服务未启动,请重新安装应用后使用. 程序无法正常使用... 解决方法: 打开Cydia-已安装, ...
- python中IndentationError: expected an indented block错误的解决方法
IndentationError: expected an indented block 翻译为IndentationError:预期的缩进块 解决方法:有冒号的下一行要缩进,该缩进就缩进
- js闭包for循环总是只执行最后一个值得解决方法
<style> li{ list-style: none;width:40px;height: 40px;text-align:center;line-height: 40px;curso ...
- mysql5.x升级至mysql5.7后导入之前数据库date出错的解决方法!
mysql5.x升级至mysql5.7后导入之前数据库date出错的解决方法! 修改mysql5.7的配置文件即可解决,方法如下: linux版:找到mysql的安装路径进入默认的为/usr/shar ...
随机推荐
- [转载] Spring3.1 Cache注解
需要感慨一下,spring3.0时丢弃了2.5时的spring-modules-cache.jar,致使无法使用spring来方便的管理cache注解,好在3.1.M1中增加了对cache注解的支持, ...
- Endnote在latex中的应用的两种方法
从endnote中向latex文档批量插入参考文献的两种方法 一.若是latex模板中参考文献编写的命令是: \begin{thebibliography} \bibitem{lab1}LIU M L ...
- 搭建开源入侵检测系统Snort并实现与防火墙联动
Snort作为一款优秀的开源主机入侵检测系统,在windows和Linux平台上均可安装运行.BT5作为曾经的一款经典的渗透神器,基于 Ubuntu,里面已经预装很多的应用,比如Mysql.Apach ...
- hdoj-1301-Jungle Roads【最小生成树】
Jungle Roads Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total ...
- linux grep的选项
grep -i 关闭大写和小写敏感性 grep -v 打印全部不包括. . 的行(屏蔽某些条目) grep -l 打印包括模式的文件名称 grep ...
- threadlocal 变量 跟synchronized 关键字的关系
为什么叫threadloca变量呢,经过大量的查资料发现threadlocal并不是之前理解的控制线程用的东西,它其实也属于一类变量,只不过是线程的局部变量,它的作用就是实现线程间对该变量的唯一线程调 ...
- linux ubuntu下abaqus-6.14安装破解完全指南
本人亲测可用 目录 安装前准备 安装过程 机器配置 腾讯云服务器 ubuntu server 16.10 1.首先要在服务器上安装gui及相关依赖 sudo apt-get install ubunt ...
- docker学习笔记二:常用命令
docker学习笔记二:常用命令 查看docker常用命令 docker --help 返回结果如下: 其中常用的命令如下: 1.image相关操作 展示所有的image: 删除image: rmi ...
- UISegmentedControl 修改字体大小 和 颜色
UISegmentedControl 修改字体大小 和 颜色 大小: UIFont *font = [UIFont boldSystemFontOfSize:14.0f]; NSDictionary ...
- Shell 传递参数(转)
我们可以在执行 Shell 脚本时,向脚本传递参数,脚本内获取参数的格式为:$n.n 代表一个数字,1 为执行脚本的第一个参数,2 为执行脚本的第二个参数,以此类推…… 实例 以下实例我们向脚本传递三 ...