首页 > 其他分享 >JVM 参数配置入门与优化案例

JVM 参数配置入门与优化案例

时间:2024-11-12 10:17:01浏览次数:3  
标签:设置 入门 新生代 案例 XX GC 内存 JVM

文章目录


JVM 参数配置入门与优化案例

在 Java 应用的生产环境中,合理设置 JVM 参数尤为关键,因为它直接影响到程序的稳定性和性能。JVM 参数众多,但实际中主要关注堆内存(Heap)、直接内存(Direct Memory)、元空间(Metaspace)和垃圾回收策略(GC)。本文通过一个 Netty 服务示例介绍如何配置 JVM 启动参数,并提供相关参数设置的解释和优化建议。

基础内存参数配置

堆内存(Heap Memory)

Java 堆内存用于存放应用程序中的对象实例,是 GC 回收的主要区域。合理配置堆内存大小能帮助程序在内存紧张情况下稳定运行。

  • -Xms-Xmx-Xms 表示初始堆大小,-Xmx 表示最大堆大小。建议两者设置为相等,避免垃圾回收后重新分配堆内存大小导致的性能波动。例如:

    -Xms3g -Xmx3g
    

    在此配置中,堆内存固定为 3GB。一般来说,堆内存占总可用内存的 1/3 到 1/2 较为合适,确保剩余的内存可用于直接内存和系统进程。

  • -XX:NewSize:设置新生代(Young Generation)大小。在常见应用中,新生代可设置为堆内存的 1/3。例如:

    -XX:NewSize=1g
    

    新生代主要存放短生命周期的对象,通过增大新生代大小,可以减少将短期对象移动到老年代(Old Generation)的频率,从而优化 GC 效率。

元空间(Metaspace)

元空间用于存储 Java 类的元数据。Java 8 后使用元空间替代了永久代,因此不再有 PermSizeMaxPermSize 参数。

  • -XX:MetaspaceSize:设定元空间初始大小。例如:
    -XX:MetaspaceSize=128m
    
    根据应用所需的类库数量和依赖库规模,可适当调整。类加载较多时可增加此值。

新生代与老年代比例

  • -XX:NewRatio:设置新生代和老年代的内存比率。-XX:NewRatio=3 意味着新生代占堆内存的 1/4,老年代占 3/4:
    -XX:NewRatio=3
    
  • -XX:SurvivorRatio:设置新生代中 Eden 区和两个 Survivor 区的比例。例如,-XX:SurvivorRatio=8 意味着 Eden 和 Survivor 区的比例为 8:1:1,提升内存使用效率:
    -XX:SurvivorRatio=8
    

直接内存(Direct Memory)

Netty 等高性能应用会使用直接内存来减少内存复制,提升数据传输性能。

  • -XX:MaxDirectMemorySize:设置最大直接内存大小。例如在 8GB 内存的服务器上,Netty 可使用 2GB 直接内存:
    -XX:MaxDirectMemorySize=2g
    

垃圾回收器(GC)设置

选择合适的 GC 可以有效提升应用的响应时间和吞吐量。以下是常用的 GC 设置:

  • -XX:+UseParNewGC-XX:+UseConcMarkSweepGC:设置新生代 GC 为 ParNew,老年代为 CMS,适合较低延迟要求的应用:
    -XX:+UseParNewGC -XX:+UseConcMarkSweepGC
    
  • -XX:+UseG1GC:G1 GC 是新生代和老年代的统一收集器,适合较大的堆内存和低延迟场景,Java 9 以上版本推荐使用此收集器:
    -XX:+UseG1GC
    

OOM 异常分析设置

为便于在发生 OOM 时分析问题,可以配置堆转储:

  • -XX:+HeapDumpOnOutOfMemoryError:开启 OOM 时自动生成堆转储文件。
  • -XX:HeapDumpPath:指定转储文件路径,以便后续调试。例如:
    -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=dump.log
    

GC 日志设置

配置 GC 日志便于监控垃圾回收频率和耗时,为后续优化提供依据。

  • -XX:+PrintGC-XX:+PrintGCDetails:输出 GC 日志和详细信息。
  • -XX:+PrintGCTimeStamps-XX:+PrintHeapAtGC:添加时间戳并输出 GC 前后的堆信息。
  • -Xloggc:指定 GC 日志文件路径,便于存档分析。如下示例配置生成时间戳的 GC 日志:
    -XX:+PrintGC -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintHeapAtGC -Xloggc:../gc/gc.log
    

实战配置案例:Netty 服务配置

假设在 8GB 服务器上独立运行一个名为 start.jar 的 Netty 应用,参数配置步骤如下:

  1. 预留操作系统内存:为操作系统预留 2GB 内存,确保系统稳定,分配 6GB 给 JVM。
  2. 直接内存设置:预留 2GB 直接内存,确保 Netty 应用在高负载下有足够内存进行 I/O 操作。
  3. 堆内存设置:分配 3GB 给堆内存,指定 -Xms3g -Xmx3g
  4. 新生代和老年代分配:将 1GB 用于新生代,2GB 用于老年代。
  5. 元空间设置:128MB 适用于此应用的类库加载。
  6. 垃圾回收器:新生代使用 ParNewGC,老年代使用 CMS
  7. GC 日志和 OOM 诊断:配置 GC 日志输出路径和 OOM 堆转储路径。

