如何设置 JVM 内存参数(-Xms、-Xmx、-Xss 等)?

JVM调优总结 -Xms -Xmx -Xmn -Xss(转) 原地址:https://blog.youkuaiyun.com/rickyit/article/details/53895060 -Xms -Xmx -Xmn -Xss Xms 是指设定程序启动时占用内存大小。一般来讲,大点,程序会启动的快一点,但是也可能会导致机器暂时间变慢。 Xmx 是指设定程序运行期间最大可占用的内存大小。如果程序运行需要占用更多的内存,超出了这个设置值,就会抛出OutOfMemory异常。 Xss 是指设定每个线程的堆栈大小。这个就要依据你的程序,看一个线程大约需要占用多少内存,可能会有多少线程 阅读详情
AI摘要

本文介绍了 JVM 内存参数,包括堆内存、非堆内存、线程栈、直接内存等参数的设置方法及默认值,还提及了垃圾回收器的选择和常用参数。同时说明了设置 JVM 参数的多种方式,如命令行、环境变量等,并给出参数语法、单位等注意事项,强调要按需合理配置。

JVM 内存参数用于控制 Java 虚拟机使用的内存大小和行为。以下是一些常用的 JVM 内存参数及其设置方法:

1. 堆内存 (Heap Memory):

  • -Xms<size>: 设置 JVM 初始堆大小 (initial heap size)。
    • 例如:-Xms2g (初始堆大小为 2GB)
    • 默认值:物理内存的 1/64 或某个较小的值(具体取决于 JVM 版本和平台)。
    • 建议:
      • 将 -Xms 设置为与 -Xmx 相同的值,可以避免 JVM 在运行时动态调整堆大小,减少 GC 开销。
      • 根据应用程序的内存需求进行设置。
  • -Xmx<size>: 设置 JVM 最大堆大小 (maximum heap size)。
    • 例如:-Xmx4g (最大堆大小为 4GB)
    • 默认值:物理内存的 1/4 或某个较小的值(具体取决于 JVM 版本和平台)。
    • 建议:
      • 不要将 -Xmx 设置得超过物理内存大小,否则会导致操作系统使用交换空间 (swap),严重影响性能。
      • 根据应用程序的内存需求进行设置,并留有一定的余量。
      • 使用监控工具(例如 JConsole、VisualVM)观察应用程序的内存使用情况,并进行调整。
  • -Xmn<size>: 设置年轻代 (Young Generation) 大小。
    • 例如:-Xmn1g (年轻代大小为 1GB)
    • 默认值:根据 -Xmx 和 -XX:NewRatio 自动计算。
    • 建议:
      • 对于响应时间敏感的应用,可以适当增大年轻代大小,以减少 Minor GC 的频率。
      • 对于吞吐量优先的应用,可以适当减小年轻代大小,以增加老年代的大小。
      • 通常设置为整个堆大小的 1/4 ~ 1/3。
  • -XX:NewRatio=<ratio>: 设置年轻代和老年代的比例。
    • 例如:-XX:NewRatio=2 (老年代大小是新生代的 2 倍,即新生代占整个堆的 1/3)
    • 默认值:通常为 2。
  • -XX:SurvivorRatio=<ratio>: 设置 Eden 区和 Survivor 区的比例。
    • 例如:-XX:SurvivorRatio=8 (Eden 区大小是 Survivor 区的 8 倍,即每个 Survivor 区占新生代的 1/10)
    • 默认值:通常为 8。
  • -XX:MaxTenuringThreshold=<n>:
    • 设置对象晋升到老年代的年龄阈值(经历过GC的次数)。
    • 默认值:15 (CMS 垃圾回收器默认为 6)。
    • 如果设置为 0, 则年轻代对象不经过 Survivor 区直接进入老年代.
  • -XX:+UseAdaptiveSizePolicy:
    • 启用自适应大小调整策略(默认启用)。
    • JVM 会根据应用程序的运行情况,动态调整堆、年轻代、Survivor 区等的大小。

