当前位置: 首页 > news >正文

JVM生产环境常用参数配置及调优建议

一、生产常用参数配置

JAVA_OPTS="-server -Xms3000m -Xmx3000m -Xmn1500m -XX:+UseG1GC  -XX:ConcGCThreads=8 -XX:+PrintGCDetails  -XX:+PrintGCTimeStamps -Xloggc:./g1-gc.log -XX:MaxMetaspaceSize=256m -XX:-UseGCOverheadLimit -XX:+UseCompressedOops -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=./heap/"

二、常用参数详解  

以下表格里面的参数是以G1垃圾收集器为例,列举生产环境常用的参数,大家可根据自身实际情况进行选择。

参数
含义
说明
-server服务端模式启动 Server VM(服务器虚拟机),优化应用程序的性能,适用于长期运行的生产环境
-Xms堆的初始大小

JVM 启动时堆内存的初始分配大小

-Xmx堆的最大大小堆内存的最大可用内存
-Xmn新生代(Young Generation) 的大小新生代用于存放新创建的对象,JVM 会先进行年轻代的垃圾收集
-XX:+UseG1GC启用 G1垃圾收集器适用于低延迟、高吞吐量的服务端应用。G1 具有低停顿时间的优势,并且能够预测 GC 的时间
-XX:ConcGCThreads设置并发垃圾收集线程数这是 G1 GC 中进行并行垃圾收集的线程数量。设置合适的值可以加速并行 GC,但也会增加 CPU 的负载
-XX:+PrintGCDetails打印垃圾收集的详细信息如 GC 的类型、GC 持续时间、回收的内存量等,帮助分析垃圾回收的行为和性能
-XX:+PrintGCTimeStamps打印垃圾回收的时间戳(秒)

从 JVM 启动开始到 GC 发生的时间差,帮助分析垃圾回收发生的时间点

-Xloggc将 GC 日志输出到文件中可以通过分析日志来优化垃圾收集的配置
-XX:MaxMetaspaceSize设置 Metaspace(类元数据空间)的最大大小Metaspace 存储了 JVM 加载的类的元数据。过大可能导致内存使用过高,过小可能导致类加载失败
-XX:-UseGCOverheadLimit禁用 GC 开销限制默认情况下,如果 JVM 发现长时间进行 GC 并且回收的内存很少,JVM 会抛出 java.lang.OutOfMemoryError。通过禁用该选项,可以避免出现 GC overhead limit exceeded 错误
-XX:+UseCompressedOops启用 Compressed Oops(压缩对象指针)在 64 位的 JVM 中,对象的引用通常是 8 字节的指针,启用 Compressed Oops 可以将其压缩为 4 字节,节省内存空间,提供性能,通常对于堆较大的应用更有意义
-XX:+HeapDumpOnOutOfMemoryError当发生 OutOfMemoryError 时,自动生成堆转储(Heap Dump)可以用来分析内存泄漏和内存问题。堆转储文件可以通过工具如 Eclipse MAT 或 jvisualvm 进行分析
-XX:HeapDumpPath设置堆转储文件的存放路径

指定堆转储文件保存的目录

四、可选参数

 参数含义说明
-XX:SurvivorRatio
 
设置Eden区与Survivor区的比例(默认8:2)可以影响垃圾收集的频率和停顿时间。较大的Survivor区可以减少Minor GC的次数,但每次GC的停顿时间可能会增加;较小的Survivor区则相反
-XX:NewRatio参数用于设置新生代(Young Generation)与老年代(Old Generation)的比例(默认1:2)对于年轻代对象较多的应用,增大新生代的比例可以减少Minor GC的频率;而对于老年代对象较多的应用,减小新生代的比例可以更频繁地进行Minor GC,从而减少Full GC的发生
-XX:+PrintGCDateStamps在垃圾回收日志中打印 GC发生的绝对时间输出的是具体的日期和时间戳,通常是精确到毫秒
-XX:+UseStringDeduplication
 
启用字符串去重可以减少内存占用
-XX:+DisableExplicitGC
 
禁用显式调用System.gc(),避免不必要的GC触发
-XX:+AlwaysPreTouch
 
在启动时预先触碰所有页面减少运行时的延迟
-XX:+ScavengeBeforeFullGC
 
