JBoss调优(jboss-5.1.0.GA)

来源:互联网 发布:淘宝618大促报名 编辑:程序博客网 时间:2024/05/21 01:52

JBoss调优(jboss-5.1.0.GA)

 

版本:jboss-5.1.0.GA

 

 

1      JVM调优

1.1    概念

 

Java的Jvm分为主要为两大块:一个是heap和 PermGen space

Heap包括三个区域. Young、Old、Permanent。其中Old包括两个区,一个是from区,一个是to区。

 

Young是负责新对象的创建区域,当新对象无法在Young区创建的时候,Young区会进行gc,会将一些失效的对象转移至Old区。

Permanent区保存JAVA反射对象

 

当对象越来越多的时候,达到jvm内存不足10%的时候,会进行一次full gc来释放对象。

 

项目要尽可能少的full gc 。因为full gc比较占资源,一般要求吞吐量比较大的时候,尽量的将new区域设置的比较大一点。也就是eden和Old这个区域。 

下面简要的说一下配置参数 

 

-Xms:初始Heap大小

-Xmx:java heap最大值

-Xmn:young generation的heap大小 ,最好等于Xmx的1/3(OLD区=Xmx-Xmn)

 

setJAVA_OPTS=%JAVA_OPTS% -Xms128m -Xmx512m -XX:MaxPermSize=256m 

 

-Xms512m 代表jvm最少用 512m内存

-Xmx1024m 代表jvm最多使用 1024m内存,尽量的将-Xms和-Xmx大小设置相同,这样避免内存重新分配影响性能。

-Xss=128k 线程初始化大小,5.0之前默认是128k,之后为1m,线程机器最大为3000-5000

-XX:MaxPermSize=256m.这是表明持久类,也就是PermGen space区域的最大为256M

-XX:PermSize=256m这个持久区域初始化为256m,一般持久类的大小是64m
这个配置是最常用的配置。如果需要考虑到吞吐量,那么new space和old space你就得重新分配一下。

 

1.2    常见配置汇总 

1.2.1   堆设置 

-Xss128kJBoss每增加一个线程(thread)就会立即消耗128K,默认值好像是512k

-Xms512m:初始堆大小,代表jvm最少用 512m内存

-Xmx:最大堆大小一般为服务器的3/4内存量,推荐至少使用4G内存,不应该超过物理内存的90%。

-XX:NewSize=n:设置年轻代大小

-XX:NewRatio=n:设置年轻代和年老代的比值。如:3,表示年轻代与年老代比值为13,年轻代占整个年轻代年老代和的1/4

-XX:SurvivorRatio=n:年轻代中Eden区与两个Survivor区的比值。注意Survivor区有两个。如:3,表示EdenSurvivor=32,一个Survivor区占整个年轻代的1/5 
-XX:MaxPermSize=n:设置持久代大小 

1.2.2   收集器设置 

-XX:+UseSerialGC:设置串行收集器 

-XX:+UseParallelGC:设置并行收集器 

-XX:+UseParalledlOldGC:设置并行年老代收集器 

-XX:+UseConcMarkSweepGC:设置并发收集器 

1.2.3   垃圾回收统计信息 

-XX:+PrintGC 

-XX:+PrintGCDetails 

-XX:+PrintGCTimeStamps 

-Xloggc:filename 

1.2.4   并行收集器设置 

-XX:ParallelGCThreads=n:设置并行收集器收集时使用的CPU数。并行收集线程数。 

-XX:MaxGCPauseMillis=n:设置并行收集最大暂停时间 

-XX:GCTimeRatio=n:设置垃圾回收时间占程序运行时间的百分比。公式为1/(1+n) 

1.2.5   5. 并发收集器设置 

-XX:+CMSIncrementalMode:设置为增量模式。适用于单CPU情况。 
-XX:ParallelGCThreads=n:设置并发收集器年轻代收集方式为并行收集时,使用的CPU数。并行收集线程数。

 

查看CPU

cat/proc/cpuinfo | grep "processor" | wc –l

 

1.3    典型配置

