JVM内存设置参数
-
-Xms和-Xmx:-Xms:设置 JVM 堆内存的初始大小(单位:字节、KB、MB、GB)。-Xmx:设置 JVM 堆内存的最大大小(单位:字节、KB、MB、GB)。- 作用:控制 JVM 启动时的堆内存大小以及可以分配的最大堆内存大小。合理配置这些参数可以避免堆内存不足或浪费。
-
-XX:NewSize和-XX:MaxNewSize:-XX:NewSize:设置年轻代的初始大小。-XX:MaxNewSize:设置年轻代的最大大小。- 作用:通过调整年轻代的大小,影响年轻代垃圾回收的频率和性能。
-
-XX:SurvivorRatio:- 设置 Eden 区和 Survivor 区的大小比例,默认值为 8(即 Eden 区的大小为 Survivor 区的 8 倍)。
- 作用:影响垃圾回收时对象晋升到老年代的策略,调整对象在年轻代中的存活时间。
-
-XX:MetaspaceSize和-XX:MaxMetaspaceSize:-XX:MetaspaceSize:设置 Metaspace 的初始大小。-XX:MaxMetaspaceSize:设置 Metaspace 的最大大小,默认不限制。- 作用:java8之前是永久代。调整 Java 类的元数据区域(Metaspace)的大小。Metaspace 由默认的堆内存区域扩展出来,存储类的元数据。
-
-XX:MaxDirectMemorySize和-XX:NativeMemoryTracking-XX:MaxDirectMemorySize作用:该参数用于设置 直接内存(Direct Memory)的最大值,直接内存是堆外内存的一种。通过DirectByteBuffer分配的内存就是直接内存。-XX:MaxDirectMemorySize限制了 JVM 进程能够使用的最大直接内存大小。默认情况下,直接内存的大小与堆内存大小相同,即-Xmx设置的值。-XX:NativeMemoryTracking作用:启用或禁用 本地内存跟踪。本地内存(Native Memory)包括直接内存、JVM 本身的内存以及堆外的其他内存。通过启用 NativeMemoryTracking(NMT),你可以监控 JVM 使用的堆外内存,并获得详细的内存分配信息,有助于进行性能分析。默认是禁用的。
-
-XX:ThreadStackSize- 作用:设置每个线程的栈大小,默认为1M
-
-XX:MaxDirectMemorySize-
作用:该参数用于设置 直接内存(Direct Memory)的最大值,直接内存是堆外内存的一种。通过
DirectByteBuffer分配的内存就是直接内存。-XX:MaxDirectMemorySize限制了 JVM 进程能够使用的最大直接内存大小。 -
默认值:默认情况下,直接内存的大小与堆内存大小相同,即
-Xmx设置的值。 -
配置示例:
-XX:MaxDirectMemorySize=1g # 设置最大直接内存为 1GB -
-
-XX:NativeMemoryTracking-
作用:启用或禁用 本地内存跟踪。本地内存(Native Memory)包括直接内存、JVM 本身的内存以及堆外的其他内存。通过启用
NativeMemoryTracking(NMT),你可以监控 JVM 使用的堆外内存,并获得详细的内存分配信息,有助于进行性能分析。 -
默认值:该功能默认是禁用的。
-
配置示例:
-XX:NativeMemoryTracking=summary # 启用本地内存跟踪(概要信息) -XX:NativeMemoryTracking=detail # -
-
拓展延伸(Netty堆外内存监控)
-
-Dio.netty.leakDetectionLevel的作用Netty 内存泄漏检测分为几个级别,主要有三个选项:
- DISABLED:禁用内存泄漏检测。
- SIMPLE:启用简单的内存泄漏检测,只检测常见的内存泄漏场景。
- ADVANCED:启用更全面的内存泄漏检测,检测更复杂的内存泄漏情况,提供更详细的信息。
-
其他相关参数
除了 -Dio.netty.leakDetectionLevel 之外,Netty 还提供了其他与内存泄漏检测相关的配置项:
io.netty.leakDetectionTarget:设置泄漏报告的目标,可以选择System.err或log(默认值是System.err)。io.netty.leakDetectionThreshold:设置报告内存泄漏时的阈值(泄漏持续的时间)。只有泄漏持续时间超过此阈值才会报告。
例如,可以通过设置以下参数来调整泄漏检测的阈值和目标:
-Dio.netty.leakDetectionTarget=log # 使用日志输出
-Dio.netty.leakDetectionThreshold=1000 # 设置泄漏检测阈值为 1000 毫秒
JVM垃圾回收相关参数
-XX:+UseSerialGC:启用串行垃圾回收器(Serial GC)。作用:适用于内存较小的环境,因为该收集器在垃圾回收时只使用单线程。-XX:+UseParallelGC:启用并行垃圾回收器(Parallel GC)。作用:利用多核 CPU 并行回收,适用于吞吐量优先的应用-XX:+UseConcMarkSweepGC:启用 CMS(Concurrent Mark-Sweep)垃圾回收器。作用:适用于低延迟场景,最小化 GC 停顿时间,通过并发执行标记、清理过程来避免长时间的暂停。-XX:+UseG1GC:启用 G1(Garbage First)垃圾回收器。作用:适用于大内存系统,能够平衡停顿时间和吞吐量,特别是在堆较大时表现良好。-XX:+UseZGC 和 -XX:+UseShenandoahGC:启用 ZGC 或 Shenandoah GC,这两者都是低延迟的垃圾回收器。作用:适用于需要极低停顿时间的应用场景。-XX:MaxGCPauseMillis:设置垃圾回收的最大停顿时间。作用:用于 G1 GC、ZGC 和其他低延迟回收器,控制垃圾回收时的最大停顿时间。-XX:ParallelGCThreads:设置并行垃圾回收时使用的线程数量。作用:通过增加线程数来加快垃圾回收速度,特别适用于多核机器。-XX:ConcGCThreads:设置并发标记垃圾回收时使用的线程数量(适用于 CMS 和 G1 GC)。作用:影响垃圾回收的并发性能。
JVM 性能调优相关参数
-
-XX:+PrintGCDetails:- 打印详细的垃圾回收日志。
- 作用:通过 GC 日志帮助分析垃圾回收的性能,常与
-Xloggc:<file>配合使用,输出日志文件。
-
-XX:+PrintGCDateStamps:- 打印垃圾回收的时间戳。
- 作用:帮助分析垃圾回收发生的时间,通常与
-XX:+PrintGCDetails一起使用。
-
-XX:+HeapDumpOnOutOfMemoryError:- 在发生 OutOfMemoryError 时自动生成堆转储文件(heap dump)。
- 作用:有助于调试内存泄漏和堆溢出问题。
-
-XX:HeapDumpPath:- 设置堆转储文件的路径。
- 作用:指定堆转储文件保存的路径。
-
-XX:+DisableExplicitGC:- 禁用显式调用
System.gc()。 - 作用:避免应用程序手动调用垃圾回收,导致不必要的 Full GC。此参数通常用于性能调优,防止
System.gc()导致的停顿。
- 禁用显式调用
JVM 启动和其他通用参数
-
-version:- 显示当前 JVM 的版本信息。
- 作用:查看当前运行的 Java 版本。
-
-D<name>=<value>:- 设置 JVM 系统属性。
- 作用:可以设置各种 JVM 系统属性(如日志配置、应用配置等),通过
System.getProperty(<name>)获取。
示例:
-Duser.timezone=UTC -
-Xloggc:<file>:- 将垃圾回收日志输出到指定的文件中。
- 作用:将 GC 详细信息输出到文件,便于后续分析。
-
-XX:+PrintFlagsFinal:- 打印 JVM 启动时所有参数的默认值。
- 作用:查看所有 JVM 参数及其当前的值,帮助进行调优。
-
-Xss:- 设置每个线程的栈大小。
- 作用:控制每个线程分配的栈内存大小,适用于线程数量非常多或递归调用深度较深的场景。
其他参数
-
-XX:CompileThreshold:- 设置编译器优化的阈值,当某个方法的调用次数超过该阈值时,会被编译为本地代码(JIT 编译)。
- 作用:控制 JIT 编译的启动时机,帮助优化性能。
-
-XX:+AggressiveOpts:- 启用一些实验性优化,提升 JVM 性能。
- 作用:开启一些未正式发布的性能优化。
-
-XX:+UseCompressedOop:- 启用 压缩对象指针。
- 作用:显著减少 Java 堆内存的占用。(启用压缩指针后,指向对象的引用将占用 4 字节(32 位)而不是 8 字节。)
- 前提:只适用于64位系统, 堆内存的大小必须小于 32GB,超过此大小则无法启用压缩指针。