大内存生产环境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),确保集群节点间正常通信。​​注​​:需确保防火墙开放相关端口。 |
[## 配置参数逐项说明]

相关推荐
yaoxin5211231 小时前
390. Java IO API - WatchDir 示例
java·前端·python
zhangchaoxies3 小时前
如何在 Go 中安全复制接口指针所指向的值
jvm·数据库·python
Halo_tjn3 小时前
Java 基于字符串相关知识点
java·开发语言·算法
梦想的颜色3 小时前
java 利用redis来限制用户频繁点击
java·开发语言
m0_734949794 小时前
怎么利用Navicat进行调整备份文件压缩等级_详细配置与操作步骤
jvm·数据库·python
PH = 74 小时前
OverlayFS联合文件系统使用示例
java·linux·服务器
m0_741173334 小时前
如何处理SQL中的NULL值_使用ISNULL或COALESCE函数
jvm·数据库·python
AC赳赳老秦4 小时前
OpenClaw进阶技巧:批量修改文件内容、替换关键词,解放双手
java·linux·人工智能·python·算法·测试用例·openclaw
Java小白笔记5 小时前
OpenClaw 实战方法论
java·开发语言·人工智能·ai·全文检索·ai编程·ai写作
步辞5 小时前
css伪类选择器-nth-child应用技巧_循环选择列表或表格行的实现方法
jvm·数据库·python