最终的 JVM 参数配置如下:

java -server \
-XX:MaxDirectMemorySize=2g \
-Xms3g -Xmx3g \
-XX:NewSize=1g \
-XX:MetaspaceSize=128m \
-XX:+UseParNewGC -XX:+UseConcMarkSweepGC \
-XX:+HeapDumpOnOutOfMemoryError \
-XX:HeapDumpPath=dump.log \
-XX:+PrintGC -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintHeapAtGC \
-Xloggc:../gc/gc.log \
-jar start.jar

总结与优化建议

  1. 监控与调优:通过 GC 日志分析 GC 次数和时间,结合应用的内存需求调整堆大小和新生代比例。
  2. 合理分配直接内存:Netty 应用应合理预留直接内存,防止因堆外内存不足导致系统 OOM。
  3. GC 选择与升级:根据 JVM 版本选择合适的 GC,Java 9 以上可以尝试使用 G1 GC。

标签:设置,入门,新生代,案例,XX,GC,内存,JVM
From: https://blog.csdn.net/weixin_42434700/article/details/143701453

相关文章

  • Playwright——快速入门(初章)
    Playwright:引领自动化测试的未来在数字化时代,Web应用的复杂性和用户期望的提高对软件测试提出了更高的要求。微软开发的Playwright,作为一个创新的自动化测试框架,正以其卓越的性能和全面的浏览器支持,重新定义Web自动化测试的标准。什么是Playwright?Playwright是一个跨浏览......
  • 华为交换机使用高级ACL限制不同网段的用户互访案例
    1.组网需求如下图网络拓扑,某公司通过交换机LSW1实现各部门之间的互连。为方便管理网络,管理员为公司的研发部和市场部规划了两个网段的IP地址。同时为了隔离广播域,又将两个部门划分在不同VLAN之中。现要求LSW1既能够限制两个网段之间互访,又不影响两个部门访问外网。2.配置思......
  • 软考架构案例分析-重点回顾笔记2
    反规范化设计方法? 常见反规范化技术:   增加冗余列:在多个表中保留相同的列,通过增加数据冗余减少或避免查询时的连接操作。   增加派生列:在表中增加可以由本表或其他表中数据计算生成的列,减少查询时的连接操作     并且避免计算或使用集合函数。  ......
  • 【软考】系统架构设计师-2018年下半年下午案例真题及答案
    全国计算机技术与软件专业技术资格(水平)考试高级系统架构设计师2018年下半年下午试卷 案例试题一 【说明】某文化产业集团委托软件公司开发一套文化用品商城系统,业务涉及文化用品销售、定制、竞拍和点评等板块,以提升商城的信息化建设水平。该软件公司组织项......
  • 使用 C# 入门深度学习:Pytorch 基础
    教程名称:使用C#入门深度学习作者:痴者工良地址:https://torch.whuanle.cn1.2Pytorch基础本文内容介绍Pytorcn的基础API,主要是数组的创建方式和运算方式,由于相关内容跟Numpy比较相似,并且Numpy类型可以转torch.Tensor,因此对Numpy感兴趣的读者可以参考笔者的其它文......
  • C++入门基础(四)
    目录引用的应用做参数做返回值野引用扩展传值、传引用效率比较引用和指针的区别C++对比C语言实现顺序表引用的应用做参数 #include<iostream> usingnamespacestd; voidSwap(int&a,int&b) { inttemp=a; a=b; b=temp; } intmain() { in......
  • Tomcat 应用实战案例(Practical Case Study of Tomcat Application)
      ......
  • c语言入门第六天输入函数
    一:字符输入函数a:字符输入函数格式为getchar();b:功能:从键盘输入一字符c:返回值:正常,返回从键盘输入的代码值,出错或结束返回-1d:代码展示输出单一字符2:格式输入函数a:格式:scanf("格式控制符",地址表)b:功能:按指定格式从键盘读入数据,存入地址表指定存储单元中,并按回......
  • 成为一名Web安全工程师很难吗?(非常详细),零基础入门到精通,看这一篇就够了
    前言Web安全渗透:主要是对Web应用程序和相应的软硬件设备配置的安全性进行测试。通过模拟入侵者的手段可以在授权的情况下进行流量攻击、信息收集、文件提取等敏感行为,最终输出测试报告,从而准确修复这一系列漏洞。主要作用于各个企业网站、业务系统、移动APP、WiFi热点、Do......
  • 网络安全协议系列(非常详细),零基础入门到精通,看这一篇就够了
    文章目录一、安全协议的引入1.TCP/IP协议族中普通协议的安全缺陷1.信息泄露2.信息篡改3.身份伪装4.行为否认2.网络安全需求二、网络安全协议的定义三、构建网络安全协议所需的组件1.加密与解密2.消息摘要3.消息验证码4.数字签名5.密钥管理1.建立共享密钥2.公钥管理四......