JVM参数调优的八条经验(转载)

本文分享了针对网站性能优化的JVM参数调整经验,包括操作系统选择、内存配置、GC参数设置、应用特性和垃圾回收策略,通过合理配置显著提升了网站的吞吐量和响应速度,避免了停顿时间,确保了日常运营稳定。

要想配置好JVM参数,需要对年轻代、年老代、救助空间和永久代有一定了解,还要了解jvm内存管理逻辑,最终还要根据自己的应用来做调整。关于JVM参数上网一搜就能搜出一大把,也有很多提供实践的例子,我也按照各种例子测试过,最终还是会出现问题。

经过几个月的实践改善,我就网站(要求无停滞时间)的jvm参数调优给出以下几条经验。

1:建议用64位操作系统,Linux下64位的jdk比32位jdk要慢一些,但是吃得内存更多,吞吐量更大。

2:XMX和XMS设置一样大,MaxPermSize和MinPermSize设置一样大,这样可以减轻伸缩堆大小带来的压力。

3:调试的时候设置一些打印参数,如-XX:+PrintClassHistogram -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintHeapAtGC -Xloggc:log/gc.log,这样可以从gc.log里看出一些端倪出来。

4:系统停顿的时候可能是GC的问题也可能是程序的问题,多用jmap和jstack查看,或者killall -3 java,然后查看java控制台日志,能看出很多问题。有一次,网站突然很慢,jstack一看,原来是自己写的URLConnection连接太多没 有释放,改一下程序就OK了。

5:仔细了解自己的应用,如果用了缓存,那么年老代应该大一些,缓存的HashMap不应该无限制长,建议采用LRU算法的Map做缓存,LRUMap的最大长度也要根据实际情况设定。

6:垃圾回收时promotion failed是个很头痛的问题,一般可能是两种原因产生,第一个原因是救助空间不够,救助空间里的对象还不应该被移动到年老代,但年轻代又有很多对象需要 放入救助空间;第二个原因是年老代没有足够的空间接纳来自年轻代的对象;这两种情况都会转向Full GC,网站停顿时间较长。第一个原因我的最终解决办法是去掉救助空间,设置-XX:SurvivorRatio=65536 -XX:MaxTenuringThreshold=0即可,第二个原因我的解决办法是设置 CMSInitiatingOccupancyFraction为某个值(假设70),这样年老代空间到70%时就开始执行CMS,年老代有足够的空间接 纳来自年轻代的对象。

7:不管怎样,永久代还是会逐渐变满,所以隔三差五重起java服务器是必要的,我每天都自动重起。

8:采用并发回收时,年轻代小一点,年老代要大,因为年老大用的是并发回收,即使时间长点也不会影响其他程序继续运行,网站不会停顿。

我的最终配置如下(系统8G内存),每天几百万pv一点问题都没有,网站没有停顿,2009年网站没有因为内存问题down过机。

  1. $JAVA_ARGS . = " -Dresin.home=$SERVER_ROOT -server
  2. -Xms6000M -Xmx6000M -Xmn500M -XX:PermSize=500M -XX:MaxPermSize=500M
  3. -XX:SurvivorRatio=65536 -XX:MaxTenuringThreshold=0 -Xnoclassgc
  4. -XX:+DisableExplicitGC -XX:+UseParNewGC -XX:+UseConcMarkSweepGC
  5. -XX:+UseCMSCompactAtFullCollection -XX:CMSFullGCsBeforeCompaction=0
  6. -XX:+CMSClassUnloadingEnabled -XX:-CMSParallelRemarkEnabled
  7. -XX:CMSInitiatingOccupancyFraction=90 -XX:SoftRefLRUPolicyMSPerMB=0
  8. -XX:+PrintClassHistogram -XX:+PrintGCDetails -XX:+PrintGCTimeStamps
  9. -XX:+PrintHeapAtGC -Xloggc:log/gc.log " ;

说明一下, -XX:SurvivorRatio=65536 -XX:MaxTenuringThreshold=0就是去掉了救助空间;

-Xnoclassgc禁用类垃圾回收,性能会高一点;

-XX:+DisableExplicitGC禁止System.gc(),免得程序员误调用gc方法影响性能;

-XX:+UseParNewGC,对年轻代采用多线程并行回收,这样收得快;

带CMS参数的都是和并发回收相关的,不明白的可以上网搜索;

CMSInitiatingOccupancyFraction,这个参数设置有很大技巧,基本上满足(Xmx-Xmn)*(100- CMSInitiatingOccupancyFraction)/100>=Xmn就不会出现promotion failed。在我的应用中Xmx是6000,Xmn是500,那么Xmx-Xmn是5500兆,也就是年老代有5500 兆,CMSInitiatingOccupancyFraction=90说明年老代到90%满的时候开始执行对年老代的并发垃圾回收(CMS),这时还 剩10%的空间是5500*10%=550兆,所以即使Xmn(也就是年轻代共500兆)里所有对象都搬到年老代里,550兆的空间也足够了,所以只要满 足上面的公式,就不会出现垃圾回收时的promotion failed;

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秒;

