常用JVM参数配置

在java启动脚本的参数配置中经常会看到一些形如:-XX:<+|->name的jvm参数,表示开启或关闭某项特性或属性,+代表开启,-代表关闭,下面介绍一些常用的内存分配配置参数

-XX:name=<n>的选项表示需要带有数字,n即为数字。一些控制属性大小值的数字后面还可以带k/m/g表示KB/MB/GB。其他的数字选项则表示比率或百分比。

-client 指定jvm把应用当成客户端类型程序进行优化,启用该配置后,内存占用是最重要的性能指标,远比高吞吐量重要。

-server 指定jvm使用服务器类型进行优化,该选项适用于高吞吐量比启动时间和内存占用更重要的程序。

-d64 表示加载64位jvm,而不是默认的32位jvm,开启该指令后可以使用更大的内存,64位jvm比32位jvm可以使用更多的内存,但是也会带来一定的性能损耗。这是因为java引用的长度从32位增加到了64位,长度的增加使得缓存行中的容纳的oops变少了,cpu高速缓存的效率也会降低。因此64位jvm上的cpu高速缓存效率的降低就会导致64位jvm的性能比32位jvm降低8%-20%。但是如果要启用64位jvm时,java堆内存最大值不超过32g时可以通过指针压缩来提升性能 -XX:+useCompressedOops

-XX:+userCompressedOops 开启压缩指针特性,oops(Ordinary Object Pointer)是指普通对象指针,jvm内部以它来引用java对象。开启改特性后,会使64位jvm不但有更大的堆,而且还有32为jvm的性能。

-Xms<n>[g|m|k] 配置java堆内存的初始值和最小值,是新生代和老年代的总和,<n>表示尺寸大小,[g|m|k] 表示尺寸的单位,java堆大小永远不会小于该配置值。

-Xmx<n>[g|m|k] 配置java堆内存的最大值,java堆永远不会超过该配置值,如果超过后,系统就会报内存溢出异常。如果-Xmx大于Xms,java堆的大小会根据应用的需要扩展或者缩减,java堆的扩展或缩减需要FullGC,所以一般建议-Xms和-Xmx设置成相同的值。

-XX:NewSize=<n>[g|m|k] 配置java堆内存新生代的初始大小和最小尺寸

-XX:MaxNewSize=<n>[g|m|k] 配置java堆内存新生代的最大尺寸,如果-XX:MaxNewSize大于-XX:NewSize,新生代的大小会根据应用的需求而扩展或缩减,新生代的扩展或缩减需要FullGC,所以一般建议把-XX:MaxNewSize和-XX:NewSize设置成相同的值。下面还有个简单配置可以实现这样的效果

-Xmn<n>[g|m|k]  同时配置新生代的初始值、最小值和最大值,如果希望-XX:MaxNewSize和-XX:NewSize设置成相同的值,可以使用这一行配置即可。

-XX:NewRatio=<n> 配置新生代和老年代的尺寸比。例如:n为3,则比率为1:3,即新生代站新生代和老年代大小总和的1/4。如果java堆扩展或缩减,jvm将根据此比率调整新生代和老年代的大小。

-XX:PermSize=<n>[g|m|k]  配置永久代的初始值和最小值

-XX:MaxPermSize=<n>[g|m|k]  配置永久代的最大内存,如果-XX:MaxPermSize大于-XX:PermSize,永久代的尺寸会随着应用的需要而扩展或缩减,永久代的扩展或缩减也需要进行FllGC,所以一般建议设置成相同值。

-XX:SurvivorRatio=<n> 配置单块Survivor区与Eden区的大小比率,<n>为比率,根据该配置的比率可以计算出Survivor区的内存大小:

survivor size = -Xmn<n>/(-XX:SurvivorRatio=<n>  + 2)

-XX:InitialSurvivorRatio=<n> 配置Survivor区初始比率,应该与Throughput收集器配置使用,这个选项通过在Throughput收集器开启自适应调整尺寸时使用,jvm会自适应调整Survivor区大小使应用可以正常运行。

-XX:TargetSurvivorRatio=<percent> 在进行MinorGC之后,Suivivor区被占用的最大值,该值是Survivor区被占用的百分数,默认为50%。


