在Tomcat     conf/catalina.bat或catalina.sh中 的最上面增加参数

1. 初步调整参数(缓解问题)
set JAVA_OPTS=
-Xms6g -Xmx6g 
-Xmn3g                    # 增大新生代,减少对象过早晋升到老年代
-XX:MetaspaceSize=256m 
-XX:MaxMetaspaceSize=1g 
-XX:+UseG1GC 
-XX:MaxGCPauseMillis=200 
-XX:+ParallelRefProcEnabled  # 加速引用处理
-XX:+HeapDumpOnOutOfMemoryError 
-XX:HeapDumpPath=./heapdump.hprof --JDK9使用参数
-Xlog:gc*,gc+heap=debug:file=./logs/gc.log:time,uptimemillis:filecount=10,filesize=10M--JDK8及以下使用参数 
-Xloggc:./logs/gc.log -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=10  -XX:GCLogFileSize=10M

--JDK9使用参数

set JAVA_OPTS= -Xms6g -Xmx6g  -Xmn3g -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=1g -XX:+UseG1GC -XX:MaxGCPauseMillis=200 -XX:+ParallelRefProcEnabled -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=./heapdump.hprof -Xlog:gc*,gc+heap=debug:file=./logs/gc.log:time,uptimemillis:filecount=10,filesize=10M

--JDK8及以下使用参数

set JAVA_OPTS= -Xms6g -Xmx6g  -Xmn3g -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=1g -XX:+UseG1GC -XX:MaxGCPauseMillis=200 -XX:+ParallelRefProcEnabled -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=./heapdump.hprof -Xloggc:./logs/gc.log -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=10  -XX:GCLogFileSize=10M
2. 堆外内存限制(若 Netty 使用 Direct Buffer)
-XX:MaxDirectMemorySize=2g  # 限制堆外内存,默认与 -Xmx 相同

以下是每个参数的详细解释及其作用:


1. -Xms6g 和 -Xmx6g

  • 含义

    • -Xms6g:设置 JVM 堆内存的初始大小为 6GB。

    • -Xmx6g:设置 JVM 堆内存的最大大小为 6GB。

  • 作用

    • 将堆的初始值和最大值设为相同,避免堆动态扩展时的性能开销

    • 6GB 的堆大小适用于需要处理高并发或大数据的应用场景。

  • 注意事项

    • 若堆内存不足(OOM 错误),需结合应用需求适当增大 -Xmx,但需考虑物理内存限制。


2. -Xmn3g

  • 含义

    • 设置 新生代(Young Generation)的大小为 3GB。

  • 作用

    • 新生代是对象初次分配的区域,较大的新生代可减少对象过早晋升到老年代(Old Generation)的频率。

    • 默认新生代与老年代比例为 1:2(如 -Xmn3g 时,老年代为 6g - 3g = 3g)。

  • 调优场景

    • 适合短生命周期对象较多的应用(如 Web 请求的临时对象),减少 Full GC 频率。


3. -XX:MetaspaceSize=256m 和 -XX:MaxMetaspaceSize=1g

  • 含义

    • MetaspaceSize:设置 元空间(Metaspace)的初始大小为 256MB。

    • MaxMetaspaceSize:设置 元空间的最大大小为 1GB。

  • 作用

    • 元空间用于存储类的元数据(如类信息、方法字节码),取代 Java 8 之前的永久代(PermGen)。

    • 设置初始大小避免频繁的元空间动态扩展;设置上限防止元空间无限膨胀(如类加载器泄漏)。

  • 注意事项

    • 若应用频繁加载/卸载类(如动态代理),需适当增大 MaxMetaspaceSize


4. -XX:+UseG1GC

  • 含义

    • 启用 G1(Garbage-First)垃圾回收器

  • 作用

    • G1 是面向大堆(>4GB)的垃圾回收器,通过分代和分区(Region)策略,平衡吞吐量和低延迟。

    • 特点:

      • 并发标记:与用户线程并行执行部分 GC 操作。

      • 可预测停顿:通过 MaxGCPauseMillis 控制目标停顿时间。

      • 混合回收:在回收新生代时,同时回收部分老年代。