典型服务器配置有以下几种:

-Xmx3800m-Xms3800m -Xmn2g -Xss128k -XX:+UseParallelGC -XX:ParallelGCThreads=20

-XX:+UseParallelGC:选择垃圾收集器为并行收集器。此配置仅对年轻代有效。即上述配置下,年轻代使用并发收集,而年老代仍旧使用串行收集。
-XX:ParallelGCThreads=20:配置并行收集器的线程数,即:同时多少个线程一起进行垃圾回收。此值最好配置与处理器数目相同

 

 

-Xmx3550m-Xms3550m -Xmn2g -Xss128k -XX:+UseParallelGC -XX:ParallelGCThreads=20-XX:+UseParallelOldGC
-XX:+UseParallelOldGC:配置年老代垃圾收集方式为并行收集。JDK6.0支持对年老代并行收集。

 

-Xmx3550m-Xms3550m -Xmn2g -Xss128k -XX:+UseConcMarkSweepGC-XX:CMSFullGCsBeforeCompaction=5 -XX:+UseCMSCompactAtFullCollection

XX:CMSFullGCsBeforeCompaction:由于并发收集器不对内存空间进行压缩、整理,所以运行一段时间以后会产生“碎片”,使得运行效率降低。此值设置运行多少次GC以后对内存空间进行压缩、整理。 

-XX:+UseCMSCompactAtFullCollection:打开对年老代的压缩。可能会影响性能,但是可以消除碎片

 

 

生产环境8G内存jboss配置如下

if [ "x$JAVA_OPTS" ="x" ]; then

   JAVA_OPTS="-Xss128k -Xms6000m -Xmx6000m-XX:MaxNewSize=512m -XX:MaxPermSize=512M -XX:+UseParallelGC-XX:ParallelGCThreads=16 -XX:+UseParallelOldGC-Dsun.rmi.dgc.client.gcInterval=3600000 -Dsun.rmi.dgc.server.gcInterval=3600000"

fi

 

生产环境4G内存jboss配置如下

if [ "x$JAVA_OPTS" ="x" ]; then

   JAVA_OPTS="-Xss128k -Xms3000m -Xmx3000m-XX:MaxNewSize=256m -XX:MaxPermSize=256m -XX:+UseParallelGC-XX:ParallelGCThreads=16 -XX:+UseParallelOldGC-Dsun.rmi.dgc.client.gcInterval=3600000 -Dsun.rmi.dgc.server.gcInterval=3600000"

Fi

 

生产环境1G内存jboss配置如下

JAVA_OPTS=”-server -Xms800m -Xmx800m-XX:PermSize=64M -XX:MaxNewSize=256m -XX:MaxPermSize=128m-Djava.awt.headless=true ”

 

2      访问线程优化

$JBOSS_HOME/server/[NODE_NAME]/deploy/jbossweb.sar/server.xml

Connector 节点新增两个属性

maxThreads="40" acceptCount="5000"

 

最佳线程数量=((线程等待时间+线程cpu时间)/线程cpu时间) * cpu数量

 

maxThreads值建议压力测试环境从300逐渐向下调试,观察结果。

 

3      数据库连接池优化

进入 $JBOSS_HOME/server/[NODE_NAME]/deploy/ 目录 ,找到xxx-ds.xml文件,编辑。可依据实际需要设置连接池最小连接数量和最大连接数量等数据源信息(需要配合压力测试工具)。

4      日志优化

进入$JBOSS_HOME/server/[NODE_NAME]/conf 目录,编辑jboss-log4j.xml文件。

可在ROOT 节点中加入<levelvalue="info" /> 限制服务器日志输出,除非有必要,生产系统日志为INFO。

5      数据压缩功能(慎用,出现带宽吃紧时使用)

当web容器需要大量的数据传输时,为减少数据传输时间,可以考虑启用数据压缩功能。类似css、js等数据是重点考虑对象。主要做法如下所示: 
打开server/default/deploy/jboss-web.deployer/server.xml 
找 到 protocol=”HTTP/1.1″的 Connector元素,添加属性