### 配置 Java JVM 参数的方法和最佳实践 #### 1. **JVM 参数的类型** JVM 提供了多种参数用于调整运行时行为,主要分为以下几类: - **布尔型参数**:通过 `-XX:+` 启选项,`-XX:-` 关闭选项。例如,`-XX:+PrintGCDetails` 用于启垃圾回收日志输出。 - **数字型参数**:通过 `-XX:=` 设定数值。例如,`-XX:MaxPermSize=256m` 用于设置永久代的最大内存大小。 - **字符串型参数**:通过 `-XX:=` 设定字符串值,通常用于指定文件路径或命令列表。例如,`-XX:HeapDumpPath=./heapdump.hprof` 用于指定堆转储文件的保存路径 [^2]。 #### 2. **常用 JVM 参数及其作用** ##### 内存相关参数 - **-Xms**: 设置 JVM 堆的初始大小。例如,`-Xms512m` 表示初始堆大小为 512MB。 - **-Xmx**: 设置 JVM 堆的最大大小。例如,`-Xmx2g` 表示最大堆大小为 2GB。 - **-Xmn**: 设置年轻代(Young Generation)的大小。例如,`-Xmn768m` 表示年轻代大小为 768MB。 - **-XX:PermSize** 和 **-XX:MaxPermSize**: 分别设置永久代(Permanent Generation)的初始大小和最大大小。例如,`-XX:PermSize=128m -XX:MaxPermSize=256m`。 - **-XX:MetaspaceSize** 和 **-XX:MaxMetaspaceSize**: 在 Java 8 及以上版本中,元空间(Metaspace)取代了永久代,分别设置元空间的初始大小和最大大小。例如,`-XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=256m` [^1]。 ##### 垃圾回收相关参数 - **-XX:+UseSerialGC**: 使用串行垃圾收集器(Serial GC),适用于单线程环境。 - **-XX:+UseParallelGC**: 使用并行垃圾收集器(Parallel GC),适用于多线程环境,注重吞吐量。 - **-XX:+UseConcMarkSweepGC**: 使用并发标记清除垃圾收集器(CMS GC),适用于低延迟场景。 - **-XX:+UseG1GC**: 使用 G1 垃圾收集器(G1 GC),适用于大堆内存和低延迟场景。 - **-XX:+PrintGCDetails** 和 **-XX:+PrintGCDateStamps**: 启详细的垃圾回收日志输出,便于分析 GC 情况 。 ##### 线程相关参数 - **-Xss**: 设置每个线程的栈大小。例如,`-Xss512k` 表示每个线程的栈大小为 512KB [^1]。 ##### 其他实用参数 - **-D<name>=<value>**: 设置系统属性。例如,`-Duser.timezone=GMT+8` 设置时区为 GMT+8。 - **-verbose:gc**: 输出详细的垃圾回收信息。 - **-XX:+HeapDumpOnOutOfMemoryError**: 在发生内存溢出时生成堆转储文件,便于后续分析。 - **-XX:ErrorFile=./hs_err_pid%p.log**: 设置 JVM 错误日志文件的路径 [^1]。 #### 3. **配置方法** ##### 启动时直接指定 在启动 Java 应用程序时,可以通过命令行直接指定 JVM 参数。例如: ```bash java -Xms512m -Xmx2g -XX:+UseG1GC -jar myapp.jar ``` ##### 通过脚本配置 可以将 JVM 参数写入启动脚本中,便于管理和复用。例如,在 `startup.sh` 脚本中: ```bash #!/bin/bash JAVA_OPTS="-Xms512m -Xmx2g -XX:+UseG1GC" java $JAVA_OPTS -jar myapp.jar ``` ##### 使用工具查看默认参数 可以通过以下命令查看 JDK 默认支持的 JVM 参数: ```bash java -XX:+PrintFlagsFinal -version ``` 还可以结合 `wc -l` 统计当前 Java 版本支持的 JVM 参数数量: ```bash java -XX:+PrintFlagsFinal -XX:+UnlockDiagnosticVMOptions -version | wc -l ``` 该命令可以帮助了解当前 JDK 支持的参数总数 [^3]。 #### 4. **调优建议** ##### 根据应用场景选择合适的垃圾收集器 - **高吞吐量场景**:推荐使用 Parallel GC 或 G1 GC。 - **低延迟场景**:推荐使用 CMS GC 或 G1 GC。 - **大堆内存场景**:推荐使用 G1 GC,因为它能够更好地管理大堆内存并减少停顿时间 [^4]。 ##### 合理设置堆大小 - 初始堆大小 (`-Xms`) 和最大堆大小 (`-Xmx`) 应该设置为相同的值,以避免堆动态扩展带来的性能销。 - 年轻代 (`-Xmn`) 的大小应根据应用的对象生命周期进行调整,通常设置为堆大小的 1/3 到 1/2。 ##### 监控与日志分析 - 启垃圾回收日志 (`-XX:+PrintGCDetails -XX:+PrintGCDateStamps`),定期分析 GC 日志,识别潜在的性能瓶颈。 - 使用工具如 `jstat`、`jmap`、`jconsole` 等监控 JVM 运行状态,及时发现内存泄漏或 GC 频繁等问题 [^4]。 ##### 避免内存泄漏 - 定期检查堆转储文件 (`-XX:+HeapDumpOnOutOfMemoryError`),分析对象引用链,找出未被释放的对象。 - 注意静态集合类、监听器、缓存等可能导致内存泄漏的地方。 #### 5. **常见误区与注意事项** - **盲目增大堆内存**:虽然增加堆内存可以缓解内存压力,但过大的堆会导致 GC 停顿时间变长,反而影响性能。 - **忽略 GC 日志分析**:GC 日志是调优的重要依据,忽视日志可能导致无法及时发现问题。 - **不合理的线程栈大小**:过小的线程栈可能导致栈溢出,而过大的线程栈会浪费内存资源。 - **过度依赖默认参数**:不同版本的 JDK 默认参数可能不同,过度依赖默认参数可能导致性能问题 [^1]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值