5. -XX:MaxGCPauseMillis=200

  • 含义

    • 设置 G1 垃圾回收器的 目标最大停顿时间为 200 毫秒。

  • 作用

    • G1 会尽量调整 GC 策略(如每次回收的 Region 数量)以满足该目标。

    • 较小的值(如 50ms)会减少单次 GC 停顿时间,但可能增加 GC 频率。

  • 注意事项

    • 这是一个“软目标”,JVM 会尽力达成,但不保证绝对不超过。


6. -XX:+ParallelRefProcEnabled

  • 含义

    • 启用 并行处理引用对象(如软引用、弱引用、虚引用、Finalizer)。

  • 作用

    • 加速引用对象的处理,减少 Full GC 的停顿时间。

    • 默认情况下,引用处理是单线程的,可能成为 Full GC 的瓶颈。


7. -XX:+HeapDumpOnOutOfMemoryError 和 -XX:HeapDumpPath=./heapdump.hprof

  • 含义

    • HeapDumpOnOutOfMemoryError:在发生 OOM 时自动生成堆转储(Heap Dump)。

    • HeapDumpPath:指定堆转储文件的保存路径(如 ./heapdump.hprof)。

  • 作用

    • 堆转储是内存快照,用于分析 OOM 时的内存占用情况(如内存泄漏)。

    • 默认路径为当前工作目录,建议指定固定目录(如 ./logs)。


8. -Xlog:gc*,gc+heap=debug:file=./logs/gc.log:time,uptimemillis:filecount=10,filesize=10M

  • 含义

    • 配置详细的 GC 日志输出

  • 参数分解

    • gc*:记录所有 GC 事件。

    • gc+heap=debug:启用堆内存变化的调试信息。

    • file=./logs/gc.log:日志文件路径。

    • time,uptimemillis:日志中显示时间戳和 JVM 启动后的毫秒数。

    • filecount=10,filesize=10M:保留最多 10 个日志文件,每个文件最大 10MB。

  • 作用

    • 通过 GC 日志分析 GC 频率、停顿时间、内存回收效率。

    • 示例日志片段:

      复制

      下载

      [2023-10-01T12:34:56.789+0800][12345ms] GC(0) Pause Young (Normal) 2048M->512M(6144M) 50ms

9. -XX:MaxDirectMemorySize=2g

  • 含义

    • 设置 JVM 堆外内存(Direct Memory)的最大大小为 2GB。

  • 作用

    • 堆外内存由 ByteBuffer.allocateDirect() 或 Netty 的 PooledByteBuf 分配,不经过 GC 管理。

    • 默认值为 -Xmx(即与堆内存相同),显式设置可防止堆外内存泄漏导致系统崩溃。

  • 注意事项

    • Netty 等 NIO 框架大量使用堆外内存,需结合应用实际需求调整此值。


参数分类总结

类别参数示例核心作用
堆内存-Xms6g -Xmx6g -Xmn3g控制堆大小及分代比例
元空间-XX:MetaspaceSize=256m管理类元数据内存
垃圾回收器-XX:+UseG1GC选择高效低延迟的 GC 算法
GC调优-XX:MaxGCPauseMillis=200平衡吞吐量和停顿时间
诊断工具-XX:+HeapDumpOnOutOfMemoryError捕获 OOM 时的内存快照
日志与监控-Xlog:gc*...记录 GC 行为供后续分析
堆外内存-XX:MaxDirectMemorySize=2g防止堆外内存泄漏