在Full GC之前先进行一次Young GC减少Full GC的频率和停顿时间
-XX:+CMSClassUnloadingEnabled:启用CMS垃圾收集器的类卸载功能适用于老年代较大的应用
-XX:+PrintCommandLineFlags打印命令行的参数帮助开发者了解JVM启动时的完整参数设置

三、JVM调优建议

对于生产环境中常见的 JVM 调优参数,除了上面的设置外,还可以考虑以下优化

1.内存管理优化
  • 堆内存大小:根据应用的实际需求和可用物理内存来调整-Xms-Xmx的值,这两者应该设置为相同的值以避免在运行时动态调整堆大小,这可以减少GC暂停时间。根据你的服务器内存情况,通常建议分配给JVM的堆大小不超过物理内存的75%。对于高并发系统,可能需要更大的堆,但过大的堆可能导致更长的垃圾回收停顿。如果内存资源有限,则需要谨慎设置以避免OOM(Out of Memory)错误。

  • 新生代大小 (-Xmn):根据应用的对象创建情况调整新生代大小。一般来说,较大的新生代可以减少年轻代的垃圾收集次数,减少全量 GC 的发生频率,但同时会增加老年代 GC 的发生频率。常见的建议是:新生代大小设置为堆总大小的 1/3 到 1/2。例如,如果总堆大小是3000MB,那么新生代可以设置为1000MB左右。

  • 新老年代比例

    • 使用-XX:NewRatio来调整新生代与老年代的比例。对于短生命周期的对象较多的应用,可以增大新生代的比例;

    • Eden Space 和 Survivor Space 的比例也可以通过-XX:SurvivorRatio进行调整,以适应对象存活率。

2.垃圾回收优化
  • 垃圾回收日志:建议添加更多的 GC 日志参数来帮助你了解垃圾收集的行为和性能瓶颈,使用工具如GCViewer、GCEasy等来可视化和分析GC日志。例如:

    • -XX:+PrintGCApplicationStoppedTime:打印应用停止时间的日志,帮助分析 GC 停顿的影响。
    • -XX:+PrintGCDateStamps:在 GC 日志中打印时间戳,有助于分析 GC 间隔。
  • G1GC 参数优化:可以进一步调整 G1GC 的参数来优化 GC 性能,具体参数根据应用场景来设置。

    • -XX:MaxGCPauseMillis=200:设置 G1 GC 的最大暂停时间为 200ms,G1 会尽量保证垃圾回收的暂停时间不超过这个值。
    • -XX:G1HeapRegionSize=16M:设置 G1 GC 中堆区的大小,适用于更大的堆,帮助提高 G1 的回收效率。
  • 避免频繁的Full GC

    • 尽量减少长期存活对象的数量,因为它们会直接进入老年代,导致频繁的Full GC。
    • 使用弱引用或软引用来管理缓存或其他可选对象,以便在内存紧张时可以被垃圾回收。
3.堆外内存和元空间
  • 元空间大小:使用-XX:MetaspaceSize-XX:MaxMetaspaceSize来设置元空间的初始大小和最大大小,-XX:MaxMetaspaceSize 如果应用加载了大量的类或者使用了动态代理等技术,可能需要适当增加这个值,防止在类加载过程中因为元空间内存不足而抛出OutOfMemoryError。

  • Direct Memory:对于需要使用大量直接内存的应用(例如 NIO),可以通过设置 -XX:MaxDirectMemorySize 限制直接内存的大小。

4.监控和调优
  • 使用JVM自带的工具如jstatjmapjconsole或者第三方监控工具如Prometheus+Grafana、New Relic等来监控JVM的运行状态,包括GC活动、堆使用情况等。
  • 根据监控结果不断调整JVM参数,找到最适合你系统的配置。
5.其他调优参数
  • 并发GC线程数-XX:ConcGCThreads=8表示使用8个并发GC线程。这个值可以根据实际CPU核心数和应用负载进行调整。一般来说,可以设置为CPU核心数的一半或稍多一些。

  • Thread Stack Size: -Xss 设置线程栈大小,默认情况下,每个线程分配 1MB 的栈空间。对于高并发应用,如果线程栈较大,可以考虑减小 -Xss 参数的值,以减少每个线程占用的内存。

  • JVM 垃圾回收的并行度

    • -XX:ParallelGCThreads=8:针对于ParallelGC,设置并行 GC 线程数,适用于多核 CPU 系统,调优时可以增加此值来加速 GC。

