oracle 官方G1GC
https://www.oracle.com/technical-resources/articles/java/g1gc.html
评估和微调 G1 GC 时,请记住以下建议: 年轻代大小:避免使用 -Xmn 选项或 -XX:NewRatio 等其他相关选项显式设置年轻代大小。固定年轻代的大小会覆盖暂停时间目标。
JVM调优总结
https://blog.csdn.net/RickyIT/article/details/53895060
jdk21的垃圾回收器
- G1 (Garbage First) 垃圾回收器:
适用于大堆内存的应用程序(通常超过4GB的堆内存)。 适用于需要较低停顿时间的应用程序,因为它的主要目标是降低垃圾回收停顿时间。 适用于多核处理器和大内存的服务器,因为它可以充分利用多核 CPU 和大内存来实现高吞吐量。
- Parallel 垃圾回收器:
适用于需要高吞吐量的应用程序,它的主要目标是最大化应用程序的吞吐量。 适用于拥有大量 CPU 资源的服务器,因为它能够充分利用多核 CPU。 不适用于需要低停顿时间的应用程序,因为它的停顿时间通常较长。
- Z Garbage Collector:
适用于需要非常低的垃圾回收停顿时间的应用程序。它的主要目标是最小化停顿时间。 适用于需要预测性能的应用程序,因为它通过控制垃圾回收停顿时间来提供可预测的性能。 适用于大堆内存的应用程序,可以有效减小大堆内存的停顿时间。
- Shenandoah 垃圾回收器:
适用于需要极低停顿时间的应用程序。它的设计目标是最小化垃圾回收引起的停顿时间。 适用于大堆内存的应用程序,因为它可以有效减小大堆内存的停顿时间。
- Epsilon 垃圾回收器:
Epsilon 不是一个传统的垃圾回收器,而是一种实验性的垃圾回收器,其主要设计目标是完全消除垃圾回收停顿时间。 适用于一些特殊场景,如非常短寿命的应用程序或需要尽量减小垃圾回收开销的场合。不适用于大多数生产环境。 以上是 JDK 21 中常见的垃圾回收器及其主要应用场景的总结。在实际应用中,根据应用程序的性能需求、硬件配置和其他因素,你可以选择合适的垃圾回收器,并根据具体情况进行性能测试和调优。不同的垃圾回收器提供了不同的权衡,因此根据应用程序的特点进行选择非常重要。
JDK 21 默认的垃圾回收器(Garbage Collector)是 G1(Garbage First)垃圾回收器。在 JDK 9 和之后的版本中,G1 成为默认的垃圾回收器,取代了之前的默认垃圾回收器 Parallel 垃圾回收器。当你没有显式指定其他垃圾回收器时,JDK 21 使用 G1 垃圾回收器作为默认选项。
JDK21参数
在 JDK 21 或其他较新版本中,你可以使用一些优化参数来提高 Java 应用程序的性能。以下是一些常见的 JDK 21 优化参数的建议:
选择垃圾回收器:选择适合你的应用程序的垃圾回收器。JDK 21通常支持多种垃圾回收器,如 G1、Parallel 和 Z Garbage Collector。你可以使用 -XX:+UseG1GC、-XX:+UseParallelGC 或 -XX:+UseZGC 来选择相应的垃圾回收器。不同的垃圾回收器适用于不同的用例,所以要根据你的应用程序需求来选择。
调整堆大小:通过 -Xms 和 -Xmx 参数来调整堆大小。合理的堆大小设置可以减少垃圾回收的频率,从而提高性能。
启用编译优化:使用 -XX:+TieredCompilation 启用分层编译,这将在运行时进行更多的 JIT 编译,提高应用程序的性能。
启用性能分析工具:使用 -XX:+PrintCompilation 和 -XX:+PrintGC 等参数启用性能分析工具,以帮助你了解应用程序的行为并进行性能调优。
启用启动优化:使用 -XX:+UseAppCDS 启用应用程序类数据共享,以加速应用程序的启动时间。
启用多线程处理器:使用 -XX:+UseNUMA 来启用非一致性内存访问 (NUMA) 支持,以提高多核系统上的性能。
使用合适的 NIO 缓冲区大小:根据你的应用程序需求,合理选择 NIO 缓冲区的大小,以减少 I/O 操作的开销。
启用并行处理:如果你的应用程序可以受益于并行处理,可以使用并行库和线程池来加速处理。
避免不必要的同步:减少不必要的锁和同步操作,以提高多线程应用程序的性能。
使用性能分析工具:使用性能分析工具(如 VisualVM、YourKit 或 Flight Recorder)来识别性能瓶颈,并进行进一步的优化。
需要注意的是,优化参数的选择应该根据你的具体应用程序需求和硬件环境来进行调整。 在使用这些参数之前,建议先进行基准测试和性能分析,以确保它们对你的应用程序产生积极的影响。不同应用程序可能需要不同的参数设置,因此需要根据具体情况来进行调整。
jdk21参数
# 设置堆的最大大小:这将设置堆的最大大小为 4GB。您可以根据可用的内存资源来调整此值。
"-XX:MaxHeapSize=4G",\
# 设置新生代堆大小的百分比:这将设置新生代堆大小为堆的 30%。您可以根据应用程序的需求和性能来调整此值。
"-XX:G1NewSizePercent=30",\
#设置新生代堆大小的最大百分比:这将设置新生代堆的最大大小为堆的 60%。这个参数用于限制新生代堆大小的上限。
"-XX:G1MaxNewSizePercent=60",\
# 最大垃圾回收暂停时间200ms,这将设置垃圾回收的最大暂停时间目标为 200 毫秒。您可以根据您的应用程序对停顿时间的需求进行调整。
"-XX:MaxGCPauseMillis=200",\
# 设置堆区域大小:这将设置 G1 垃圾回收器的堆区域大小为 2MB。默认值通常是 1MB。调整堆区域大小可以影响 G1 的性能。
"-XX:G1HeapRegionSize=2M",\
docker
FROM openjdk:17.0.2
ADD ./knowledge-api-server/target/knowledge-api-server-dev.jar knowledge-api-server-dev.jar
EXPOSE 12121 2898
ENTRYPOINT ["java",\
"--enable-preview",\
# 最大堆大小 等同于-XX:MaxHeapSize
"-Xmx1g",\
# 启动时分配,初始堆大小
"-Xms1g",\
"-Xmn512m",\
# 启用G1
"-XX:+UseG1GC",\
# 为每个线程分配
"-Xss512k",\
"-XX:MaxDirectMemorySize=512m",\
"-XX:+DisableExplicitGC",\
"-Dspring.profiles.active=dev",\
"-Dserver.port=12121",\
"-Djava.rmi.server.hostname=192.168.3.5",\
"-Dcom.sun.management.jmxremote.rmi.port=2898",\
"-Dcom.sun.management.jmxremote=true",\
"-Dcom.sun.management.jmxremote.port=2898",\
"-Dcom.sun.management.jmxremote.authenticate=false",\
"-Dcom.sun.management.jmxremote.ssl=false",\
"-Dcom.sun.management.jmxremote.local.only=false",\
"-Dfile.encoding=utf-8","-Djava.security.egd=file:/dev/./urandom","-jar","-Duser.timezone=GMT+8","/knowledge-api-server-dev.jar"]
VisualVM、YourKit 或 Flight Recorder
- Remote 右键
- Add Remote Host
- Add JMX Connection 输入 192.168.3.55:2898