最终建议

  1. 监控验证

    • 部署后使用 jstatjcmd 或 VisualVM 实时监控内存和 GC 行为。

    • 检查 GC 日志中 Full GC 的频率和耗时。

  2. 堆转储分析

    • 若再次发生 OOM,使用 MAT 分析 heapdump.hprof,重点关注 Retained Heap 最大的对象。

  3. Netty 专项检查

    • 添加 -Dio.netty.leakDetection.level=PARANOID 参数,启用 Netty 内存泄漏检测。

    • 确保所有 ByteBuf 通过 release() 释放。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/85412.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/85412.shtml
英文地址,请注明出处:http://en.pswp.cn/diannao/85412.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

WSL2 安装与Docker安装

注意:如没有科学上网请勿尝试,无法判断是否会因网络错误导致的安装失败!!! WSL2(Windows Subsystem for Linux 2) 功能简介: WSL2 是微软提供的在 Windows 上运行完整 Linux 内核的…

Redis的安装与使用

网址:Spring Data Redis 安装包:Releases tporadowski/redis GitHub 解压后 在安装目录中打开cmd 打开服务(注意:每次客户端连接都有先打开服务!!!) 按ctrlC退出服务 客户端连接…

springboot-响应接收与ioc容器控制反转、Di依赖注入

1.想将服务器中的数据返回给客户端,需要在controller类上加注解:ResponseBody; 这个注解其实在前面已经使用过,RestController其实就包含两个注解: Controller ResponseBody 返回值如果是实体对象/集合,将会转换为j…

将材质球中的纹理属性对应的贴图保存至本地