URIEncoding=”utf-8″

compression=”on”

compressionMinSize=”2048″

noCompressionUserAgents=”gozilla,traviata”

compressableMimeType=”text/html,text/xml,text/javascript,text/css,text/plain,application/xhtml+xml,application/x-javascript,application/javascript,text/xhtml” 

 

6   优化静态页面(大网站,访问频率高)

 

考虑使用jboss-native,提高处理静态文件的处理速度. 

 

 

6.1    原理

jbossweb container使用的 apache tomcat (http://www.apache.org) apache tomcat 有一个扩展包,使tomcat可以通过 java native interface使用 apache portable runtime (APR),而APR则是大名顶顶的apache httpd网络服务器的运行时环境。用了这个扩展之后,就使得tomcat可以借助于apache httpd的力量,性能得以提升,尤其是处理静态文件时效率更高。Jboss native,实际上就是tomcat的这个native的扩展,只不过被jboss又添进了一些为了和jboss更好协作而加进去的东西。 

要安装jbossnative,按以下步骤进行 

 

6.2    安装JBoss native

http://www.jboss.org/jbossweb/downloads/jboss-native/?action=a&windowstate=maximized

 

依据服务器环境选择合适的版本。目前我们用的版本是JBoss Native 2.0.4 Linux x86 
解压下载后的压缩包到某个目录,比如 jbossNative目录 
jbossNative/bin/META-INF/bin/linux2/x86/openssl复制到<jboss>/bin 

<jboss>/bin目录里建一个文件夹,名为 native 

jbossNative/bin/META-INF/lib/linux2/x86/目录下所有内容复制到上一步建好的<jboss>/bin/native目录下

 

7      开启控制台登录验证

略。

8      内存溢出解决

8.1     java.lang.OutOfMemoryError: PermGen space

PermGen space的全称是PermanentGeneration space,是指内存的永久保存区域, 
这块内存主要是被JVM存放Class和Meta信息的,Class在被Loader时就会被放到PermGenspace中,它和存放类实例(Instance)的Heap区域不同,GC(GarbageCollection)不会在主程序运行期对PermGen space进行清理,所以如果你的应用中有很多CLASS的话,就很可能出现PermGenspace错误,这种错误常见在web服务器对JSP进行precompile的时候如果你的WEB APP下都用了大量的第三方jar,其大小超过了jvm默认的大小(4M)那么就会产生此错误信息了 。

解决方法: 手动设置MaxPermSize大小 

JAVA_OPTS=”-server -XX:PermSize=64M-XX:MaxPermSize=128m

 

建议:将相同的第三方jar文件移置到[profile]/lib目录下,这样可以达到减少jar文档重复占用内存的目的

 

8.2 .java.lang.OutOfMemoryError:Java heap space 

 

Heapsize 设置 

JVM堆的设置是指java程序运行过程中JVM可以调配使用的内存空间的设置.JVM在启动的时候会自动设置Heap size的值

其初始空间(-Xms)是物理内存的1/64,最大空间(-Xmx)是物理内存的1/4可以利用JVM提供的-Xmn -Xms -Xmx等选项可 

进行设置Heapsize的大小是YoungGenerationTenuredGeneraion之和 

提示:在JVM中如果98%的时间是用于GC且可用的Heap size 不足2%的时候将抛出此异常信息 

提示:Heap Size最大不要超过可用物理内存的80%,一般的要将-Xms-Xmx选项设置为相同,而-Xmn1/4或者 1/3-Xmx 

解决方法:手动设置Heapsize 

 

JAVA_OPTS=”-server -Xms800m -Xmx800m-XX:MaxNewSize=256m”



以下给出1G内存环境下javajvm 的参数设置参考: 

 

JAVA_OPTS=”-server -Xms800m -Xmx800m-XX:PermSize=64M -XX:MaxNewSize=256m -XX:MaxPermSize=128m-Djava.awt.headless=true ”

 

 

 

9      参考:

http://blog.csdn.net/lengyuhong/article/details/6319069

http://binma85.iteye.com/blog/779010

原创粉丝点击