2. 非堆内存 (Non-Heap Memory):

  • -XX:MetaspaceSize=<size>: 设置元空间 (Metaspace) 的初始大小 (JDK 1.8 及之后)。

    • 例如:-XX:MetaspaceSize=256m
    • 默认值:取决于平台。
  • -XX:MaxMetaspaceSize=<size>: 设置元空间的最大大小 (JDK 1.8 及之后)。

    • 例如:-XX:MaxMetaspaceSize=512m
    • 默认值:无限制(受限于本地内存)。
    • 建议:
      • 如果应用程序加载了大量的类,或者使用了动态代理等技术,可能需要增大元空间的大小。
  • -XX:MaxPermSize=<size>: 设置永久代 (PermGen) 的最大大小 (JDK 1.7 及之前)。

    • 例如:-XX:MaxPermSize=256m
    • 注意: JDK 1.8 及之后已移除永久代,使用元空间代替。
  • -XX:CompressedClassSpaceSize=<size>: 设置压缩类空间的大小(Compressed Class Space), 默认 1g.

  • -XX:ReservedCodeCacheSize=<size>: 设置代码缓存 (Code Cache) 的大小。 代码缓存用于存储 JIT 编译器编译后的本地代码。

3. 线程栈 (Thread Stack):

  • -Xss<size>: 设置线程栈大小 (stack size)。
    • 例如:-Xss1m (线程栈大小为 1MB)
    • 默认值:取决于操作系统和 JVM 版本(通常为 512KB 或 1MB)。
    • 建议:
      • 如果应用程序创建了大量的线程,或者线程需要较深的调用栈,可以适当增大线程栈大小。
      • 不要将线程栈设置得过大,否则会浪费内存,并可能导致 OutOfMemoryError。

4. 直接内存 (Direct Memory):

  • -XX:MaxDirectMemorySize=<size>: 设置直接内存的最大大小。
    • 例如:-XX:MaxDirectMemorySize=1g
    • 默认值:与 -Xmx 相同(但实际上不受 -Xmx 限制,而是受限于操作系统)。
    • 注意: Java NIO (New I/O) 可以使用 ByteBuffer.allocateDirect() 方法分配直接内存。直接内存不受 Java 堆大小的限制,但受本机总内存大小的限制。

5. 垃圾回收器 (Garbage Collector):

  • 选择垃圾回收器:
    • -XX:+UseSerialGC: Serial 垃圾回收器 (单线程,适用于小型应用或客户端模式)。
    • -XX:+UseParallelGC: Parallel Scavenge 垃圾回收器 (多线程,吞吐量优先)。
    • -XX:+UseConcMarkSweepGC: CMS 垃圾回收器 (并发标记清除,低延迟)。
    • -XX:+UseG1GC: G1 垃圾回收器 (适用于大堆内存和低延迟的场景)。
    • -XX:+UseZGC: ZGC 垃圾回收器 (JDK 11+, 极低延迟)。
    • -XX:+UseShenandoahGC: Shenandoah 垃圾回收器 (低延迟)。
  • 垃圾回收器参数: 不同的垃圾回收器有不同的参数,用于调整其行为。

6. 其他常用参数:

  • -XX:+PrintGC: 打印 GC 日志 (简要信息)。
  • -XX:+PrintGCDetails: 打印 GC 详细日志。
  • -XX:+PrintGCDateStamps: 在 GC 日志中打印日期和时间。
  • -XX:+PrintGCTimeStamps: 在GC日志中打印时间戳(相对于JVM启动时间的秒数)。
  • -Xloggc:<file>: 将 GC 日志输出到文件 (例如 -Xloggc:gc.log)。
  • -XX:+HeapDumpOnOutOfMemoryError: 当发生 OutOfMemoryError 时,自动生成堆转储快照 (heap dump)。
  • -XX:HeapDumpPath=<path>: 指定堆转储文件的保存路径。
  • -XX:+DisableExplicitGC: 禁用 System.gc() 调用。
  • -XX:+UseStringDeduplication: 启用字符串去重 (G1 GC, JDK 8u20+)。
  • -XX:+UseCompressedOops: 启用压缩对象指针 (64 位 JVM, 堆大小小于 32GB)。
  • -XX:+UseCompressedClassPointers: 启用压缩类指针。
  • -server: 使用 Server 模式 (默认)。
  • -XX:+PrintCommandLineFlags: 打印 JVM 启动参数。