网上其他介绍JVM参数的也比较多,估计其中大部分是没有遇到promotion failed,或者访问量太小没有机会遇到,(Xmx-Xmn)*(100- CMSInitiatingOccupancyFraction)/100>=Xmn这个公式绝对是原创,真遇到promotion failed了,还得这么处理。

<think>嗯,用户想了解主流J2EE应用服务器的配置方法和性能技巧,特别是WebLogic、JBoss和Tomcat。首先,我需要回忆一下这些应用服务器的基本区别和各自的特性。根据引用内容,Tomcat主要支持Servlet和JSP,而JBoss和WebLogic是功能更全的应用服务器,支持EJB等J2EE特性。 接下来,配置方法方面,可能需要分每个服务器来说。比如Tomcat的配置通常涉及server.xml和web.xml,整线程池、连接器参数。而JBoss和WebLogic可能有更复杂的配置,比如子系统设置和集群配置。的话,内存管理、线程池整、缓存机制都是关键点。引用里提到JBoss和Tomcat集成可以实现全部J2EE功能,这可能涉及到集群配置,如引用3中提到的群集技术对扩展性的重要性。 然后,性能需要考虑JVM参数,比如堆大小、垃圾回收策略。WebLogic可能有自己的工具,JBoss的子系统化,比如EJB池大小。Tomcat作为轻量级服务器,可能需要化连接器参数,比如maxThreads和acceptCount。另外,缓存策略也很重要,比如静态资源缓存和会话复制。 用户可能还希望知道具体的最佳实践,比如如何监控服务器性能,使用哪些工具,或者常见的配置错误。需要确保每个服务器的方法分开说明,同时比较它们的异同。比如引用2提到Tomcat与JBoss集成,这可能是一个化方案,而引用4的比较分析可能提供更多细节。 还要注意引用来源的可信度,比如引用4是转载的博客,可能需要谨慎处理。但其他引用如1、2、3看起来来自技术分析文章,比较可靠。最后,生成的相关问题要围绕配置、、监控和比较,帮助用户深入理解。</think>### 主流 J2EE 应用服务器配置与实践 #### 一、WebLogic 配置与 1. **核心配置** - **内存分配**:通过修改 `setDomainEnv.sh`(Linux)或 `setDomainEnv.cmd`(Windows)JVM 堆大小,例如: ```bash -Xms4096m -Xmx8192m -XX:MaxPermSize=2048m ``` - **线程池化**:在管理控制台中整“执行线程数”(默认 16),根据并发量设置 `MaxThreads` 和 `MinThreads`,避免线程竞争[^3]。 - **数据源连接池**:配置 `Initial Capacity` 和 `Max Capacity`,启用连接泄漏检测(`Test Connections on Reserve`)。 2. **性能** - **启用集群**:通过横向扩展提升负载能力,配置会话复制(如内存复制或数据库持久化)。 - **缓存化**:启用 `WebLogic 二级缓存`,整 `Cache Size` 和 `Cache Timeout`。 - **垃圾回收策略**:使用 G1 或 CMS 垃圾收集器,减少 Full GC 频率。 --- #### 二、JBoss 配置与 1. **核心配置** - **子系统化**:在 `standalone.xml` 中整 `web` 子系统的 `max-connections` 和 `worker线程池`。 - **内存管理**:修改 `standalone.conf` 设置堆内存,例如: ```bash -Xmx4g -XX:MetaspaceSize=256m ``` - **EJB 池配置**:整 `ejb3` 子系统的 `max-pool-size`,避免资源耗尽。 2. **性能** - **分布式缓存**:集成 Infinispan 缓存,配置分布式会话存储[^1]。 - **JVM 参数化**:启用压缩指针(`-XX:+UseCompressedOops`)和分层编译(`-XX:+TieredCompilation`)。 - **日志化**:关闭 DEBUG 日志级别,减少 I/O 开销。 --- #### 三、Tomcat 配置与 1. **核心配置** - **连接器化**:在 `server.xml` 中整 `Connector` 参数: ```xml <Connector port="8080" maxThreads="200" acceptCount="100" /> ``` - **内存设置**:修改 `catalina.sh` 设置堆内存: ```bash -Xms512m -Xmx2048m ``` - **会话持久化**:配置 `Manager` 组件实现会话存储(如 Redis)。 2. **性能** - **静态资源缓存**:启用 `DefaultServlet` 的 `cacheMaxSize` 和 `cacheTTL`。 - **NIO 模式**:使用 `org.apache.coyote.http11.Http11NioProtocol` 提升并发处理能力[^2]。 - **关闭自动重载**:设置 `reloadable="false"` 避免类重复加载。 --- #### 四、通用化原则 1. **监控工具**:使用 VisualVM、JConsole 或 Prometheus + Grafana 监控 JVM 状态。 2. **压测验证**:通过 JMeter 或 Gatling 模拟高并发场景,定位瓶颈。 3. **集群部署**:结合负载均衡(如 Nginx)实现横向扩展[^4]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值