- 浏览: 284625 次
- 性别:
- 来自: 湖南岳阳
-
最新评论
-
ternus:
兄弟,我用boboBrowse 也遇到了排序的问题,上线了讨论 ...
lucene 分组 bobo-Browse 排序的问题 -
luli0822:
Awesome bookmarks of those guru ...
流行的jQuery信息提示插件(jQuery Tooltip Plugin) -
shenbai:
如果你要在前台运行,你应该run得是ElasticSearch ...
ElasticSearch 源码分析 环境入门 -
cl1154781231:
<s:peroperty value="#at ...
关于Struts2中标签的一些心得 -
RonQi:
转载的吗?http://blog.csdn.net/stray ...
利用bobo-browse 实现lucene的分组统计功能
JVM参数调优是一个很头痛的问题,可能和应用有关系,下面是本人一些调优的实践经验,希望对读者能有帮助,环境
LinuxAS4,resin2.1.17,JDK6.0,2CPU,4G内存,dell2950服务器,新手可能觉
得这文章没有用。
一:串行垃圾回收,也就是默认配置,完成10万request用时153秒,JVM参数配置如下
$JAVA_ARGS .= " -Dresin.home=$SERVER_ROOT -server -Xms2048M -Xmx2048M
-Xmn512M -XX:PermSize=256M -XX:MaxPermSize=256M
-XX:MaxTenuringThreshold=7 -XX:GCTimeRatio=19 -Xnoclassgc
-Xloggc:log/gc.log -XX:+PrintGCDetails -XX:+PrintGCTimeStamps ";
这种配置一般在resin启动24小时内似乎没有大问题,网站可以正常访问,但查看日志发现,在接近24小时时,Full
GC执行越来越频繁,大约每隔3分钟就有一次Full GC,每次Full
GC系统会停顿6秒左右,作为一个网站来说,用户等待6秒恐怕太长了,所以这种方式有待改善。MaxTenuringThreshold=7表示一个对象
如果在救助空间移动7次还没有被回收就放入年老代,GCTimeRatio=19表示java可以用5%的时间来做垃圾回收,1/(1+19)=1
/20=5%。
二:并行回收,完成10万request用时117秒,配置如下:
$JAVA_ARGS .= " -Dresin.home=$SERVER_ROOT -server -Xmx2048M -Xms2048M
-Xmn512M -XX:PermSize=256M -XX:MaxPermSize=256M -Xnoclassgc
-Xloggc:log/gc.log -XX:+PrintGCDetails -XX:+PrintGCTimeStamps
-XX:+UseParallelGC -XX:ParallelGCThreads=20 -XX:+UseParallelOldGC
-XX:MaxGCPauseMillis=500 -XX:+UseAdaptiveSizePolicy
-XX:MaxTenuringThreshold=7 -XX:GCTimeRatio=19 ";
并行回收我尝试过多种组合配置,似乎都没什么用,resin启动3小时左右就会停顿,时间超过10
秒。也有可能是参数设置不够好的原因,MaxGCPauseMillis表示GC最大停顿时间,在resin刚启动还没有执行Full
GC时系统是正常的,但一旦执行Full
GC,MaxGCPauseMillis根本没有用,停顿时间可能超过20秒,之后会发生什么我也不再关心了,赶紧重启resin,尝试其他回收策略。
三:并发回收,完成10万request用时60秒,比并行回收差不多快一倍,是默认回收策略性能的2.5倍,配置如下:
$JAVA_ARGS .= " -Dresin.home=$SERVER_ROOT -server -Xms2048M -Xmx2048M
-Xmn512M -XX:PermSize=256M -XX:MaxPermSize=256M -XX:+UseConcMarkSweepGC
-XX:MaxTenuringThreshold=7 -XX:GCTimeRatio=19 -Xnoclassgc
-Xloggc:log/gc.log -XX:+PrintGCDetails -XX:+PrintGCTimeStamps
-XX:+UseCMSCompactAtFullCollection -XX:CMSFullGCsBeforeCompaction=0 ";
这个配置虽然不会出现10秒连不上的情况,但系统重启3个小时左右,每隔几分钟就会有5秒连不上的情况,查看gc.log,发现在执行ParNewGC时
有个promotion failed错误,从而转向执行Full
GC,造成系统停顿,而且会很频繁,每隔几分钟就有一次,所以还得改善。UseCMSCompactAtFullCollection是表是执行Full
GC后对内存进行整理压缩,免得产生内存碎片,CMSFullGCsBeforeCompaction=N表示执行N次Full GC后执行内存压缩。
四:增量回收,完成10万request用时171秒,太慢了,配置如下
$JAVA_ARGS .= " -Dresin.home=$SERVER_ROOT -server -Xms2048M -Xmx2048M
-Xmn512M -XX:PermSize=256M -XX:MaxPermSize=256M
-XX:MaxTenuringThreshold=7 -XX:GCTimeRatio=19 -Xnoclassgc
-Xloggc:log/gc.log -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -Xincgc ";
似乎回收得也不太干净,而且也对性能有较大影响,不值得试。
五:并发回收的I-CMS模式,和增量回收差不多,完成10万request用时170秒。
$JAVA_ARGS .= " -Dresin.home=$SERVER_ROOT -server -Xms2048M -Xmx2048M
-Xmn512M -XX:PermSize=256M -XX:MaxPermSize=256M
-XX:MaxTenuringThreshold=7 -XX:GCTimeRatio=19 -Xnoclassgc
-Xloggc:log/gc.log -XX:+PrintGCDetails -XX:+PrintGCTimeStamps
-XX:+UseConcMarkSweepGC -XX:+CMSIncrementalMode
-XX:+CMSIncrementalPacing -XX:CMSIncrementalDutyCycleMin=0
-XX:CMSIncrementalDutyCycle=10 -XX:-TraceClassUnloading ";
采用了sun推荐的参数,回收效果不好,照样有停顿,数小时之内就会频繁出现停顿,什么sun推荐的参数,照样不好使。
六:递增式低暂停收集器,还叫什么火车式回收,不知道属于哪个系,完成10万request用时153秒
$JAVA_ARGS .= " -Dresin.home=$SERVER_ROOT -server -Xms2048M -Xmx2048M
-Xmn512M -XX:PermSize=256M -XX:MaxPermSize=256M
-XX:MaxTenuringThreshold=7 -XX:GCTimeRatio=19 -Xnoclassgc
-Xloggc:log/gc.log -XX:+PrintGCDetails -XX:+PrintGCTimeStamps
-XX:+UseTrainGC ";
该配置效果也不好,影响性能,所以没试。
七:相比之下,还是并发回收比较好,性能比较高,只要能解决ParNewGC(并行回收年轻代)时的promotion
failed错误就一切好办了,查了很多文章,发现引起promotion
failed错误的原因是CMS来不及回收(CMS默认在年老代占到90%左右才会执行),年老代又没有足够的空间供GC把一些活的对象从年轻代移到年老
代,所以执行Full
GC。CMSInitiatingOccupancyFraction=70表示年老代占到约70%时就开始执行CMS,这样就不会出现Full
GC了。SoftRefLRUPolicyMSPerMB这个参数也是我认为比较有用的,官方解释是softly reachable objects
will remain alive for some amount of time after the last time they were
referenced. The default value is one second of lifetime per free
megabyte in the heap,我觉得没必要等1秒,所以设置成0。配置如下
$JAVA_ARGS .= " -Dresin.home=$SERVER_ROOT -server -Xms2048M -Xmx2048M
-Xmn512M -XX:PermSize=256M -XX:MaxPermSize=256M -XX:SurvivorRatio=8
-XX:MaxTenuringThreshold=7 -XX:GCTimeRatio=19 -Xnoclassgc
-XX:+DisableExplicitGC -XX:+UseParNewGC -XX:+UseConcMarkSweepGC
-XX:+CMSPermGenSweepingEnabled -XX:+UseCMSCompactAtFullCollection
-XX:CMSFullGCsBeforeCompaction=0 -XX:+CMSClassUnloadingEnabled
-XX:-CMSParallelRemarkEnabled -XX:CMSInitiatingOccupancyFraction=70
-XX:SoftRefLRUPolicyMSPerMB=0 -XX:+PrintClassHistogram
-XX:+PrintGCDetails -XX:+PrintGCTimeStamps
-XX:+PrintGCApplicationConcurrentTime -XX:+PrintGCApplicationStoppedTime
-Xloggc:log/gc.log ";
上面这个配置内存上升的很慢,24小时之内几乎没有停顿现象,最长的只停滞了0.8s,ParNew GC每30秒左右才执行一次,每次回收约0.2秒,看来问题应该暂时解决了。
参数不明白的可以上网查,本人认为比较重要的几个参数是:-Xms -Xmx -Xmn MaxTenuringThreshold
GCTimeRatio UseConcMarkSweepGC CMSInitiatingOccupancyFraction
SoftRefLRUPolicyMSPerMB
发表评论
-
Errors running builder 'DeploymentBuilder' on project_java
2014-10-09 11:54 790此问题一般发生在Myeclipse 保存文件并自动部署时候 ... -
MyEclipse的SVN插件的问题
2012-02-27 14:06 1769我的项目都统一使用了UTF-8编码 查看当前版本,还是提 ... -
Eclipse的SVN插件历史版本乱码的问题
2012-02-27 14:04 0我的项目都统一使用了UTF-8编码 查看当前版本,还是提 ... -
java中的io系统详解
2011-09-16 12:09 1162相关读书笔记、心得文章列表 Ja ... -
hibernate表关联注解
2011-08-02 11:39 1432好久就想玩一下hibernate注解了(因为不用hbm文件,维 ... -
TCP/IP传输层,你懂多少?
2011-05-12 17:13 1749你所不知道的传输层 题记:23页的文档上,满满当当的 ... -
关于Struts2中标签的一些心得
2011-05-06 17:21 1748最近在做Struts2+Hibernet的一个项目,在if标签 ... -
This wizard is not available because it requires a valid professional subscripti
2011-04-18 23:05 1878今天用myeclipse学习UML时,打开UML时出现了: ... -
Tomcat内存、连接数等性能参数设置
2011-04-08 09:59 1286默认参数不适合生产环 ... -
Eclipse 或 MyEclipse 不能自动编译 class文件(综合)
2011-03-25 11:50 4737有时候用Eclipse或者MyEclipse 的时候,发现不 ... -
AccessController.doPrivileged 小记
2011-03-24 11:43 1072AccessController.doPrivileged ... -
servlet 读取图片
2011-02-17 15:38 1145String path = "F:/wjbo ... -
获取文件长度http,ftp
2011-01-18 16:09 1748ftp: FTPClient ftp = new FTPCl ... -
类的设计原则
2010-12-13 18:14 1096开闭原则 Software entities ... -
收集的网站
2010-12-09 17:12 931NIO.2 入门,第 1 部分: 异步通道 API http ... -
看Hibernate源码 003 - ID Generator
2010-12-09 16:43 1371Hibernate的id生成有N种策略, 可以通过hbm文件或 ... -
看Hibernate源码 001
2010-12-09 10:40 1105我看书的方式一向是&quo ... -
Hibernate Memcached 配置
2010-12-08 15:39 2151官方网址: http://code.google.com/p/ ... -
tomcat如何配置虚拟目录及虚拟主机
2010-12-02 17:54 2192先说说如何用Eclipse来做servlet开发,那些proj ... -
jaas:授权内幕
2010-11-13 15:48 1407Java 授权内幕: 以代码 ...
相关推荐
不同的垃圾回收策略适用于不同场景下的应用程序,因此了解这些策略的特点对于优化应用程序至关重要。 #### 一般调优准则 1. **熟悉默认设置**:Sun HotSpot JVM 集成了智能调优功能,称为“Ergonomics”。对于至少...
本文将深入探讨Java内存结构、垃圾回收机制以及调优策略。 首先,Java内存主要分为堆内存和非堆内存。堆内存是Java程序的主要内存区域,负责存储对象实例。它被划分为新生代(Young Generation)和老年代(Old ...
Java垃圾回收机制是Java虚拟机(JVM)中至关重要的组成部分,它的主要任务是自动管理内存,回收不再使用的对象以避免内存泄漏。垃圾回收机制在Java中自动化了内存管理,使得程序员无需手动管理内存,降低了编程复杂...
本文将详细探讨JVM中的垃圾回收与调优,重点包括内存分配策略、对象的生命周期以及垃圾回收的判断标准。 首先,JVM内存分为新生代(Young Generation)、老年代(Tenured Generation)和持久代(Permanent ...
总结来说,理解JVM的内存分配策略和垃圾回收机制对于优化Java应用的性能至关重要。开发者需要根据应用的特性调整JVM参数,确保内存的有效利用,减少不必要的垃圾收集开销,从而提高系统的响应速度和稳定性。
JVM 的垃圾回收机制是 Java GC 与性能调优的核心内容。JVM 的垃圾回收机制可以分为以下几个步骤: * 标记阶段:标记出所有活动对象。 * 清除阶段:清除所有不可达对象。 * 压缩阶段:压缩内存,减少碎片。 五、 ...
Java垃圾回收器(Garbage Collector, GC)是Java编程语言中的一个重要特性,它负责自动管理内存,自动回收不再使用的对象,以防止内存泄漏。在Java中,程序员无需手动释放内存,这一过程由JVM(Java虚拟机)自动完成...
Java垃圾回收调优是优化Java应用程序性能的关键环节,特别是对于那些需要处理大量数据或执行高并发操作的应用。垃圾回收(Garbage Collection, GC)的主要任务是自动管理内存,释放不再使用的对象,避免内存泄漏,...
Java垃圾回收机制是Java编程中一个非常重要的概念,尤其在面试和实际开发中常常被讨论。垃圾回收(Garbage Collection, GC)是Java虚拟机自动管理内存的一种方式,旨在自动识别并释放不再使用的对象,从而避免内存...
垃圾回收的调优涉及到多个方面,包括选择合适的GC策略、调整堆大小、控制新生代和老年代的比例、设置GC日志以便分析等。调优的目标是在保持应用响应时间和稳定性的同时,最大化系统资源利用率。这需要开发者深入理解...
Java性能调优,特别是关于垃圾回收...总结来说,Java性能调优中的垃圾回收机制分析是一项深度工作,需要深入理解JVM的内存管理,识别并避免内存泄漏,以及合理调整垃圾收集策略,以实现更高效、更稳定的Java应用程序。
本教程将涵盖Java的基础知识,特别是关于内存管理的重要概念——Java内存区域、Out of Memory (OOM)错误以及垃圾回收器和垃圾回收策略。 1. **Java入门**: Java的学习始于基础语法,包括变量、数据类型、运算符、...
Java垃圾回收(Garbage Collection, 简称GC)是Java平台中的一项重要特性,它自动管理内存,释放不再使用的对象,避免了程序员手动管理内存可能导致的内存泄露问题。本篇将深入探讨Java垃圾回收的精华部分,以及在...
- **JVM调优**:合理设置堆大小、垃圾回收策略等,减少资源浪费。 - **数据库调优**:优化查询语句、索引设计等。 - **操作系统调优**:调整内核参数以适应不同的应用场景。 #### 架构设计原则 - **分而治之**:将...
调整合适的堆大小和内存分配策略可以有效减少垃圾回收的频率和时间,提高系统响应速度。此外,监控GC日志,分析GC行为,以及使用适当的GC算法(如CMS、G1或ZGC)也是优化过程中的关键步骤。通过这些实践,开发者能够...
Java虚拟机(JVM)的垃圾回收(Garbage Collection,简称GC)机制是其自动内存管理的关键组成部分。Java语言并没有强制要求JVM必须包含GC,但现代JVM实现如HotSpot都内置了GC,以自动回收不再使用的对象所占用的内存...
Java虚拟机(JVM)性能参数调优是提升Java应用程序性能的关键步骤,...通过以上内容,开发者不仅能得到JVM参数调优的基本概念,还能了解到实际操作中的具体参数设置和调优策略,这对于优化Java应用程序的性能至关重要。
在JVM内存调优方面,书中详细介绍了不同垃圾回收(GC)算法的原理和适用场景,并指导开发者如何根据应用特性选择合适的GC策略。同时,针对线程池的配置,书中不仅解释了线程池的工作原理,还提供了不同场景下的最佳...