四、总结

具体的调优大家还需要结合实际的应用负载和运行环境进行实际情况调整,下面是调优的一些常见方向,这些设置和调优参数在生产环境中非常重要,帮助 JVM 运行时更加稳定和高效。

  • 堆内存调优:根据应用的内存需求,调整堆大小、年轻代和老年代的比例。
  • GC 选择和调优:根据应用对延迟和吞吐量的需求,选择合适的 GC,并调整相关参数来减少 GC 停顿。
  • 内存泄漏检测:启用堆转储以便在内存溢出时进行分析,减少内存泄漏的风险。
  • 日志分析:通过 GC 日志帮助开发人员识别性能瓶颈,尤其是垃圾回收方面的影响。

相关文章:

JVM生产环境常用参数配置及调优建议

一、生产常用参数配置 JAVA_OPTS"-server -Xms3000m -Xmx3000m -Xmn1500m -XX:UseG1GC -XX:ConcGCThreads8 -XX:PrintGCDetails -XX:PrintGCTimeStamps -Xloggc:./g1-gc.log -XX:MaxMetaspaceSize256m -XX:-UseGCOverheadLimit -XX:UseCompressedOops -XX:HeapDumpOnOu…...

Spring Boot 3 实现 MySQL 主从数据库之间的数据同步

✅ Spring Boot 3 实现 MySQL 主从数据库之间的数据同步 在实际项目中,为了提高 系统的读性能 和 数据的可用性,通常会使用 主从数据库架构。Spring Boot 提供了对 多数据源 的良好支持,可以轻松配置 主从数据库 的数据同步,实现…...

【小程序开发】- 小程序版本迭代指南(版本发布教程)

一,版本号 版本号是小程序版本的标识,通常由一系列数字组成,如 1.0.0、1.1.0 等。版本号的格式通常是 主版本号.次版本号.修订号 主版本号:当小程序有重大更新或不兼容的更改时,主版本号会增加。 次版本号&#xff1a…...

MySQL 间隙锁避免“可重复读”出现“幻读”

在数据库事务处理中,可重复读(Repeatable Read)是一个常用的隔离级别,但其默认行为可能导致幻读现象。然而,在 MySQL 的实现中,通过 **间隙锁(Gap Lock)**机制,能够避免幻…...

揭秘区块链隐私黑科技:零知识证明如何改变未来

文章目录 1. 引言:什么是零知识证明?2. 零知识证明的核心概念与三大属性2.1 完备性(Completeness)2.2 可靠性(Soundness)2.3 零知识性(Zero-Knowledge) 3. 零知识证明的工作原理4. 零…...

JavaWeb开发:从入门到精通

近年来,JavaWeb开发已经成为了互联网开发领域的重要技术之一。无论是大型企业还是个人项目,都离不开JavaWeb开发。本文将为您介绍JavaWeb开发的基本概念、常用技术和开发流程,帮助您快速入门并掌握这一技术。 一、JavaWeb开发的基本概念 Jav…...

2025年01月07日Github流行趋势

项目名称:khoj 项目地址url:https://github.com/khoj-ai/khoj项目语言:Python历史star数:20105今日star数:363项目维护者:debanjum, sabaimran, MythicalCow, aam-at, shantanuSakpal项目简介:你…...

c#集成npoi根据excel模板导出excel

NuGet中安装npoi 创建excel模板,替换其中的内容生成新的excel文件。 例子中主要写了这四种情况: 1、替换单个单元格内容; 2、替换横向多个单元格; 3、替换表格; 4、单元格中插入图片; using System.IO; …...

Vue2移动端(H5项目)项目封装switch组件支持动态设置开启关闭背景色、值及组件内显示文字描述、禁用、switch 的宽度

前言 近期产品需求&#xff1a;Vue2移动端项目需要在switch开关内显示文字&#xff0c;看Vantui没有对应功能&#xff0c;因此自己手撸写了这个组件。 一、最终效果 二、参数配置 1、代码示例&#xff1a; <t-switch v-model"check"/>2、配置参数&#xff08;…...

