JVM相关知识(参数篇)

474 阅读6分钟

JVM内存设置参数

  1. -Xms-Xmx

    • -Xms:设置 JVM 堆内存的初始大小(单位:字节、KB、MB、GB)。
    • -Xmx:设置 JVM 堆内存的最大大小(单位:字节、KB、MB、GB)。
    • 作用:控制 JVM 启动时的堆内存大小以及可以分配的最大堆内存大小。合理配置这些参数可以避免堆内存不足或浪费。
  2. -XX:NewSize-XX:MaxNewSize

    • -XX:NewSize:设置年轻代的初始大小。
    • -XX:MaxNewSize:设置年轻代的最大大小。
    • 作用:通过调整年轻代的大小,影响年轻代垃圾回收的频率和性能。
  3. -XX:SurvivorRatio

    • 设置 Eden 区和 Survivor 区的大小比例,默认值为 8(即 Eden 区的大小为 Survivor 区的 8 倍)。
    • 作用:影响垃圾回收时对象晋升到老年代的策略,调整对象在年轻代中的存活时间。
  4. -XX:MetaspaceSize-XX:MaxMetaspaceSize

    • -XX:MetaspaceSize:设置 Metaspace 的初始大小。
    • -XX:MaxMetaspaceSize:设置 Metaspace 的最大大小,默认不限制。
    • 作用:java8之前是永久代。调整 Java 类的元数据区域(Metaspace)的大小。Metaspace 由默认的堆内存区域扩展出来,存储类的元数据。
  5. -XX:MaxDirectMemorySize-XX:NativeMemoryTracking

    • -XX:MaxDirectMemorySize作用:该参数用于设置 直接内存(Direct Memory)的最大值,直接内存是堆外内存的一种。通过 DirectByteBuffer 分配的内存就是直接内存。-XX:MaxDirectMemorySize 限制了 JVM 进程能够使用的最大直接内存大小。默认情况下,直接内存的大小与堆内存大小相同,即 -Xmx 设置的值。
    • -XX:NativeMemoryTracking作用:启用或禁用 本地内存跟踪。本地内存(Native Memory)包括直接内存、JVM 本身的内存以及堆外的其他内存。通过启用 NativeMemoryTracking(NMT),你可以监控 JVM 使用的堆外内存,并获得详细的内存分配信息,有助于进行性能分析。默认是禁用的。
  6. -XX:ThreadStackSize

    • 作用:设置每个线程的栈大小,默认为1M
  7. -XX:MaxDirectMemorySize

    • 作用:该参数用于设置 直接内存(Direct Memory)的最大值,直接内存是堆外内存的一种。通过 DirectByteBuffer 分配的内存就是直接内存。-XX:MaxDirectMemorySize 限制了 JVM 进程能够使用的最大直接内存大小。

    • 默认值:默认情况下,直接内存的大小与堆内存大小相同,即 -Xmx 设置的值。

    • 配置示例

    -XX:MaxDirectMemorySize=1g  # 设置最大直接内存为 1GB
    
  8. -XX:NativeMemoryTracking

    • 作用:启用或禁用 本地内存跟踪。本地内存(Native Memory)包括直接内存、JVM 本身的内存以及堆外的其他内存。通过启用 NativeMemoryTracking(NMT),你可以监控 JVM 使用的堆外内存,并获得详细的内存分配信息,有助于进行性能分析。

    • 默认值:该功能默认是禁用的。

    • 配置示例

    -XX:NativeMemoryTracking=summary  # 启用本地内存跟踪(概要信息)
    -XX:NativeMemoryTracking=detail   # 
    
  9. 拓展延伸(Netty堆外内存监控)

  • -Dio.netty.leakDetectionLevel 的作用

    Netty 内存泄漏检测分为几个级别,主要有三个选项:

    • DISABLED:禁用内存泄漏检测。
    • SIMPLE:启用简单的内存泄漏检测,只检测常见的内存泄漏场景。
    • ADVANCED:启用更全面的内存泄漏检测,检测更复杂的内存泄漏情况,提供更详细的信息。
  • 其他相关参数

除了 -Dio.netty.leakDetectionLevel 之外,Netty 还提供了其他与内存泄漏检测相关的配置项:

  • io.netty.leakDetectionTarget:设置泄漏报告的目标,可以选择 System.errlog(默认值是 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

    • 设置每个线程的栈大小。
    • 作用:控制每个线程分配的栈内存大小,适用于线程数量非常多或递归调用深度较深的场景。

其他参数

  1. -XX:CompileThreshold

    • 设置编译器优化的阈值,当某个方法的调用次数超过该阈值时,会被编译为本地代码(JIT 编译)。
    • 作用:控制 JIT 编译的启动时机,帮助优化性能。
  2. -XX:+AggressiveOpts

    • 启用一些实验性优化,提升 JVM 性能。
    • 作用:开启一些未正式发布的性能优化。
  3. -XX:+UseCompressedOop:

    • 启用 压缩对象指针。
    • 作用:显著减少 Java 堆内存的占用。(启用压缩指针后,指向对象的引用将占用 4 字节(32 位)而不是 8 字节。)
    • 前提:只适用于64位系统, 堆内存的大小必须小于 32GB,超过此大小则无法启用压缩指针。