通过Texture2D的EncodeToPNG方法将纹理转为图片形式 material.GetTexture方法通过属性名获取纹理贴图 material.SetTexture方法通过属性名设置纹理贴图 属性名可在shader代码中查看 using UnityEngine; using System.IO;public class TextureSaver : MonoBehaviour {public…

MySQL半同步复制配置和参数详解

目录 1 成功配置主从复制 2 加载插件 3 半同步复制监控 4 半同步复制参数 1 成功配置主从复制 操作步骤参考:https://blog.csdn.net/zyb378747350/article/details/148309545 2 加载插件 #主库上 MySQL 8.0.26 之前版本: mysql>INSTALL PLUGIN rpl_semi_syn…

【笔记】Windows 成功部署 Suna 开源的通用人工智能代理项目部署日志

#工作记录 本地部署运行截图 kortix-ai/suna: Suna - 开源通用 AI 代理 项目概述 Suna 是一个完全开源的 AI 助手,通过自然对话帮助用户轻松完成研究、数据分析等日常任务。它结合了强大的功能和直观的界面,能够理解用户需求并提供结果。其强…

PCB制作入门

文章目录 1 嘉立创使用旋转 2元器件选择MP2315SLM7815与LM7915 1 嘉立创使用 旋转 空格旋转 2元器件选择 MP2315S MP2315S 是一款内置功率 MOSFET 的高效率同步整流降压开关变换器。 其输入电压范围为 4.5V 至 24V ,能实现 3A 连续输出电流,负载与…

2025——》NumPy中的np.logspace使用/在什么场景下适合使用np.logspace?NumPy中的np.logspace用法详解

1.NumPy中的np.logspace使用: 在 NumPy 中,np.logspace函数用于生成对数尺度上等间距分布的数值序列,适用于科学计算、数据可视化等需要对数间隔数据的场景。以下是其核心用法和关键细节: 一、基础语法与参数解析: numpy.logspace(start, stop, num=50, endpoint=True, ba…

Java实现中文姓名转拼音生成用户信息并写入文件

中文姓名转拼音 Java实现中文姓名转拼音生成用户信息并写入文件(shili域名版)一、项目背景与功能简介二、技术栈与核心组件2.1 主要技术2.2 功能模块 三、核心代码解析3.1 主函数逻辑(流程控制)3.2 拼音转换模块(核心功…

Google car key:安全、便捷的汽车解锁新选择

有了兼容的汽车和 Android 手机,Google car key可让您将Android 手机用作车钥匙。您可以通过兼容的 Android 手机锁定、解锁、启动汽车并执行更多功能。但是,Google car key安全吗?它是如何工作的?如果我的手机电池没电了怎么办&a…

如何轻松将 iPhone 备份到外部硬盘

当您的iPhone和电脑上的存储空间有限时,您可能希望将iPhone备份到外部硬盘上,这样可以快速释放iPhone上的存储空间,而不占用电脑上的空间,并为您的数据提供额外的安全性。此外,我们还提供 4 种有效的解决方案&#xff…

AI炼丹日志-22 - MCP 自动操作 Figma+Cursor 自动设计原型

MCP 基本介绍 官方地址: https://modelcontextprotocol.io/introduction “MCP 是一种开放协议,旨在标准化应用程序向大型语言模型(LLM)提供上下文的方式。可以把 MCP 想象成 AI 应用程序的 USB-C 接口。就像 USB-C 提供了一种…

机器学习-线性回归基础

一、什么是回归 依据输入x写出一个目标值y的计算方程,求回归系数的过程就叫回归。简言之:根据题意列出方程,求出系数的过程就叫做回归。 回归的目的是预测数值型的目标值y,分类的目的预测标称型的目标值y。 二、线性回归 2.1线性…

解决RAGFlow(v0.19.0)有部分PDF无法解析成功的问题。

ragflow版本为:v0.19.0 1.解析的时候报错:Internal server error while chunking: Coordinate lower is less than upper。 看报错怀疑是分片的问题,于是把文档的切片方法中的“建议文本块大小”数值(默认512)调小&…

【前端】html2pdf实现用前端下载pdf

npm安装完后&#xff0c;编写代码。 <template><div id"pdf-content">需要被捕获为pdf的内容</div> </template><script> import html2pdf from html2pdf.js;export default {methods: {downloadPdf() {const element document.getE…

从零实现富文本编辑器#4-浏览器选区模型的核心交互策略

先前我们提到了&#xff0c;数据模型的设计是编辑器的基础模块&#xff0c;其直接影响了选区模块的表示。选区模块的设计同样是编辑器的基础部分&#xff0c;编辑器应用变更时操作范围的表达&#xff0c;就需要基于选区模型来实现&#xff0c;也就是说选区代表的意义是编辑器需…

数论——质数和合数及求质数

质数、合数和质数筛 质数和合数及求质数试除法判断质数Eratosthenes筛选法&#xff08;埃氏筛&#xff09;线性筛&#xff08;欧拉筛&#xff09; 质数有关OJ列举P1835 素数密度 - 洛谷简单的哥赫巴德猜想和cin优化 质数和合数及求质数 一个大于 1 的自然数&#xff0c;除了 1…

多商户系统源码性能调优实战:从瓶颈定位到高并发架构设计!

在电商业务爆发式增长的今天&#xff0c;多商户系统作为支撑平台方、入驻商家和终端消费者的核心枢纽&#xff0c;其性能表现直接决定了商业变现效率。当你的商城在促销期间崩溃&#xff0c;损失的不仅是订单&#xff0c;更是用户信任。 本文将深入剖析多商户系统源码性能优化的…

JDBC连不上mysql:Unable to load authentication plugin ‘caching_sha2_password‘.

最近为一个spring-boot项目下了mysql-9.3.0&#xff0c;结果因为mysql版本太新一直报错连不上。 错误如下&#xff1a; 2025-06-01 16:19:43.516 ERROR 22088 --- [http-nio-8080-exec-2] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispat…

超标量处理器设计6-指令解码

1. 指令缓存 指令缓存本质上是一个FIFO, 它能够将指令按照程序中指定的顺序存储起来&#xff0c;这样指令在解码的时候&#xff0c;仍然可以按照程序中指定的顺序进行解码。指令缓存是超标量处理器中必须的部件&#xff0c;其原因有两个&#xff1a; 1. 每周期可以取指的个数大…