实际部署java应用时,在sun jdk1.6的环境下,为使应用能够高效率长时间稳定运行,需要配置特定的虚拟机参数。每到此时都会想有没有一个基准配置用来供选择,使用基准配置就可以使服务器性能达到一个较高水准,下面就根据实际使用情况,列出必选配置与可选配置,供系统测试或系统上线使用。
一、必选:
1、jvm类型
-server一定要作为第一个参数,在多个CPU时性能佳,默认模式。
默认,服务端模式,启动慢,运行快,占用内存较大,编译器优化
-client客户端模式,启动快,占用内存较小,编译器优化
使用下列命令可以查看初始占用:
java -client -XX:+PrintFlagsFinal -version 2>&1 | grep -i -E 'heapsize|permsize|version'
-XX:+PrintCommandLineFlags ,这个参数的作用是显示出VM初始化完毕后所有跟最初的默认值不同的参数及它们的值
java -XX:+PrintCommandLineFlags
-d6464位java环境,建议需要使用4G以上内存时使用。同时添加压缩对象参数: -XX:+UseCompressedOops
-d3232位java环境,普通情况下使用。
-DTEST=TEST1设置环境变量TEST的值为TEST1
2、gc相关
-verbose:gc
打开gc日志开关
-Xloggc:./log/gc.log
将GC日志进行记录,后边可跟相对路径或绝对路径
-XX:+PrintGCDetails
JVM做GC时在gc日志里记录详细的gc信息
-XX:+PrintGCTimeStamps 了解垃圾收集发生的时间
-XX:+PrintGCApplicationStoppedTime 打印垃圾回收期间程序暂停的时间
回收器选择
JVM给了三种选择(三选一,默认为并行收集器):串行收集器、并行收集器、并发收集器,但是串行收集器只适用于小数据量的情况,所以这里的选择主要针对并行收集器和并发收集器。
默认情况下,JDK5.0以前都是使用串行收集器,如果想使用其他收集器需要在启动时加入相应参数。JDK5.0以后,JVM会根据当前系统配置进行智能判断。
1、串行收集器
--适用情况:数据量比较小(100M左右);单处理器下并且对响应时间无要求的应用。
--缺点:只能用于小型应用
-XX:+UseSerialGC:设置串行收集器
2、并行收集器(吞吐量优先)
--适用情况:“对吞吐量有高要求”,多CPU、对应用响应时间无要求的中、大型应用。举例:后台处理、科学计算。
--缺点:应用响应时间可能较长
-XX:+UseParallelGC:选择垃圾收集器为并行收集器。此配置仅对年轻代有效。即上述配置下,年轻代使用并发收集,而年老代仍旧使用串行收集。
-XX:ParallelGCThreads=20:配置并行收集器的线程数,即:同时多少个线程一起进行垃圾回收。此值最好配置与处理器数目相等。
-XX:+UseParallelOldGC:配置年老代垃圾收集方式为并行收集。JDK6.0支持对年老代并行收集。
-XX:MaxGCPauseMillis=100:设置每次年轻代垃圾回收的最长时间(单位毫秒),如果无法满足此时间,JVM会自动调整年轻代大小,以满足此值。
-XX:+UseAdaptiveSizePolicy:设置此选项后,并行收集器会自动选择年轻代区大小和相应的Survivor区比例,以达到目标系统规定的最低响应时间或者收集频率等。
此参数建议使用并行收集器时,一直打开。
3、并发收集器(响应时间优先)
--适用情况:“对响应时间有高要求”,多CPU、对应用响应时间有较高要求的中、大型应用。举例:Web服务器/应用服务器、电信交换、集成开发环境。
CMS, 全称Concurrent Low Pause Collector,是jdk1.4后期版本开始引入的新gc算法,在jdk5和jdk6中得到了进一步改进,它的主要适合场景是对响应时间的重要性需求 大于对吞吐量的要求,能够承受垃圾回收线程和应用线程共享处理器资源,并且应用中存在比较多的长生命周期的对象的应用。CMS是用于对tenured generation的回收,也就是年老代的回收,目标是尽量减少应用的暂停时间,减少FullGC发生的几率,利用和应用程序线程并发的垃圾回收线程来 标记清除年老代。
-XX:+UseConcMarkSweepGC:设置年老代为并发收集。测试中配置这个以后,-XX:NewRatio=4的配置失效了。所以,此时年轻代大小最好用-Xmn设置。
-XX:+UseParNewGC:设置年轻代为并发收集。可与CMS收集同时使用。JDK5.0以上,JVM会根据系统配置自行设置,所以无需再设置此值。
-XX:+UseCMSCompactAtFullCollection:打开对年老代的压缩。可能会影响性能,但是可以消除内存碎片。
-XX:+CMSParallelRemarkEnabled 降低标记停顿
-XX:CMSFullGCsBeforeCompaction=:由于并发收集器不对内存空间进行压缩、整理,所以运行一段时间以后会产生“碎片”,使得运行效率降低。此参数设置运行次FullGC以后对内存空间进行压缩、整理。
-XX:+CMSIncrementalMode:设置为增量收集模式。一般适用于单CPU情况。
-XX:CMSInitiatingOccupancyFraction=70:表示年老代空间到70%时就开始执行CMS,确保年老代有足够的空间接纳来自年轻代的对象。
注:如果使用 throughput collector(并行收集器) 和 concurrent low pause collector(并发收集器) 这两种垃圾收集器,需要适当的挺高内存大小,为多线程做准备。
3、运行相关:
java堆内存设置 一般设置为同样的大小
-Xms1024m
初始堆大小
-Xmx1024m最大堆大小
-Xmn256m年轻代大小 整个堆内存大小 = 年轻代大小 + 年老代大小 + 持久代大小 。持久代一般固定大小为64m,所以增大年轻代后,将会减小年老代大小。此值对系统性能
影响较大,Sun官方推荐配置为整个堆的3/8
java中Permanent设置,用于保存class
-XX:PermSize=512m持久代(perm gen)初始值
-XX:MaxPermSize=512m
持久代(perm gen)最大值
4、调试相关:
内存溢出时声称heapdump文件
-XX:+HeapDumpOnOutOfMemoryError
可选:
-Xnoclassgc 关闭垃圾收集回收JAVA类的功能,从而使类可以更多的被重用,因此对性能稍有提高。 但是,即时在该类不被使用后它所使用的本机内存资源仍然被使用。
若每次部署时重启,可以使用该参数,提高性能,若使用热部署,则去除该参数,否则会导致内存溢出。
-XX:ErrorFile=./hs_err_pid.log
如果JVM crash时,将错误日志输出到指定目录,默认输出在根目录下。
-XX:HeapDumpPath=./heapdump"
配置-XX:+HeapDumpOnOutOfMemoryError后生效,heapdump文件的存放位置
-XX:+DisableExplicitGC禁止在运行期显式地调用 System.gc()。若程序中没有显示调用时不需要禁止,以便某些框架或引用资源正常回收垃圾
-XX:SurvivorRatio=8Eden与Survivor的占用比例。这里的8表示,一个survivor区占用 1/8 的新生代内存,因为survivor有2个,所以是 2/8,那么Eden的占比为 6/8
非稳态选项使用说明
-XX:+启用option
-XX:-不启用option
-XX:=设定option的值为数字类型,可跟单位,例如 32k, 1024m, 2g
-XX:=设定option的值为字符串,例如-XX:HeapDumpPath=./dump.core
最后一个linux下一个完成的参数配置为(去掉换行符):
#!/bin/sh
DATE=`date -d today +"%Y%m%d%H%M"`
java -server -verbose:gc -Xloggc:./log/gc$DATE.log -XX:+PrintGCDetails -XX:+PrintGCApplicationStoppedTime -XX:+PrintGCTimeStamps -XX:+DisableExplicitGC
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=./log
-XX:SurvivorRatio=8 -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:+UseCMSCompactAtFullCollection -XX:+CMSParallelRemarkEnabled
-XX:PermSize=128m -XX:MaxPermSize=256m -Xmn768m -Xms2048m -Xmx2048m
-Djava.library.path=.
-DTEST=TEST1
-jar org.eclipse.equinox.launcher_1.0.101.R34x_v20081125.jar -clean -refresh &
aix与linux的不同
java -Dabs_node=m01_cs01 -Xms512m -Xmx2048m -Xdisableexplicitgc -Xgcpolicy:gencon -Xdump:heap:events=user -verbose:gc -Xverbosegclog:./log/gc.log -jar startup.jar -clean -refresh
-Xms256m 初始堆内存
-Xmx1024m
最大堆内存
-Xdisableexplicitgc 禁止system.gc()
-Xgcpolicy:gencon
gc采用分代并发策略
-verbose:gc
打开gc日志
-Xdump:heap:events=user
使用kill -3 时可生成heapdump文件
-Xverbosegclog:./log/gc.loggc文件存放位置
ibm jdk环境下gc的相关策略见 http://www.ibm.com/developerworks/cn/java/j-ibmjava2/