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

news2025/1/8 15:32:45

一、生产常用参数配置

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打印垃圾回收的时间戳信息

帮助分析垃圾回收发生的时间点

-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:+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的值。如果应用需要更多内存,可以适当增加这些值;如果内存资源有限,则需要谨慎设置以避免OOM(Out of Memory)错误。

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

  • 老年代大小:可以通过调整 -XX:SurvivorRatio-XX:NewRatio 来优化老年代和新生代之间的内存分配比例。

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 的回收效率。
3.堆外内存和元空间
  • 元空间大小-XX:MaxMetaspaceSize 如果应用加载了大量的类或者使用了动态代理等技术,可能需要适当增加这个值,防止在类加载过程中因为元空间内存不足而抛出OutOfMemoryError。

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

4.其他调优参数
  • 并发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 日志帮助开发人员识别性能瓶颈,尤其是垃圾回收方面的影响。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ansible-api分析(VariableManager变量)

一. 简述: ansible是一个非常强大的工具,可以支持多种类型(字符,数字,列表,字典等)的变量。除了有大量的内置变量及fact变量,也可以通过多种方式进行变量自定义 。不同方式定义的变量,优先级也不太一样,之…

2025年PMP考试最新报名通知

经PMI和中国国际人才交流基金会研究决定,中国大陆地区2025年第一期PMI认证考试定于3月15日举办。在基金会网站报名参加本次PMI认证考试的考生须认真阅读下文,知悉考试安排及注意事项,并遵守考试有关规定。 一、时间安排 (一&#…

Mysql--基础篇--数据类型(整数,浮点数,日期,枚举,二进制,空间类型等)

MySQL提供了多种数据类型,用于定义表中列的数据格式。选择合适的数据类型不仅可以提高查询性能,还能确保数据的完整性和准确性。 一、数值类型 数值类型用于存储整数、浮点数和定点数。根据精度和范围的不同,数值类型可以分为以下几类&…

1-Transformer算法解读

目录 一.RNN与Transfrmer 二.word2vec 三.自注意力机制 四.辅助向量Q/K/V 五.计算过程 六.整体架构​编辑 七.Bert 一.RNN与Transfrmer RNN(循环神经网络)和Transformer都是深度学习中用于处理序列数据的模型,但它们在结构和性能上有显著的区别。以下是它们的一些…

Java Web开发进阶——Spring Boot与Spring Data JPA

Spring Data JPA 是 Spring 提供的一种面向数据访问的持久化框架,它简化了 JPA 的实现,为开发者提供了一种快速操作数据库的方式。在结合 Spring Boot 使用时,开发者能够快速完成数据库访问层的开发。 1. 介绍Spring Data JPA 1.1 什么是Spr…

【计算机操作系统:一、绪论】

第1章 绪论 1.1 操作系统在计算机系统中的地位 1.1.1 存储程序式计算机的结构和特点 存储程序式计算机(Stored Program Computer)是现代计算机的基础,其概念源于冯诺依曼(John von Neumann)提出的模型。这种计算机架…

如何查看服务器上的MySQL/Redis等系统服务状态和列表

如果呢你知道系统服务名称,要看状态很简单: systemctl status server-name 比如 systemctl status nginxsystemctl status redis # 等 这是一个nginx的示例: 那问题是 当你不知道服务名称时该怎么办。举个例子,比如mysql在启动…

安科瑞Acrel-1000DP分布式光伏监控系统在浙江安吉成3234.465kWp分布式光伏发电项目中的应用

摘 要:分布式光伏发电站是指将光伏发电组件安装在用户的建筑物屋顶、空地或其他适合的场地上,利用太阳能进行发电的一种可再生能源利用方式,与传统的大型集中式光伏电站相比,分布式光伏发电具有更灵活的布局、更低的建设成本和更高…

探索 Vue.js 的动态样式与交互:一个有趣的样式调整应用

修改日期备注2025.1.3初版 一、前言 今天和大家分享在 Vue.js 学习过程中开发的超酷的小应用。这个应用可以让我们通过一些简单的交互元素,如复选框、下拉菜单和输入框,来动态地改变页面上元素的样式哦 让我们一起深入了解一下这个项目的实现过程&…

大数据-268 实时数仓 - ODS层 将 Kafka 中的维度表写入 DIM

点一下关注吧!!!非常感谢!!持续更新!!! Java篇开始了! MyBatis 更新完毕目前开始更新 Spring,一起深入浅出! 目前已经更新到了: H…

把vue项目或者vue组件发布成npm包或者打包成lib库文件本地使用

将vue项目发布成npm库文件,第三方通过npm依赖安装使用;使用最近公司接了一个项目,这个项目需要集成到第三方页面,在第三方页面点击项目名称,页面变成我们的项目页面;要求以npm库文件提供给他们;…

Kafka为什么要放弃Zookeeper

1.Kafka简介 Apache Kafka最早是由Linkedin公司开发,后来捐献给了Apack基金会。 Kafka被官方定义为分布式流式处理平台,因为具备高吞吐、可持久化、可水平扩展等特性而被广泛使用。目前Kafka具体如下功能: 消息队列,Kafka具有系统解耦、流…

【JVM】总结篇-类的加载篇之 类的加载器 和ClassLoader分析

文章目录 类的加载器ClassLoader自定义类加载器双亲委派机制概念源码分析优势劣势如何打破Tomcat 沙箱安全机制JDK9 双亲委派机制变化 类的加载器 获得当前类的ClassLoader clazz.getClassLoader() 获得当前线程上下文的ClassLoader Thread.currentThread().getContextClassLoa…

java 转义 反斜杠 Unexpected internal error near index 1

代码: String str"a\\c"; //出现异常,Unexpected internal error near index 1 //System.out.println(str.replaceAll("\\", "c"));//以下三种都正确 System.out.println(str.replace(\\, c)); System.out.println(str.r…

el-table 实现纵向多级表头

为了实现上图效果,最开始打算用el-row、el-col去实现,但发现把表头和数据分成两大列时,数据太多时会导致所在格高度变高。但由于每一格数据肯定不一样,为保持高度样式一致,就需要我们手动去获取最高格的高度之后再设置…

2025最新版Visual Studio Code安装使用指南

2025最新版Visual Studio Code安装使用指南 Installation and Usage Guide for the Latest Visual Studio Code in 2024 By JacksonML 2025-1-7 1. Visual Studio Code背景 早在二十年前,通用的集成开发环境(Integrated Deveopment Environment, 简称…

Flutter 鸿蒙化 flutter和鸿蒙next混和渲染

前言导读 这一个节课我们讲一下PlatformView的是使用 我们在实战中有可能出现了在鸿蒙next只加载一部分Flutter的情况 我们今天就讲一下这种情况具体实现要使用到我们的PlatformView 效果图 具体实现: 一、Native侧 使用 DevEco Studio工具打开 platform_view_example\oho…

LabVIEW语言学习过程是什么?

学习LabVIEW语言的过程可以分为几个阶段,每个阶段的重点内容逐步加深,帮助你从入门到精通。以下是一个简洁的学习过程: ​ 1. 基础入门阶段 理解图形化编程:LabVIEW是一种图形化编程语言,与传统的文本编程语言不同&am…

Kubernetes Gateway API-4-TCPRoute和GRPCRoute

1 TCPRoute 目前 TCP routing 还处于实验阶段。 Gateway API 被设计为与多个协议一起工作,TCPRoute 就是这样一个允许管理TCP流量的路由。 在这个例子中,我们有一个 Gateway 资源和两个 TCPRoute 资源,它们按照以下规则分配流量&#xff1…

嵌入式SD/TF卡通用协议-SDIO协议

SD卡(SecureDigital MemoryCard)即:安全数码卡,它是在MMC的基础上发展而来,是一种基于半导体快闪记忆器的新一代记忆设备,它被广泛地于便携式装置上使用,例如数码相机、个人数码助理(PDA)和多媒…