若不指定Xmx, 即Java Heap的最大值, 程序启动时, JVM会调整其大小以满足程序运行的需要. 每次调整时, 都会对堆进行一次完全垃圾收集(即Full GC), 比较影响性能. 因此推荐明确指定Xmx的大小.
令 Xmx=Xms 会有更好地性能表现: 能避免JVM在每次垃圾收集后重新动态调节堆空间, 因为频繁伸缩堆大小将带来额外的性能消耗.
JVM有2中模式: client客户端模式 和 server服务端模式 , 平时开发中使用的多是默认的client模式. 可通过命令行参数 -server 强制开启server模式. 两者之间的最大区别是, JVM对server模式做了大量优化: 虽然server模式下应用程序启动较慢, 但在长时间运行下, 程序运行效率会明显高于client模式, 即 client模式不适合需要长时间运行的项目 .
元空间的调优:
元空间的大小将受限于机器的内存的限制. 限制类的元数据的内存大小, 以避免出现虚拟内存切换以及本地内存分配失败.
如果可能出现类加载器泄漏, 应当配置此参数指定大小. 32位机器上, 如果地址空间可能会被耗尽, 也应当配置此参数.
元空间的初始大小是21M——这是GC的初始高水位线, 超过这个大小会进行Full GC来进行类的收集.
如果启动后GC过于频繁, 请将该值设置得大一些, 以便推迟GC的执行时间.
1.4 验证配置效果 # 由于配置了环境变量, 在任意目录下使用jps及jmap命令, 即可调用相关工具: # 使用 jps 查看 Java 的所有进程 [root@localhost ~]# jps 14308 Bootstrap 15620 Jps # 其中 Bootstrap 进程就是 Tomcat, 其进程号为14308. # 通过 jmap 工具查看其内存相关配置 [root@localhost ~]# jmap -heap 14308 # 显示以下结果 Attaching to process ID 24980, please wait... Debugger attached successfully. Server compiler detected. JVM version is 25.151-b12 using thread-local object allocation. Parallel GC with 28 thread(s) # 默认使用并发GC策略 Heap Configuration: # 堆的配置参数 MinHeapFreeRatio = 0 MaxHeapFreeRatio = 100 MaxHeapSize = 103079215104 (98304.0MB) # 最大堆内存 NewSize = 34359738368 (32768.0MB) # 新生代大小, 由于默认的NewRatio=2, 所以是1/3的堆大小 MaxNewSize = 34359738368 (32768.0MB) OldSize = 68719476736 (65536.0MB) # 老年代大小, 由于默认的NewRatio=2, 所以是2/3的堆大小 NewRatio = 2 SurvivorRatio = 8 MetaspaceSize = 21807104 (20.796875MB) # 元空间大小 CompressedClassSpaceSize = 1073741824 (1024.0MB) MaxMetaspaceSize = 17592186044415 MB # 最大元空间大小 G1HeapRegionSize = 0 (0.0MB) Heap Usage: # 堆的使用情况 PS Young Generation Eden Space: # 新生代的伊甸区, 由于默认的SurvivorRatio=8, 所以是6/8的NewSize capacity = 25769803776 (24576.0MB) used = 9742123824 (9290.813278198242MB) free = 16027679952 (15285.186721801758MB) 37.80441600829363% used From Space: # 新生代的From区, 由于默认的SurvivorRatio=8, 所以是1/8的NewSize capacity = 4294967296 (4096.0MB) used = 0 (0.0MB) free = 4294967296 (4096.0MB) 0.0% used To Space: # 新生代的To区, 由于默认的SurvivorRatio=8, 所以是1/8的NewSize capacity = 4294967296 (4096.0MB) used = 0 (0.0MB) free = 4294967296 (4096.0MB) 0.0% used PS Old Generation # 老年代, 由于默认的NewRatio=2, 所以是2/3的堆大小 capacity = 68719476736 (65536.0MB) used = 254298704 (242.5181427001953MB) free = 68465178032 (65293.481857299805MB) 0.37005331832915545% used 23928 interned Strings occupying 3198312 bytes. 2 GC策略调优实践Tomcat的GC策略一般都是与其内存参数一起配置的, 与应用复杂度相匹配的GC策略、与服务器性能相适应的内存比例, 都将使得系统性能得到大幅提升.
GC策略方面的调优, 也是在 ${TOMCAT_HOME}/bin/catalina.sh文件中调整 -- 同样是配置 JAVA_OPTS 变量即可.
以JDK 8、Tomcat 8为例, 服务器内存为126GB, 作出如下配置:
通过Solr集群大批量导入数据的应用中, Parallel GC策略的暂停时间太长, 所以选择CMS收集器.
# 下述配置各自独占一行, 要置于"cygwin=false"之前. # 配置内存 JAVA_OPTS="-server -Xmx96g -Xms96g -Xmn35g -XX:OldSize=55g -Xss128k -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=256m" # 配置GC策略 JAVA_OPTS="$JAVA_OPTS -XX:+UseConcMarkSweepGC -XX:MaxTenuringThreshold=15 -XX:CMSInitiatingOccupancyFraction=40 -XX:CMSFullGCsBeforeCompaction=0 -XX:+ExplicitGCInvokesConcurrent -XX:SoftRefLRUPolicyMSPerMB=0 -XX:MaxGCPauseMillis=100 -Xnoclassgc "其中Java Heap的初始大小和最大大小均设置为96g, 76%的物理内存(以不超过80%为宜).
参考资料:
Tomcat中Java垃圾收集调优
版权声明作者: ma_shoufeng(马瘦风)
出处: 博客园 马瘦风的博客
您的支持是对博主的极大鼓励, 感谢您的阅读.
本文版权归博主所有, 欢迎转载, 但未经博主同意必须保留此段声明, 且在文章页面明显位置给出原文链接, 否则博主保留追究法律责任的权利.