设置 JVM 参数的方法:

  • 命令行参数: 在启动 Java 应用程序时,使用 -XX: 或 -X 选项指定 JVM 参数。

    java -Xms2g -Xmx4g -XX:+UseG1GC -XX:+PrintGCDetails -Xloggc:gc.log -jar myapp.jar
    
  • 环境变量: 设置 JAVA_OPTS 环境变量。

    export JAVA_OPTS="-Xms2g -Xmx4g -XX:+UseG1GC"
    java -jar myapp.jar
    
  • IDE 配置: 在 IntelliJ IDEA、Eclipse 等 IDE 中,可以在 Run/Debug 配置中设置 JVM 参数。

  • Spring Boot 项目:

    • application.properties 或 application.yml: 可以使用 spring.jvm.options 属性设置 JVM 参数。

      spring:
        jvm:
          options: -Xms2g -Xmx4g -XX:+UseG1GC
      
    • 命令行参数: 可以在启动 Spring Boot 应用程序时使用 -- 传递 JVM 参数。

      java -jar myapp.jar -- --Xms2g --Xmx4g
      
    • 使用 JAVA_OPTS 环境变量: 在 Spring Boot 项目中, 可以直接在启动脚本中设置 JAVA_OPTS 环境变量.

  • Tomcat: 可以在 catalina.sh 或 catalina.bat 文件中设置 JAVA_OPTS 环境变量。

  • Jetty: 可以在 start.ini 或 jetty.sh 文件中设置 JVM 参数.

注意事项:

  • 参数语法:
    • -X 开头的参数是非标准参数,不同的 JVM 实现可能有所不同。
    • -XX: 开头的参数是 HotSpot VM 特有的参数。
      • -XX:+<option>: 启用某个选项。
      • -XX:-<option>: 禁用某个选项。
      • -XX:<option>=<value>: 设置某个选项的值。
  • 单位:
    • k 或 K: KB
    • m 或 M: MB
    • g 或 G: GB
  • 不要盲目设置参数: 在设置 JVM 参数之前,一定要了解每个参数的含义和作用,并根据应用程序的实际情况进行调整。
  • 逐步调整: 每次只调整一个参数,并进行测试,观察效果。
  • 监控和分析: 使用监控工具(例如 JConsole、VisualVM)和 GC 日志分析工具(例如 GCViewer)监控 JVM 的性能,并根据监控结果进行调整。
  • 参考官方文档: 参考 JVM 官方文档,了解更多关于 JVM 参数的信息。

总结:

JVM 内存参数的设置对于 Java 应用程序的性能和稳定性至关重要。 需要根据应用程序的特点、运行环境和性能目标,选择合适的 JVM 参数,并进行合理的配置。

JVM-合理配置堆内存 我们增加多少内存比较合适?如果内存过大,那么如果产生FullGC的时候,GC时间会相对比较长,如果内存较小,那么就会频繁的触发GC(吞吐量低),在这种情况下,我们该如何合理的适配堆内存大小呢? 阅读详情

相关推荐

JVM参数调优总结:JVM中的-Xms 、-Xmx 参数该如何设置

JVM参数调优总结,在 Java 虚拟机(JVM)中,-Xms 和 -Xmx 都是用来设置 JVM 堆内存大小的参数。其中,-Xms 用于设置 JVM 启动时分配的初始堆内存大小,而 -Xmx 用于设置 JVM 堆内存的最大可用空间。默认情况下,-Xms参数的值为物理内存的1/64,-Xmx参数的值为物理内存的1/4。

计算机毕业论文源码,学生个人网页制作html源码。贴近用户做网络推广和互联网优化。 2万+

JVM解读-调优常用参数

JVM参数1 典型配置/usr/local/jdk/bin/java -Dresin.home=/usr/local/resin -server -Xms1800M -Xmx1800M -Xmn300M -Xss512K -XX:PermSize=300M -XX:MaxPermSize=300M -XX:SurvivorRatio=8 -XX:MaxTenuringThresh

高广超的博客 2861

FlinkCDC数据同步Bug——同步性能由于写入并行度限制无法提升问题的解决

使用FlinkCDC进行数据同步时,出现增量阶段写入并行度强制为1导致整体同步性能无法提升问题的解决方案

csdn_lan的博客 2078

-Xms -Xmx等jvm参数的含义

堆内存分配: JVM初始分配的内存由-Xms指定,默认是物理内存的1/64 JVM最大分配的内存由-Xmx指定,默认是物理内存的1/4 默认空余堆内存小于40%时,JVM就会增大堆直到-Xmx的最大限制;空余堆内存大于70%时,JVM会减少堆直到 -Xms的最小限制。 因此服务器一般设置-Xms、-Xmx相等以避免在每次GC 后调整堆的大小。对象的堆内存由称为垃圾回收器的自动内存管理系统回收。 非堆内存分配: JVM使用-XX:PermSize设置非堆内存初始值,默认是物理内存的1/64; 由XX:MaxP

HELLOW,文浩 1万+

Mike 21如何制作随水深变化的糙率文件

MIKE 21如何制作随水深变化的糙率文件

zhuzhujiayoua的博客 2250