MATLAB语言的语法糖

MATLAB语言的语法糖 引言 在编程语言的发展历程中&#xff0c;语法糖&#xff08;Syntactic Sugar&#xff09;被广泛提及。它指的是一种编程语言的语法特性&#xff0c;旨在使代码更易读、更易写&#xff0c;虽然这些特性并不增加语言的表达能力&#xff0c;但能使程序员的生…...

数字IC设计高频面试题

在数字IC设计领域&#xff0c;面试是评估候选人技术能力和问题解决能力的重要环节。数字IC设计的复杂性和要求在不断提高。面试官通常会提出一系列面试题&#xff0c;以考察应聘者在数字设计、验证、时钟管理、功耗优化等方面的专业知识和实践经验。 这些题目不仅涉及理论知识…...

OpenCV 4.5至4.10版本更新概述

OpenCV 4.5至4.10版本更新概述 OpenCV 从 4.5 到 4.10 版本的更迭中&#xff0c;每个版本都引入了新功能、优化和修复。以下是主要版本的更新内容概述&#xff1a; OpenCV 4.5.x 系列 4.5.0 (2020年10月) 新增对 YOLOv4 的支持。引入 DNN 模块的改进&#xff0c;包括对 ONNX …...

OSPF - LSA对照表

LSA的三要素&#xff0c;如何唯一表示一条LSA  Type&#xff1a;表示是几类的LSA  Link-id&#xff1a;这个比较特殊&#xff0c;不同的LSA的Link-ID不同  Advertising router&#xff1a;谁产生的LSA 常用的就是1、2、3、4、5、7型LSA 点击蓝字跳转LSA详细介绍(持续更新中…...

游戏引擎学习第77天

仓库: https://gitee.com/mrxiao_com/2d_game 回顾昨天的 bug 今天我们继续开发进度&#xff0c;进行调试昨天代码的问题&#xff0c;主要是关于如何跟踪玩家和敌人在世界中的高度位置。虽然我们做的是一款 2D 游戏&#xff0c;但我们希望能够处理多层的房间&#xff0c;玩家…...

【项目实战1】五子棋游戏

目录 C语言编程实现五子棋&#xff1a;&#xff1a; game.h game.c 1.打印菜单 2.打印棋盘 3.玩家下棋 4.判断五子连珠 5.判断输赢 6.游戏运行 game.c完整源代码展示 test.c C语言编程实现五子棋&#xff1a;&#xff1a; game.h #pragma once #include<stdio.h> …...

HTML5 动画效果:淡入淡出(Fade In/Out)详解

HTML5 动画效果&#xff1a;淡入淡出&#xff08;Fade In/Out&#xff09;详解 淡入淡出&#xff08;Fade In/Out&#xff09;是一种常见的动画效果&#xff0c;使元素逐渐显现或消失&#xff0c;增强用户体验。以下是淡入淡出的详细介绍及实现示例。 1. 淡入淡出的特点 平滑…...

Conmi的正确答案——Cordova使用“src-cordova/config.xml”编辑“Android平台”的“uses-permission”

Cordova版本&#xff1a;12.0.0 (cordova-lib12.0.1) 1、配置例程&#xff1a; <platform name"android"><config-file target"AndroidManifest.xml" parent"/manifest"><uses-permission android:name"android.permission…...

在Mysql环境下对数据进行增删改查

一、插入数据&#xff1a; insert into 表名 [(字段名)] values (字段对应的值1,字段对应的值2,…)[,(字段对应的值1,字段对应的值2,…)]; insert into students (id,name,age,height,gender,cls_id,is_delete) values (0,小明,18,180.00,2,1,0)在学生表中插入“小明”数据的…...

Spring 设计模式:经典设计模式

Spring 设计模式&#xff1a;经典设计模式 引言 Spring 框架广泛使用了经典设计模式。 这些模式在 Spring 内部发挥着重要作用。 通过理解这些设计模式在 Spring 中的应用&#xff0c;开发者可以更深入地掌握 Spring 框架的设计哲学和实现细节。 经典设计模式 控制反转&am…...

OneFlow和PyTorch在性能上有哪些区别?

