JVM -XX: 参数介绍

本文详细介绍JVM的各种参数,包括功能开关、性能参数和调试参数,帮助读者深入理解JVM的工作原理及其调优方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

功能开关:

参数 默认值或限制 说明
参数 默认值 功能
-XX:-AllowUserSignalHandlers 限于Linux和Solaris,默认不启用 允许为java进程安装信号处理器,信号处理参见类:sun.misc.Signal, sun.misc.SignalHandler
-XX:+DisableExplicitGC 默认启用 禁止在运行期显式地调用System.gc()
-XX:+FailOverToOldVerifier Java6新引入选项,默认启用 如果新的Class校验器检查失败,则使用老的校验器(失败原因:因为JDK6最高向下兼容到JDK1.2,而JDK1.2的class info 与JDK6的info存在较大的差异,所以新校验器可能会出现校验失败的情况)
-XX:+HandlePromotionFailure java5以前是默认不启用,java6默认启用 关闭新生代收集担保
-XX:+MaxFDLimit 限于Solaris,默认启用 设置java进程可用文件描述符为操作系统允许的最大值。
-XX:PreBlockSpin=10 -XX:+UseSpinning 必须先启用,对于java6来说已经默认启用了,这里默认自旋10次 控制多线程自旋锁优化的自旋次数
-XX:-RelaxAccessControlCheck 默认不启用 在Class校验器中,放松对访问控制的检查,作用与reflection里的setAccessible类似
-XX:+ScavengeBeforeFullGC 默认启用 在Full GC前触发一次Minor GC
-XX:+UseAltSigs 限于Solaris,默认启用 为了防止与其他发送信号的应用程序冲突,允许使用候补信号替代 SIGUSR1和SIGUSR2
-XX:+UseBoundThreads 限于Solaris, 默认启用 绑定所有的用户线程到内核线程, 减少线程进入饥饿状态(得不到任何cpu time)的次数
-XX:-UseConcMarkSweepGC 默认不启用 启用CMS低停顿垃圾收集器,减少FGC的暂停时间
-XX:+UseGCOverheadLimit 默认启用 限制GC的运行时间。如果GC耗时过长,就抛OOM
-XX:+UseLWPSynchronization 限于solaris,默认启用 使用轻量级进程(内核线程)替换线程同步
-XX:-UseParallelGC -server时启用,其他情况下,默认不启用 策略为新生代使用并行清除,年老代使用单线程Mark-Sweep-Compact的垃圾收集器
-XX:-UseParallelOldGC 默认不启用 策略为老年代和新生代都使用并行清除的垃圾收集器
-XX:-UseSerialGC -client时启用,其他情况下,默认不启用 使用串行垃圾收集器
-XX:-UseSpinning java1.4.2和1.5需要手动启用, java6默认已启用 启用多线程自旋锁优化
-XX:+UseTLAB 1.4.2以前和使用-client选项时,默认不启用,其余版本默认启用 启用线程本地缓存区
-XX:+UseSplitVerifier java5默认不启用, java6默认启用 使用新的Class类型校验器
-XX:+UseThreadPriorities 默认启用 使用本地线程的优先级
-XX:+UseVMInterruptibleIO 限于solaris,默认启用 在solaris中,允许运行时中断线程

性能参数:

