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

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

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

相关文章

Nginx:会话保持

会话保持 是指在负载均衡环境中,确保来自同一用户的多个请求都发送到同一个后端服务器。这通常用于那些需要记住用户状态或上下文的应用程序,例如购物车、登录状态等。 会话保持的重要性 用户体验:保证用户在整个会话期间的一致性体验,避免因不同服务器间的数据不同步导致…

SEO内容优化:如何通过用户需求赢得搜索引擎青睐?

在谷歌SEO优化中,内容一直是最重要的因素之一。但要想让内容真正发挥作用,关键在于满足用户需求,而不是简单地堆砌关键词。谷歌的算法越来越智能化,更注重用户体验和内容的实用性。 了解目标用户的需求。通过工具如Google Trends…

Clisoft SOS与CAD系统集成

Clisoft SOS与CAD系统集成 以下内容大部分来自官方文档,目前只用到与Cadence Virtuoso集成,其他还未用到,如有问题或相关建议,可以留言。 与Keysight ADS集成 更新SOS客户端配置文件sos.cfg,以包含支持ADS的模板&am…

Unity-Mirror网络框架从入门到精通之Attributes属性介绍

前言 在现代游戏开发中,网络功能日益成为提升游戏体验的关键组成部分。Mirror是一个用于Unity的开源网络框架,专为多人游戏开发设计。它使得开发者能够轻松实现网络连接、数据同步和游戏状态管理。本文将深入介绍Mirror的基本概念、如何与其他网络框架进…

【计算机视觉】单目深度估计模型-Depth Anything-V2

概述 本篇将简单介绍Depth Anything V2单目深度估计模型,该模型旨在解决现有的深度估计模型在处理复杂场景、透明或反射物体时的性能限制。与前一代模型相比,V2版本通过采用合成图像训练、增加教师模型容量,并利用大规模伪标签现实数据进行学…

uni-app图文列表到详情页面切换

需求:参考若依框架后,想实现首页浏览文章列表,没有合适的样式参考,所以需要有效果做到“图文列表到详情页面切换”,查阅了一下案例 发现有相应的案例,在导航栏“模板”中找到了 DCloud 插件市场 PC电脑端访…

日志服务 SQL 引擎全新升级

作者:戴志勇、顾汉杰(执少) SQL 作为 SLS 基础功能,每天承载了用户大量日志数据的分析请求,既有小数据量的快速查询(如告警、即席查询等);也有上万亿数据规模的报表级分析。SLS 作为…

【微服务】5、服务保护 Sentinel

Sentinel学习内容概述 Sentinel简介与结构 Sentinel是Spring Cloud Alibaba的组件,由阿里巴巴开源,用于服务流量控制和保护。其内部核心库(客户端)包含限流、熔断等功能,微服务引入该库后只需配置规则。规则配置方式有…

matlab编写Newton插值多项式

定义: 即: clear x [1, 2, 3, 4]; % x坐标 y [2, 1, 4, 3]; % y坐标 % 定义目标插值点 xi 2.5;% x: 已知数据点的x坐标% y: 已知数据点的y坐标% xi: 插值点,可以是一个数或一个向量n length(x);% 初始化差商矩阵F zeros(n, n);F(:,1…

unity学习14:unity里的C#脚本的几个基本生命周期方法, 脚本次序order等

目录 1 初始的C# 脚本 1.1 初始的C# 脚本 1.2 创建时2个默认的方法 2 常用的几个生命周期方法 2.1 脚本的生命周期 2.1.1 其中FixedUpdate 方法 的时间间隔,是在这设置的 2.2 c#的基本语法别搞混 2.2.1 基本的语法 2.2.2 内置的方法名,要求更严…

东土科技参股广汽集团飞行汽车初创公司,为低空经济构建新型产业生态

近日,广汽集团旗下专注于飞行汽车领域的初创公司广东高域科技有限公司于2024年12月31日正式成立,在穿透后的股东信息中,东土科技通过广州瓴云科技投资合伙企业(有限合伙)赫然在列。 此前12月18日,广汽集团…

基于Elasticsearch8的向量检索实现相似图形搜索

Elasticsearch8版本增加了KNN向量检索,可以基于此功能实现以图搜图功能。 1、首先创建索引,es提供了类型为dense_vector的字段,用于存储向量,其中dims是向量维度,可以不配置,es会根据第一条插入的向量维度…

PHP如何删除数组中的特定值?

php 中删除数组特定值的方法有三种:unset():直接删除指定索引的值,但会保留数组索引结构和未删除元素,适合小数组。array_filter():根据自定义回调函数筛选数组元素,返回一个新数组,原数组不变&…

计算效率提升 10 倍,存储成本降低 60%,灵犀科技基于 Apache Doris 建设统一数据服务平台

导读:灵犀科技早期基于 Hadoop 构建大数据平台,在战略调整和需求的持续扩增下,数据处理效率、查询性能、资源成本问题随之出现。为此,引入 Apache Doris 替换了复杂技术栈,升级为集存储、加工、服务为一体的统一架构&a…

Netty中用了哪些设计模式?

大家好,我是锋哥。今天分享关于【Netty中用了哪些设计模式?】面试题。希望对大家有帮助; Netty中用了哪些设计模式? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 Netty 是一个高性能的网络通信框架,广泛…

Linux操作系统——多线程互斥

目录 一、前言 二、线程互斥 三、多线程访问临界资源所导致的问题 四、Mutex互斥量 1、锁的接口及其使用 定义一个锁(造锁) 初始化锁(改锁) 摧毁锁 上锁 解锁 锁的使用 五、锁的宏初始化 六、锁的原理 七、C封装互斥锁 八、可重入与线程…

conda指定路径安装虚拟python环境

DataBall 助力快速掌握数据集的信息和使用方式,会员享有 百种数据集,持续增加中。 需要更多数据资源和技术解决方案,知识星球: “DataBall - X 数据球(free)” -------------------------------------------------------------…

鸿蒙 ArkUI实现地图找房效果

常用的地图找房功能,是在地图上添加区域、商圈、房源等一些自定义 marker,然后配上自己应用的一些筛选逻辑构成,在这里使用鸿蒙 ArkUI 简单实现下怎么添加区域/商圈、房源等 Marker. 1、开启地图服务 在华为开发者官网,注册应用&…

Kubernetes开发环境minikube | 开发部署apache tomcat web单节点应用

minikube是一个主要用于开发与测试Kubernetes应用的运行环境 本文主要描述在minikube运行环境中部署J2EE tomcat web应用 minikube start --force minikube status 如上所示,在Linux中启动minikube运行环境 service docker start docker version service docker …

Kafka为什么要放弃Zookeeper

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