截取了生产服务器上的 JVM 启动参数, 都是前人踩过无数坑总结出的精华. 这里逐个介绍下
-server ①
-Xms512m ②
-Xmx1024m ③
-XX:PermSize=256m ④
-XX:MaxPermSize=512m ⑤
-XX:SurvivorRatio=6 ⑥
-XX:+DisableExplicitGC ⑦
-XX:MaxTenuringThreshold=5 ⑧
-XX:+UseConcMarkSweepGC ⑨
-XX:+UseParNewGC ⑩
-XX:+UseCMSCompactAtFullCollection ⑪
-XX:CMSFullGCsBeforeCompaction=5 ⑫
-XX:+UseCMSInitiatingOccupancyOnly ⑬
-XX:CMSInitiatingOccupancyFraction=70 ⑭
-XX:+PrintGC ⑮
-XX:+PrintGCDetails ⑯
-XX:+PrintGCDateStamps ⑰
-Xloggc:/tt/ttadmin/servers/axe_52500/logs/gc.log ⑱
-XX:+HeapDumpOnOutOfMemoryError ⑲
-XX:HeapDumpPath=/tt/ttadmin/servers/axe_52500/logs ⑳
-Dorg.apache.catalina.SESSION_COOKIE_NAME=axe_52500SESSIONID ㉑
-Djava.endorsed.dirs=/tt/ttadmin/webserver/tomcat/endorsed ㉒
-Dcatalina.base=/tt/ttadmin/servers/axe_52500 ㉓
-Dcatalina.home=/tt/ttadmin/webserver/tomcat ㉔
-Dfile.encoding=UTF-8 ㉕
-Doracle.jdbc.V8Compatible=true ㉖
-Djava.security.egd=file:/dev/./urandom ㉗
-Dsun.net.inetaddr.ttl=3 ㉘
-Djava.net.preferIPv4Stack=true ㉙
-Dcom.sun.management.jmxremote ㉚
-Dcom.sun.management.jmxremote.authenticate=false ㉛
-Dcom.sun.management.jmxremote.ssl=false ㉜
-Dcom.sun.management.jmxremote.port=52509 ㉝
-Djava.rmi.server.hostname=192.168.10.70 ㉞
org.apache.catalina.startup.Bootstrap
-config /tt/ttadmin/servers/axe_52500/conf/server.xml
======================================================
JVM 实现: JDK6.JDK7:Oracle 官方 Hotspot
JRockit 从 JDK7 开始并入 Hotspot
OpenJDK 是 Hotspot 的开源子集, Hotspot 多了少量商业功能 (没怎么用到过)
从 JDK8 开始, PermGen (永久代) 被 Metaspace (元空间) 替代
① -server 指定以服务模式启动
启动模式比较 | client | server |
---|---|---|
编译速度 | 快 (10?%) | 慢 |
运行速度 | 慢 | 快 |
默认资源占用 | 少 | 多 |
适用场景 | GUI / 脚本执行 | 服务器 |
32 位支持 | √ | √ |
64 位支持 | × | √ |
②-Xms512m 设置 堆内存 最小值 / 初始值
③-Xmx1024m 设置 堆内存 最大值
④-XX:PermSize=256m 设置 永久代 最小值 / 初始值
⑤-XX:MaxPermSize=512m 设置 永久代 最大值
如果内存波动比较厉害, 建议 Xms 设置同 Xmx,JVM 扩大内存会拖慢性能.
永久代一般启动后是比较稳定的, 大量使用动态代理会占用更多永久代内存
JDK8 开始方法区由元空间替代, 相应参数为 - XX:MetaspaceSize 和 -XX:MaxMetaspaceSize
⑥-XX:SurvivorRatio=6 设置老年代占堆内存的比例, 默认老年代占 8, 新生代占 2. 增加新生代占比在较多即生即灭对象时 (例如 ETL 任务), 可以减少新生代的 GC 频率
⑦-XX:+DisableExplicitGC 禁止代码中的 System.gc()
⑧-XX:MaxTenuringThreshold=5 设置晋升老年代的最大 minor GC 次数, 默认值 = 最大值 = 15 实际晋升条件比较复杂, 减小该值只能说一定程度上提高新生代的利用率, 可能看不出效果
⑨-XX:+UseConcMarkSweepGC 使用 CMS 收集器收集老年代, 特点是停顿短, 停顿少. 吞吐量相对低. 适合短连接事务型系统
⑩-XX:+UseParNewGC 和上一条配合, 年轻代使用并行 GC
⑪-XX:+UseCMSCompactAtFullCollection 开启 CMS 压缩, 解决碎片化问题. 压缩会增加停顿, 但是会减少 FullGC 频率.
⑫-XX:CMSFullGCsBeforeCompaction=5 CMS 每 5 次 Full GC 进行一次压缩
⑬-XX:+UseCMSInitiatingOccupancyOnly CMS 在一次 GC 后默认会自己预测计算下次启动 GC 的占比, 据说有时候会导致频繁 GC, 所以开启后固定为下面的初始比例
⑭-XX:CMSInitiatingOccupancyFraction=70 CMS 初始触发 GC 的占用比例
⑮-XX:+PrintGC 输出 GC 日志
⑯-XX:+PrintGCDetails 输出 GC 的详细日志
⑰-XX:+PrintGCDateStamps 输出 GC 的时间戳
⑱-Xloggc:/tt/ttadmin/servers/axe_52500/logs/gc.log GC 文件的输出路径
⑲-XX:+HeapDumpOnOutOfMemoryError 内存溢出时保存当时的内存快照
⑳-XX:HeapDumpPath=/tt/ttadmin/servers/axe_52500/logs 内存溢出时保存当时的内存快照
㉑ - Dorg.apache.catalina.SESSION_COOKIE_NAME=axe_52500SESSIONID 设置 tomcat session 的名字, 解决同一域名下多应用 session 冲突的问题
㉒ - Djava.endorsed.dirs=/tt/ttadmin/webserver/tomcat/endorsed 使用定制的实现替换 JDK 标准实现, 主要是替换 xml 解析器
㉓ - Dcatalina.base=/tt/ttadmin/servers/axe_52500 指定 tomcat war 包路径
㉔ - Dcatalina.home=/tt/ttadmin/webserver/tomcat 指定 tomcat 启动命令路径
㉕ - Dfile.encoding=UTF-8 修改 JVM 默认字符集, 涉及到文件 IO,class 文件内的中文问题等. 默认为系统字符编码, 中文系统 Windows 常见为 GBK
㉖ - Doracle.jdbc.V8Compatible=true 修复 oracle10g 驱动对日期的处理流失时间问题
㉗ - Djava.security.egd=file:/dev/./urandom 默认的随机数生成会阻塞, 该配置改为非阻塞. 用 UUID 的同学也会用到
㉘ - Dsun.net.inetaddr.ttl=3 设置 JVM 缓存 NDS 时间, 默认是永远有效, 必须重启
㉙ - Djava.net.preferIPv4Stack=true 优先使用 IPv4 地址
㉚ - Dcom.sun.management.jmxremote 开始 JMX
㉛ - Dcom.sun.management.jmxremote.authenticate=false 关闭 JMX 认证
㉜ - Dcom.sun.management.jmxremote.ssl=false 关闭 JMX 认证
㉝ - Dcom.sun.management.jmxremote.port=52509 设置 JMX 端口
㉞ - Djava.rmi.server.hostname=192.168.10.70 设置 RMI 主机名, 避免 127.0.0.1 远程不认识
来源: http://www.jianshu.com/p/a17dcef57559