JVM(Java Virtual Machine)性能调优是优化Java应用程序性能的关键步骤。以下是一些应该考虑的JVM性能调优方面:
了解程序的运行状况,查看其活跃的数据量。活跃的数据量包括应用程序运行于稳定状态时,老年代占用的java堆大小和永久代占用的java堆大小。
根据活跃的数据量配置堆以及其他参数。老年代空间大小不应该小于活跃数据大小的1.5倍。新生代空间至少应为Java堆的10%. 新生代空间应该为老年代空间活跃数据的1~1.5倍。
增大 Java 堆大小时,需要注意不要超过JVM可用的物理内存数。
日志分析可以帮助您更好地了解程序的运行状况。您可以通过日志分析来查看程序的运行频率、耗时等信息。
-Xms
和 -Xmx
来设置初始堆大小和最大堆大小,以适应应用程序的内存需求。不同的垃圾收集器在吞吐量、响应时间和内存占用等方面有不同的特点。以下是Serial、Parallel、CMS(Concurrent Mark-Sweep)、G1(Garbage-First)垃圾收集器的优劣点和一般的使用策略:
1. **Serial 收集器:**
- **优点:**
- 单线程执行,简单高效。
- 对于小型应用和单核处理器的环境,性能较好。
- **缺点:**
- 不适用于多核处理器,不能充分利用硬件资源。
- 在垃圾收集期间,应用程序暂停。
- **适用场景:**
- 移动设备、小型应用、开发和测试环境。
2. **Parallel 收集器:**
- **优点:**
- 多线程执行,适用于多核处理器,提供更高的吞吐量。
- 在垃圾收集期间,应用程序暂停时间相对较短。
- **缺点:**
- 仍然有较长的暂停时间,不适合对延迟敏感的应用。
- **适用场景:**
- 吞吐量优先的应用,例如后台计算和数据处理。
3. **CMS(Concurrent Mark-Sweep)收集器:**
- **优点:**
- 通过并发标记和清除,减少了垃圾收集暂停时间,适合对延迟敏感的应用。
- 在老年代的垃圾收集中表现较好。
- **缺点:**
- 由于并发执行,可能导致更多的碎片,影响长时间运行的性能。
- CMS收集器在处理幸存对象时可能需要重新扫描老年代。
- **适用场景:**
- 对延迟敏感的应用,老年代的垃圾收集较为频繁。
4. **G1(Garbage-First)收集器:**
- **优点:**
- 通过划分整个堆空间为多个小块,实现更精细的垃圾收集。
- 在大堆和多核环境中提供更稳定的性能。
- 具有可预测的停顿时间,适用于对延迟敏感的应用。
- **缺点:**
- 在某些情况下,吞吐量可能低于Parallel收集器。
- 相对较复杂的算法,可能引入一些额外的开销。
- **适用场景:**
- 大堆、对延迟敏感的应用,以及需要稳定性能的场景。
通常的使用策略:
总体而言,选择垃圾收集器应该根据应用的性质、硬件环境、性能需求和内存特征等因素进行综合考虑。性能测试和监测是选择最合适收集器的关键。
-XX:NewRatio
。-XX:SurvivorRatio
参数来平衡Eden区和Survivor区的大小。-XX:ParallelGCThreads
。-XX:MaxMetaspaceSize
来设置元空间的最大大小。-XX:MaxPermSize
来设置永久代的最大大小。-Xss
来设置线程的堆栈大小。-XX:+TraceClassLoading
和 -XX:+TraceClassUnloading
来跟踪类加载和卸载。-XX:+CMSClassUnloadingEnabled
来允许CMS收集器卸载不再使用的类。-XX:+PrintCompilation
参数来观察JIT编译的过程。-XX:CompileThreshold
参数,以更好地适应应用程序的性能特征。VisualVM 是 jdk 自带的,可以直接打开,并且还是中文版本的,注意 M1 的 mac 是没有的!!!
工具的对比分析如下:
以下是一些常见的内存分析工具:
-Xloggc:
-XX:+PrintGCDetails
。测试工具有 LoadRunner、JMeter和 Gatling 等,日常使用一般都是 JMeter,可以同时进行压测,文档接口可以使用 APIFox 或者 Yapi,后者是开源的,同时可以做一些环境测试和接口测试,但是注意官方版不支持三级目录。
这些方面提供了一些常见的JVM性能调优的考虑点。在进行性能调优时,建议通过监测、测试和分析来全面评估系统的性能,并根据实际需求进行有针对性的调整。