信号完整性仿真SI之Cadence Sigrity SPEED2000_眼图仿真(四)

今天给大家分享一个仿真的操作流程,是关于Cadence Sigrity SPEED2000的时域波形仿真和眼图仿真。我们会经常看见硬件工程师调试示波器上的一些信号的波形变化,其实这些也可以通过仿真电路的搭建来做出投板前的仿真,来优化走线,以减少版本的迭代次数。如果要和实际的信号保持一致,就要求仿真设置的参数和实际的参数保持一致,这也是仿真的重点和难点。下面先让我们了解一下Cadence Sigrity SPEED2000时域仿真的操作流程: 1.仿真模式选择与文件导入 选择Cadence Sigrity下的

刘小同学的博客 1万+

JVM参数调优总结 -Xms -Xmx -Xmn -Xss

“-Xmx1024m -Xms1024m -Xmn512m -Xss256k”——Java运行参数(转) JVM的堆的内存,是通过下面面两个参数控制的 -Xms最小堆的大小,也就是当你的虚拟机启动后,就会分配这么大的堆内存给你 -Xmx是最大堆的大小 当最小堆占满后,会尝试进行GC,如果GC之后还不能得到足够的内存(GC未必会收集到所有当前可用内存),分配新的对象...

jakeswang的博客 4万+

告别手动标注!用ENVI Classic高效搞定高光谱图像语义分割标签(以农业/地物分类为例)

本文详细介绍了如何利用ENVI Classic实现高光谱图像的半自动化智能标注,特别针对农业和地物分类场景。通过光谱特征分析、智能标注技巧和MAT文件转换,显著提升标注效率和质量,助力AI模型训练。

weixin_28694169的博客 251

JVM调优总结 -Xms -Xmx -Xmn -Xss

响应时间优先的应用 :尽可能设大,直到接近系统的最低响应时间限制 (根据实际情况选择)。在此种情况下,年轻代收集发生的频率也是最小的。同时,减少到达年老代的对象。吞吐量优先的应用 :尽可能的设置大,可能到达Gbit的程度。因为对响应时间没有要求,垃圾收集可以并行进行,一般适合8CPU以上的应用。

sre救赎之路 15万+

【异常】DeepSeek API HTTP 401 认证失败错误完整排查与解决方案

摘要:本文针对DeepSeek API开发中的HTTP 401认证失败错误进行深度解析,指出该错误属于不可重试的认证类问题。文章首先拆解错误日志关键字段,区分401与其他API错误的本质差异。随后提供优先级排序的全链路解决方案:1)检查API密钥有效性;2)规范请求头认证格式;3)排查账户权限状态;4)验证请求环境配置。最后建议通过新建测试密钥、使用官方示例代码或联系技术支持进行兜底处理。全文采用技术脱敏处理,为开发者提供系统性的401错误排查指南。(149字)

奶爸的编程之路,也就一周冷个三天 1529

初探802.11协议(0)——PCF/DCF与CSMA/CA机制

IEEE802.11 CSMA/CA机制与DCF机制

FanFF的博客 4505

JVM内存调优总结 -Xms -Xmx -Xmn -Xss 参数设置

Xms 是指设定程序启动时占用内存大小。一般来讲,大点,程序会启动的快一点,但是也可能会导致机器暂时间变慢。 Xmx 是指设定程序运行期间最大可占用的内存大小。如果程序运行需要占用更多的内存,超出了这个设置值,就会抛出OutOfMemory异常。 Xss 是指设定每个线程的堆栈大小。这个就要依据你的程序,看一个线程大约需要占用多少内存,可能会有多少线程同时运行等。 以上三个参数的设置都是默认...

shadow_zed的博客 2万+

电源完整性分析:PDN阻抗与去耦电容设计——目标阻抗计算与电容选型深度实战

摘要:随着嵌入式处理器主频突破 GHz、多核架构普及,电源完整性(Power Integrity, PI)已成为高速 PCB 设计中不可忽视的关键环节。本文从 PDN(电源分配网络)阻抗模型出发,系统讲解目标阻抗计算方法、去耦电容选型策略、反谐振抑制技术,并结合 STM32F4 核心板的完整设计实例,提供一套可落地的电源完整性工程实践方案。电源完整性设计是一项系统工程,需要从目标阻抗计算电容选型反谐振抑制PCB 布局目标阻抗是设计的起点,由电源电压、纹波要求和瞬态电流决定去耦电容。