OneFlow 和 PyTorch 在性能上的区别主要体现在以下几个方面&#xff1a; 本篇文章的目录 分布式训练性能 硬件利用率和显存优化 模型训练速度 OneFlow&#xff1a;默认采用静态图模式&#xff0c;在模型训练前会对计算图进行编译优化&#xff0c;能够减少运行时的开销&…...

【位运算】消失的两个数字(hard)

消失的两个数字&#xff08;hard&#xff09; 题⽬描述&#xff1a;解法&#xff08;位运算&#xff09;&#xff1a;Java 算法代码&#xff1a;更简便代码 题⽬链接&#xff1a;⾯试题 17.19. 消失的两个数字 题⽬描述&#xff1a; 给定⼀个数组&#xff0c;包含从 1 到 N 所有…...

关于iview组件中使用 table , 绑定序号分页后序号从1开始的解决方案

问题描述&#xff1a;iview使用table 中type: "index",分页之后 &#xff0c;索引还是从1开始&#xff0c;试过绑定后台返回数据的id, 这种方法可行&#xff0c;就是后台返回数据的每个页面id都不完全是按照从1开始的升序&#xff0c;因此百度了下&#xff0c;找到了…...

Cloudflare 从 Nginx 到 Pingora:性能、效率与安全的全面升级

在互联网的快速发展中&#xff0c;高性能、高效率和高安全性的网络服务成为了各大互联网基础设施提供商的核心追求。Cloudflare 作为全球领先的互联网安全和基础设施公司&#xff0c;近期做出了一个重大技术决策&#xff1a;弃用长期使用的 Nginx&#xff0c;转而采用其内部开发…...

新能源汽车智慧充电桩管理方案:新能源充电桩散热问题及消防安全监管方案

随着新能源汽车的快速普及&#xff0c;充电桩作为核心配套设施&#xff0c;其安全性与可靠性备受关注。然而&#xff0c;在高温、高负荷运行环境下&#xff0c;充电桩的散热问题与消防安全隐患日益凸显&#xff0c;成为制约行业发展的关键瓶颈。 如何通过智慧化管理手段优化散…...

论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一)

宇树机器人多姿态起立控制强化学习框架论文解析 论文解读&#xff1a;交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架&#xff08;一&#xff09; 论文解读&#xff1a;交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化…...

云原生玩法三问:构建自定义开发环境

云原生玩法三问&#xff1a;构建自定义开发环境 引言 临时运维一个古董项目&#xff0c;无文档&#xff0c;无环境&#xff0c;无交接人&#xff0c;俗称三无。 运行设备的环境老&#xff0c;本地环境版本高&#xff0c;ssh不过去。正好最近对 腾讯出品的云原生 cnb 感兴趣&…...

HashMap中的put方法执行流程(流程图)

1 put操作整体流程 HashMap 的 put 操作是其最核心的功能之一。在 JDK 1.8 及以后版本中&#xff0c;其主要逻辑封装在 putVal 这个内部方法中。整个过程大致如下&#xff1a; 初始判断与哈希计算&#xff1a; 首先&#xff0c;putVal 方法会检查当前的 table&#xff08;也就…...

回溯算法学习

一、电话号码的字母组合 import java.util.ArrayList; import java.util.List;import javax.management.loading.PrivateClassLoader;public class letterCombinations {private static final String[] KEYPAD {"", //0"", //1"abc", //2"…...

4. TypeScript 类型推断与类型组合

一、类型推断 (一) 什么是类型推断 TypeScript 的类型推断会根据变量、函数返回值、对象和数组的赋值和使用方式&#xff0c;自动确定它们的类型。 这一特性减少了显式类型注解的需要&#xff0c;在保持类型安全的同时简化了代码。通过分析上下文和初始值&#xff0c;TypeSc…...

CVPR2025重磅突破:AnomalyAny框架实现单样本生成逼真异常数据,破解视觉检测瓶颈!

本文介绍了一种名为AnomalyAny的创新框架&#xff0c;该方法利用Stable Diffusion的强大生成能力&#xff0c;仅需单个正常样本和文本描述&#xff0c;即可生成逼真且多样化的异常样本&#xff0c;有效解决了视觉异常检测中异常样本稀缺的难题&#xff0c;为工业质检、医疗影像…...