Jvm参数
JVM参数的设置对应用程序的性能和稳定性至关重要,尤其是在高并发场景下。合理的JVM参数配置可以优化内存使用、减少GC停顿时间、提升吞吐量。合适的jvm参数能将服务器性能压榨到极致。
堆内存设置
堆内存是JVM中最重要的内存区域,用于存储对象实例。合理设置堆内存大小可以避免频繁GC和内存溢出。
-Xms
:初始堆大小(建议与-Xmx
相同,避免动态调整带来的性能开销)。-Xmx
:最大堆大小(根据服务器内存和应用程序需求设置,通常设置为可用内存的70%-80%)。-Xmn
:年轻代大小(年轻代越大,Minor GC频率越低,但会减少老年代空间,需根据对象生命周期调整)。
例如:我的服务器是8G内存。我可以按以下参数设置。
-Xms6G -Xmx6G -Xmn3G
元空间设置
元空间(Metaspace)用于存储类的元数据,默认情况下没有大小限制,但为了避免内存泄漏或元空间过大,可以设置上限。
-XX:MetaspaceSize
:初始元空间大小。-XX:MaxMetaspaceSize
:最大元空间大小。
示例:
-XX:MetaspaceSize=512M -XX:MaxMetaspaceSize=1G
垃圾回收器选择
这也是Java这门语言常被人诟病的一项,选择合适的垃圾回收器可以显著减少GC停顿时间,提升系统性能。以下是常见的垃圾回收器及其适用场景:
1. Serial GC(串行回收器)
适用于单核CPU或小型应用。
参数:
-XX:+UseSerialGC
2. Parallel GC(并行回收器)
适用于多核CPU,追求高吞吐量的场景。
参数:
-XX:+UseParallelGC
3. CMS GC(并发标记清除回收器)
适用于对响应时间敏感的应用,减少GC停顿时间。
参数:
-XX:+UseConcMarkSweepGC
4. G1 GC(Garbage-First回收器)
适用于大内存、低延迟的场景,是JDK 9及以后的默认回收器。
参数:
-XX:+UseG1GC
示例:
-XX:+UseG1GC
GC日志配置
开启GC日志可以帮助分析垃圾回收行为,优化JVM参数。
-XX:+PrintGCDetails
:打印GC详细信息。-XX:+PrintGCDateStamps
:打印GC时间戳。-Xloggc:<file>
:将GC日志输出到指定文件。
示例:
-XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:/path/to/gc.log
线程栈大小
每个线程都会占用一定的栈空间,默认大小为1MB。如果线程数较多,可以适当减小栈大小以节省内存。
-Xss
:设置线程栈大小。
示例:
-Xss512k
直接内存设置
直接内存(Direct Memory)用于NIO操作,默认与堆内存大小相同。如果应用程序使用大量NIO操作,可以适当调整。
-XX:MaxDirectMemorySize
:设置最大直接内存大小。
示例:
-XX:MaxDirectMemorySize=1G
其他优化参数
-XX:+DisableExplicitGC
:禁止显式调用System.gc()
,避免不必要的Full GC。-XX:+HeapDumpOnOutOfMemoryError
:在内存溢出时生成堆转储文件,便于分析。-XX:HeapDumpPath=<path>
:指定堆转储文件的保存路径。-XX:+UseCompressedOops
:启用压缩指针,减少内存占用(64位JVM默认启用)。-XX:+UseStringDeduplication
:字符串去重,减少内存占用(G1 GC下有效)。
示例:
-XX:+DisableExplicitGC -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/path/to/dump
完整的JVM参数示例
以下是一个适用于高并发场景的JVM参数配置示例:
-Xms4G -Xmx4G -Xmn2G \
-XX:MetaspaceSize=256M -XX:MaxMetaspaceSize=512M \
-XX:+UseG1GC \
-XX:MaxGCPauseMillis=200 \
-XX:ParallelGCThreads=4 \
-XX:ConcGCThreads=2 \
-XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:/path/to/gc.log \
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/path/to/dump \
-XX:+DisableExplicitGC \
-XX:+UseStringDeduplication \
-Xss512k