参数 默认值或限制 说明
-XX:+AggressiveOpts JDK 5 update 6后引入,但需要手动启用, JDK6默认启用 启用JVM开发团队最新的调优成果。例如编译优化,偏向锁,并行年老代收集等
-XX:CompileThreshold=10000 1000 通过JIT编译器,将方法编译成机器码的触发阀值,可以理解为调用方法的次数,例如调1000次,将方法编译为机器码
-XX:LargePageSizeInBytes=4m 默认4m, amd64位:2m 设置堆内存的内存页大小
-XX:MaxHeapFreeRatio=70 70 GC后,如果发现空闲堆内存占到整个预估上限值的70%,则收缩预估上限值
-XX:MaxNewSize=size 1.3.1 Sparc: 32m, 1.3.1 x86: 2.5m 新生代占整个堆内存的最大值
-XX:MaxPermSize=64m 5.0以后: 64 bit VMs会增大预设值的30%, 1.4 amd64: 96m, 1.3.1 -client: 32m, 其他默认 64m Perm(俗称方法区)占整个堆内存的最大值
-XX:MinHeapFreeRatio=40 40 GC后,如果发现空闲堆内存占到整个预估上限值的40%,则增大上限值
-XX:NewRatio=2 Sparc -client: 8, x86 -server: 8, x86 -client: 12, -client: 4 (1.3),
8 (1.3.1+), x86: 12, 其他默认 2
新生代和年老代的堆内存占用比例, 例如2表示新生代占年老代的1/2,占整个堆内存的1/3
-XX:NewSize=2.125m 5.0以后: 64 bit Vms 会增大预设值的30%, x86: 1m, x86, 5.0以后: 640k, 其他默认 2.125m 新生代预估上限的默认值
-XX:ReservedCodeCacheSize=32m Solaris 64-bit, amd64, -server x86: 48m, 1.5.0_06之前, Solaris 64-bit amd64: 1024m, 其他默认 32m 设置代码缓存的最大值,编译时用
-XX:SurvivorRatio=8 Solaris amd64: 6, Sparc in 1.3.1: 25, Solaris platforms 5.0以前: 32, 其他默认 8 Eden与Survivor的占用比例。例如8表示,一个survivor区占用 1/8 的Eden内存,即1/10的新生代内存,为什么不是1/9?
因为我们的新生代有2个survivor,即S0和S1。所以survivor总共是占用新生代内存的 2/10,Eden与新生代的占比则为 8/10
-XX:TargetSurvivorRatio=50 50 实际使用的survivor空间大小占比。默认是50%,最高90%
-XX:ThreadStackSize=512 Sparc: 512, Solaris x86: 320 (5.0以前 256), Sparc 64 bit: 1024, Linux amd64: 1024 (5.0 以前 0), 其他默认 512. 线程堆栈大小
-XX:+UseBiasedLocking JDK 5 update 6后引入,但需要手动启用, JDK6默认启用 启用偏向锁
-XX:+UseFastAccessorMethods 默认启用 优化原始类型的getter方法性能(get/set:Primitive Type)
-XX:-UseISM 默认启用 启用solaris的ISM
-XX:+UseLargePages JDK 5 update 5后引入,但需要手动启用, JDK6默认启用 启用大内存分页
-XX:+UseMPSS 1.4.1 之前: 不启用, 其余版本默认启用 启用solaris的MPSS,不能与ISM同时使用
-XX:+UseStringCache 默认开启 启用缓存常用的字符串。
-XX:AllocatePrefetchLines=1 1 Number of cache lines to load after the last object allocation using prefetch instructions generated in JIT compiled code. Default values are 1 if the last allocated object was an instance and 3 if it was an array.
-XX:AllocatePrefetchStyle=1 1 Generated code style for prefetch instructions.
0 – no prefetch instructions are generate*d*,
1 – execute prefetch instructions after each allocation,
2 – use TLAB allocation watermark pointer to gate when prefetch instructions are executed.
-XX:+UseCompressedStrings Java 6 update 21有一选项 其中,对于不需要16位字符的字符串,可以使用byte[] 而非char[]。对于许多应用,这可以节省内存,但速度较慢(5%-10%)
-XX:+OptimizeStringConcat 在Java 6更新20中引入 优化字符串连接操作在可能的情况下

调试参数:

参数 默认值或限制 说明
-XX:-CITime   打印发费在JIT编译上的时间
-XX:ErrorFile=./hs_err_pid<pid>.log JDK6中引入 错误文件
-XX:-ExtendedDTraceProbes JDK6中引入仅在Solaris 启用性能的影响DTrace探测器
-XX:HeapDumpPath=./java_pid<pid>.hprof 1.4.2 update 12, 5.0 update 7 指定HeapDump的文件路径或目录
-XX:-HeapDumpOnOutOfMemoryError 1.4.2 update 12, 5.0 update 7 当抛出OOM时进行HeapDump
-XX:OnError=”<cmd args>;<cmd args>” 1.4.2 update 9 当发生错误时执行用户指定的命令
-XX:OnOutOfMemoryError=”<cmd args>;
<cmd args>”
1.4.2 update 12, 6 当发生OOM时执行用户指定的命令
-XX:-PrintClassHistogram 1.4.2 当Ctrl+Break发生时打印Class实例信息,与jmap -histo相同
-XX:-PrintConcurrentLocks 6 当Ctrl+Break发生时打印java.util.concurrent的锁信息, 与jstack -l相同
-XX:-PrintCommandLineFlags 5 打印命令行上的标记
-XX:-PrintCompilation   当方法被编译时打印信息
-XX:-PrintGC   当GC发生时打印信息
-XX:-PrintGCDetails 1.4.0 打印GC详细信息
-XX:-PrintGCTimeStamps 1.4.0 打印GC用时
-XX:-PrintTenuringDistribution   打印Tenuring年龄信息
-XX:-TraceClassLoading   跟踪类加载
-XX:-TraceClassLoadingPreorder 1.4.2 跟踪所有加载的引用类
-XX:-TraceClassResolution 1.4.2 跟踪常量池的变化
-XX:-TraceClassUnloading   跟踪类的卸载
-XX:-TraceLoaderConstraints 6 Trace recording of loader constraints
-XX:+PerfSaveDataToFile   退出时保存jvmstat二进制文件
-XX:ParallelGCThreads=   设置新生代与老年代并行垃圾回收器的线程数
-XX:+UseCompressedOops   Enables the use of compressed pointers (object references represented as 32 bit offsets instead of 64-bit pointers) for optimized 64-bit performance with Java heap sizes less than 32gb.
-XX:+AlwaysPreTouch   Pre-touch the Java heap during JVM initialization. Every page of the heap is thus demand-zeroed during initialization rather than incrementally during application execution.
-XX:AllocatePrefetchDistance=   Sets the prefetch distance for object allocation. Memory about to be written with the value of new objects is prefetched into cache at this distance (in bytes) beyond the address of the last allocated object. Each Java thread has its own allocation point. The default value varies with the platform on which the JVM is running.
-XX:InlineSmallCode=   当编译的代码小于指定的值时,内联编译的代码
-XX:MaxInlineSize=35   内联方法的最大字节数
-XX:FreqInlineSize=   内联频繁执行的方法的最大字节码大小
-XX:LoopUnrollLimit=   Unroll loop bodies with server compiler intermediate representation node count less than this value. The limit used by the server compiler is a function of this value, not the actual value. The default value varies with the platform on which the JVM is running.
-XX:InitialTenuringThreshold=7   设置初始的对象在新生代中最大存活次数
-XX:MaxTenuringThreshold=   设置对象在新生代中最大的存活次数,最大值15,并行回收机制默认为15,CMS默认为4
<think>嗯,用户问的是关于JVM参数-XX:InitialHeapSize的作用和配置方法。这个问题涉及到JVM内存管理的核心知识,需要结合引用内容详细说明。 用户可能正在调优Java应用性能,或者遇到了内存相关的问题。从提问方式看,ta对JVM参数有一定了解但需要具体指导,属于中级开发者水平。需要特别注意引用[1]和[3]都提到了-Xms参数,这其实是关键点。 首先明确概念:InitialHeapSize就是堆内存的初始大小。引用[1]的示例输出显示了这个参数的实际效果,而引用[3]的调优示例用-Xms100m这种更常见的写法。这里要强调两种写法的等价性,因为很多开发者可能不知道-XX:InitialHeapSize-Xms其实是同一个配置的两种写法。 配置方法需要分三部分说明:命令行配置、默认值规则、关联参数。特别要注意引用[4]提到的MaxDirectMemorySize关系,虽然用户没问但应该提醒避免内存总和超限。另外引用[2]提到的PrintFlagsInitial对验证默认值很有用。 注意事项部分要包含引用[1][2]都强调的版本差异问题,还有引用[4]隐含的生产环境风险。用户可能正在开发环境调试,但必须提前告知生产环境的注意事项。 最后生成的问题要覆盖延伸需求:性能分析(引用[3]的GC日志参数相关)、监控方法(引用[1]的打印参数技巧)、常见错误(结合引用[4]的内存溢出场景)。这样既解答当前问题,又预判了用户后续可能遇到的困难。</think>### JVM `-XX:InitialHeapSize` 参数详解 #### **作用** `-XX:InitialHeapSize` 用于设置 **JVM 堆内存的初始大小**。JVM 启动时,会立即分配此参数指定的内存量作为初始堆空间,避免运行时频繁调整堆大小,从而提升启动性能。若未显式配置,JVM 会根据系统内存自动计算默认值(通常为物理内存的 1/64)[^1][^3]。 #### **配置方法** 1. **命令行直接指定**(单位:字节/B,支持 `k`/`m`/`g` 后缀): ```bash java -XX:InitialHeapSize=512m -jar your_app.jar ``` 2. **等价简写参数 `-Xms`**(更常用): ```bash java -Xms512m -jar your_app.jar # 效果等同 -XX:InitialHeapSize=512m ``` #### **关键规则** - **与 `-Xmx` 的关系**: - 建议将初始堆大小(`-Xms`)和最大堆大小(`-Xmx`)设为相同值,避免运行时堆扩容引发性能波动[^3]。 - 示例:`-Xms2g -Xmx2g` 表示固定分配 2GB 堆内存。 - **默认值依赖**: 未设置时,JVM 基于系统内存自动计算,可通过 `-XX:+PrintFlagsFinal` 查看实际值[^1][^2]。 #### **验证配置生效** 添加 JVM 参数 `-XX:+PrintCommandLineFlags`,启动时输出生效值: ```bash java -XX:InitialHeapSize=512m -XX:+PrintCommandLineFlags -version # 输出示例: # -XX:InitialHeapSize=536870912 // 512MB 的字节值 # ...其他参数... ``` #### **注意事项** 1. **容器环境**: 在 Docker/K8s 中运行时,`-Xms` + `-XX:MaxDirectMemorySize`(堆外内存)的总和不可超过容器内存限制,否则可能触发 OOM Kill[^4]。 2. **生产建议**: - 避免依赖 JVM 默认值,显式配置 `-Xms` 和 `-Xmx` 以稳定性能[^3]。 - 结合 `-XX:+HeapDumpOnOutOfMemoryError` 在 OOM 时生成堆转储文件[^3]。 3. **参数兼容性**: 不同 JVM 版本(如 OpenJDK/OracleJDK)的默认值或行为可能差异,需测试验证[^2]。 --- ### 相关问题 1. **如何监控 JVM 堆内存的实际使用情况?** (涉及工具:`jstat`、GC 日志分析、`-Xlog:gc*` 参数等) 2. **`-Xms` 和 `-Xmx` 设置不一致会导致哪些性能问题?** (堆扩容/收缩的开销、GC 频率变化等) 3. **容器中如何为 JVM 分配合适的内存?** (堆内存、元空间、堆外内存的比例调整与风险规避[^4]) 4. **如何通过 GC 日志优化堆大小配置?** (分析 Full GC 频率、老年代占用等指标[^3]) > 引用来源: > [^1]: JVM 参数打印与实际应用场景说明 > [^2]: JVM 参数查询方法与兼容性注意事项 > [^3]: 生产环境内存调优参数示例与策略 > [^4]: 堆外内存配置与容器环境风险警告
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值