以下是一些常用的JVM参数:
- 通用选项:
-Xms
:设置堆内存的初始大小。-Xmx
:设置堆内存的最大大小。-Xss
:设置线程栈的大小。-XX:MaxMetaspaceSize
:设置元空间(替代永久代)的最大大小。-XX:MaxDirectMemorySize
:设置直接内存的最大大小。
- 垃圾回收选项:
-XX:+UseSerialGC
:启用串行垃圾回收器。-XX:+UseParallelGC
:启用并行垃圾回收器。-XX:+UseConcMarkSweepGC
:启用并发标记清除垃圾回收器。-XX:+UseG1GC
:启用G1垃圾回收器。-XX:MaxGCPauseMillis
:设置最大垃圾回收暂停时间的目标值。
- 内存管理选项:
-XX:NewRatio
:设置新生代和老年代的比例。-XX:SurvivorRatio
:设置Survivor区与Eden区的比例。-XX:MaxTenuringThreshold
:设置对象晋升到老年代的年龄阈值。
- 性能调优选项:
-XX:+AggressiveOpts
:启用一系列依赖于平台的性能优化选项。-XX:+UseStringDeduplication
:启用字符串去重,减少字符串对象的内存占用。-XX:CompileThreshold
:设置方法即时编译的阈值。
- 示例参数配置 -Xmn512m -Xms128m -Xmx1024m -Xss256k
-
-Xmn512m
:设置新生代(Young Generation)的大小为512MB。新生代是堆内存中用于分配新对象的区域。 -
-Xms128m
:设置堆内存的初始大小为128MB。这是JVM在启动时为堆分配的初始内存量。 -
-Xmx1024m
:设置堆内存的最大大小为1024MB。这是JVM允许堆内存达到的最大限制。 -
-Xss256k
:设置线程栈的大小为256KB。线程栈用于存储线程执行时的局部变量和方法调用信息。
-
-
这些参数主要用于控制Java应用程序的内存管理和线程调度。通过调整这些参数,可以优化应用程序的性能和资源利用率。
需要注意的是,这些值是示例值,根据具体的应用程序和服务器配置,您可能需要根据实际情况进行调整。确保在分配内存时考虑到应用程序的需求和服务器的可用资源,以避免出现内存不足或过度分配导致系统负载过高的问题。
需要注意的是,虽然这些是默认的垃圾回收器,但可以通过命令行参数 -XX:+UseParallelGC
、-XX:+UseG1GC
等来显式地选择其他的垃圾回收器,以满足特定应用程序的需求。另外,后续的 JDK 版本可能会有更改,所以建议查看相关文档来了解最新的默认垃圾回收器。
- 垃圾回收器介绍
-
在JDK 1.8、11和17中,默认的垃圾回收器是不同的。
-
JDK 1.8 默认使用的是 Parallel 垃圾回收器(Parallel Garbage Collector)。它是一种并行的垃圾回收器,主要关注吞吐量,在多核处理器上运行时表现良好。
-
JDK 11 默认使用的是 G1(Garbage-First)垃圾回收器(G1 Garbage Collector)。G1是一种并发的垃圾回收器,旨在实现低延迟和高吞吐量的折衷方案。它适用于大内存环境和大型应用程序。
-
JDK 17 默认使用的是 G1(Garbage-First)垃圾回收器(G1 Garbage Collector)。与 JDK 11 相同,JDK 17 仍然默认选择 G1 垃圾回收器作为主要的垃圾回收器。
- Serial垃圾回收器:
- 适用于小型或单线程应用程序。
- 可与小内存环境和有限硬件资源一起使用。
- 目标是最大程度地减少停顿时间,可能会牺牲吞吐量。
- Parallel垃圾回收器:
- 适用于对吞吐量要求高的应用程序。
- 适合多核处理器和大内存环境。
- 主要目标是通过并行执行垃圾回收来提高整体吞吐量。
- CMS(Concurrent Mark Sweep)垃圾回收器:
- 适用于对延迟敏感的应用程序。
- 目标是减少垃圾回收引起的停顿时间。
- 在具有较大堆内存和多核处理器的情况下,通常表现良好。
- G1(Garbage-First)垃圾回收器:
- 适用于大内存环境和大型应用程序。
- 目标是在不增加太多暂停时间的情况下,提供较高的吞吐量。
- 具有可预测的停顿时间和内存整理能力。
- ZGC(Z Garbage Collector)垃圾回收器:
- 适用于需要极低停顿时间的大内存应用程序。
- 目标是最大程度地减少暂停时间,通常限制在毫秒级别。
- 在需要快速响应和高吞吐量的场景中表现出色。
选择合适的垃圾回收器需要考虑应用程序的性能需求、延迟要求、堆大小、硬件资源以及垃圾回收器自身的特性。需要进行基准测试和调优来找到最适合特定应用程序的垃圾回收器配置。
在选择JVM垃圾回收器时,有几个重要的指标需要考虑和评估:
-
吞吐量(Throughput):衡量系统在单位时间内完成的工作量。对于需要高吞吐量的应用程序,选择具有较高并行性和较低停顿时间的垃圾回收器可能更合适。
-
延迟(Latency):衡量系统对请求的响应速度或操作完成所需的时间。对于对延迟敏感的应用程序,选择具有较低停顿时间的垃圾回收器可能更合适。
-
内存占用(Memory Footprint):衡量垃圾回收器在运行时对堆内存的使用情况。对于具有严格内存限制的环境,选择具有更高内存利用率的垃圾回收器可能更合适。
-
可预测性(Predictability):衡量垃圾回收器执行垃圾回收操作的稳定性和可预测性。对于需要可控、可预测的垃圾回收暂停时间的应用程序,选择具有较稳定暂停时间的垃圾回收器可能更合适。
-
硬件资源利用(Hardware Resource Utilization):衡量垃圾回收器对处理器、内存和其他硬件资源的利用情况。选择与可用硬件资源匹配的垃圾回收器可以提高整体系统性能。
综合考虑吞吐量、延迟、内存占用、可预测性和硬件资源利用等指标,并结合应用程序的特点和需求,选择最适合的垃圾回收器配置是一个综合性的决策过程。需要进行基准测试、性能评估和调优来找到最佳的垃圾回收器选择。