大内存生产环境tomcat-jvm配置实践

话不多讲,奉上代码,分享经验,交流提高!

64G物理内存,8核CPU生产环境tomcat-jvm配置如下:

bash 复制代码
JAVA_OPTS=-server -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=2G 
-XX:+UseG1GC -Xms48G -Xmx48G -XX:MaxGCPauseMillis=200 
-XX:G1HeapRegionSize=8M -XX:InitiatingHeapOccupancyPercent=45 
-XX:+HeapDumpOnOutOfMemoryError -XX:-OmitStackTraceInFastThrow 
-Doracle.jdbc.useNio=false -Dsun.zip.disableMemoryMapping=true 
-Dorg.apache.el.parser.COERCE_TO_ZERO=true 
-Djgroups.bind_addr=0.0.0.0

|--------|--------------------------------------------------|-------------------------------------------------------------------------------------------------------------|
| 编号 | 配置参数 | 参数含义及备注说明 |
| 1 | -server | 启用JVM的"服务器模式"优化,针对长时间运行的应用进行性能优化(如更高的吞吐量、更积极的即时编译)。适用于生产环境中的服务端应用,一定要作为第一个参数。 |
| 2 | -XX:MaxMetaspaceSize=4G​​ | ​​设置Metaspace(元数据区,替代永久代)的最大大小为4GB,防止类元数据无限制增长导致内存溢出。​​注​​:Metaspace存放类定义、方法元数据等信息,默认无上限,需监控避免泄漏。 |
| 3 | -XX:ReservedCodeCacheSize=2G | 设置JIT编译后的本地代码缓存区大小为2GB,避免大型应用因代码缓存不足导致性能下降。注​​:代码缓存满时,JIT可能停止编译,影响性能。 |
| 4 | -XX:+UseG1GC​​ | 启用G1(Garbage-First)垃圾收集器,适合大堆内存(如48G)和低延迟场景。​特点​​:分区域回收,优先处理垃圾最多的区域,减少停顿时间。 |
| 5 | -Xms48G -Xmx48G​​ | ​​设置JVM堆内存的初始值(Xms)和最大值(Xmx)均为48GB,避免堆动态扩容带来的性能波动。生产建议​​:通常建议两者设为相等,避免堆大小调整导致GC频繁。 |
| 6 | -XX:MaxGCPauseMillis=200​​ | ​​设定G1垃圾收集器的目标最大停顿时间为200毫秒,JVM会尽量调整GC策略以满足该目标。权衡​​:过低的设置可能导致更频繁的GC,影响吞吐量。 |
| 7 | -XX:G1HeapRegionSize=8M​​ | ​​设置G1垃圾收集器的内存区域(Region)大小为8MB,较大的Region可能减少内存碎片。 ​​建议​​:通常根据堆大小自动计算,显式设置需结合应用特性。 |
| 8 | -XX:InitiatingHeapOccupancyPercent=45​​ | ​​当堆内存使用率达到45%时,启动G1的并发标记周期(Concurrent GC)。 ​​目的​​:尽早回收垃圾,避免堆占用过高时触发Full GC。 |
| 9 | -XX:+HeapDumpOnOutOfMemoryError​​ | ​​在发生内存溢出(OOM)时自动生成堆转储文件(java_pid<pid>.hprof),用于事后分析内存泄漏。​​文件位置​​:默认在JVM工作目录,可通过-XX:HeapDumpPath指定路径。 |
| 10 | -XX:-OmitStackTraceInFastThrow​​ | ​​禁用JVM对频繁抛出异常的堆栈轨迹优化,确保所有异常都有完整的堆栈信息。​​背景​​:JVM默认会省略高频异常(如NullPointerException)的堆栈,可能影响调试。 |
| 11 | -Doracle.jdbc.useNio=false​​ | 禁用Oracle JDBC驱动的NIO(非阻塞IO)模式,强制使用传统IO。​​适用场景​​:某些旧版本驱动或网络环境下NIO可能导致问题。 |
| 12 | -Dsun.zip.disableMemoryMapping=true​​ | ​​禁止使用内存映射文件处理ZIP/JAR,改用流式读取,避免内存映射导致虚拟内存地址耗尽。​​典型问题​​:处理大量JAR文件时可能出现的OutOfMemoryError: Map failed。 |
| 13 | -Dorg.apache.el.parser.COERCE_TO_ZERO=true​​ | ​​强制将空字符串转换为数值0(例如,表单提交的空字段解析为0),避免EL表达式类型转换异常。​​示例​​:${param.value} 若为空会返回0而非报错。 |
| 14 | -Djgroups.bind_addr=0.0.0.0​​ | 设置JGroups(集群通信库)绑定所有可用网络接口(0.0.0.0),确保集群节点间正常通信。​​注​​:需确保防火墙开放相关端口。 |
[## 配置参数逐项说明]

相关推荐
四谎真好看14 小时前
Java 黑马程序员学习笔记(进阶篇18)
java·笔记·学习·学习笔记
桦说编程14 小时前
深入解析CompletableFuture源码实现(2)———双源输入
java·后端·源码
java_t_t14 小时前
ZIP工具类
java·zip
lang2015092815 小时前
Spring Boot优雅关闭全解析
java·spring boot·后端
pengzhuofan16 小时前
第10章 Maven
java·maven
百锦再16 小时前
Vue Scoped样式混淆问题详解与解决方案
java·前端·javascript·数据库·vue.js·学习·.net
刘一说16 小时前
Spring Boot 启动慢?启动过程深度解析与优化策略
java·spring boot·后端
壹佰大多16 小时前
【spring如何扫描一个路径下被注解修饰的类】
java·后端·spring
百锦再16 小时前
对前后端分离与前后端不分离(通常指服务端渲染)的架构进行全方位的对比分析
java·开发语言·python·架构·eclipse·php·maven
DokiDoki之父17 小时前
Spring—注解开发
java·后端·spring