从事移动开发八年,csdn博客专家,阿里云特邀专家,华为云云享专家,高级网络信息安全工程师,大数据工程师(高级),python技术开发(高级),HarmonyOS 应用开发者高级认证,现在某学校任教。 1万+

JVM实战(二一): -Xss -Xms -Xmx -Xmn 参数设置

XmnXmsXmxXss有什么区别 Xmn、Xms、Xmx、Xss都是JVM对内存的配置参数,我们可以根据不同需要区修改这些参数,以达到运行程序的最好效果。 -Xms 堆内存的初始大小,默认为物理内存的1/64 -Xmx 堆内存的最大大小,默认为物理内存的1/4 -Xmn 堆内新生代的大小。通过这个值也可以得到老生代的大小:-Xmx减去-Xmn -Xss 设置每个线程可使用的内存大小,即栈的大小。在相同物理内存下,减小这个值能生成更多的线程,当然操作系统对一个进程内的线程数还是有限制的,不能无限生

mingyuli的博客 1万+

【WRF-Chem Emissions教程第一期】WRF-Chem 排放概述

WRF-Chem 排放概述

WW、forever的博客 852

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

JVM优化之 -Xss -Xms -Xmx -Xmn 参数设置

XmnXmsXmxXss有什么区别 Xmn、Xms、Xmx、Xss都是JVM对内存的配置参数,我们可以根据不同需要区修改这些参数,以达到运行程序的最好效果。 -Xms 堆内存的最小大小,默认为物理内存的1/64 -Xmx 堆内存的最大大小,默认为物理内存的1/4 -Xmn 堆内新生代的大小。通过这个值也可以得到老生代的大小:-Xmx减去-Xmn -Xss 设置每个线程可使用的内存大小,即...

仅仅是个学习笔记 13万+

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

JVM常用参数(-Xms/-Xmx/-Xss/-Xmn)

先来看服务器配置的参数: 1、-Xms:初始堆内存大小,设定程序启动时占用内存大小,默认物理内存1/64 -Xms = -XX:InitialHeapSiz 2、-Xmx:最大堆内存,设定程序运行期间最大可占用的内存大小。如果程序运行需要占用更多的内存,超出了这个设置值,就会抛出OutOfMemory异常,默认物理内存1/4,-Xmx = -XX:MaxHeapSize。 上图中的-Xms与-Xmx设置的大小一样 6000M 3、-Xss:设置单个线程栈大小,一般默认512~1024kb。单..

dsydly的博客 7799

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

JVM堆内存及参数配置 -Xss -Xms -Xmx -Xmn

首先,把Eden和Servivor From区域中存活的对象复制到Servicor To区域(如果有对象的年龄达到了老年的标准,则赋值到老年代区),同时把这些对象的年龄+1(如果 ServicorTo 不够位置了就放到老年区);线程栈的大小是个双刃剑,如果设置过小,可能会出现栈溢出,特别是在该线程内有递归、大的循环时出现溢出的可能性更大;如果该值设置过大,就有影响到创建栈的数量,如果是多线程的应用,就会出现内存溢出的错误。:Java新对象的出生地(如果新创建的对象占用内存很大,则直接分配到老年代)。

YuanLuo0911的博客 6393

[JVM] Xms、Xmx、Xmn和xss为何如此命名

本篇的写作目的,旨在揭示每个参数对应的单词缩写的意义,加深对其名称和作用的记忆。同时也介绍了JVM参数的分类,并附上了相应的示例。

长路漫漫,以勤作车 3万+

JVM内存调优 -Xms -Xmx -Xmn -Xss 参数设置

JVM在程序运行过程当中,会创建大量的对象,这些对象,大部分是短周期的对象,小部分是长周期的对象,对于短周期的对象,需要频繁地进行垃圾回收以保证无用对象尽早被释放掉,对于长周期对象,则不需要频率垃圾回收以确保无谓地垃圾扫描检测。当最小堆占满后,会尝试进行GC,如果GC之后还不能得到足够的内存(GC未必会收集到所有当前可用内存),分配新的对象,那么就会扩展堆,如果-Xmx设置的太小,扩展堆就会失败,导致OutOfMemoryError错误提示。JVM最大分配的堆内存由-Xmx指定,默认是物理内存的1/4。..

m0_67401134的博客 6056
上一篇: Spring @Transactional 注解是如何工作的?
下一篇: Nacos 服务发现的核心模型有哪些?Service, Instance, Cluster 之间的关系是什么?
冰糖心书房
博客等级 码龄15年 6014粉丝 690原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

冰糖心书房

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值