JVM 启动参数
JAVA_OPTS = "-Xms4G -Xmx4G -Xmn2G -XX:MetaspaceSize=512M -XX:MaxMetaspaceSize=512M -XX:+UseParallelGC -XX:+PrintGCDetails -Xloggc:/home/gc.log -XX:+PrintGCDateStamps -XX:+PrintGCTimeStamps -XX:+PrintHeapAtGC"
JVM 启动参数的设定
- -XX:+PrintGCDetails: 输出 GC 的详细信息,包括每次垃圾回收后堆内存的使用情况和回收前后的状态。
- -Xloggc:/home/gc.log: 将 GC 日志保存到文件 /home/gc.log 中,而不是输出到控制台。这样可以在应用程序运行后分析日志。
- -XX:+PrintGCDateStamps: 为每次 GC 日志记录添加日期戳,方便查看垃圾回收发生的时间。
- -XX:+PrintGCTimeStamps: 为每次 GC 日志添加 JVM 启动后经过的时间,以秒为单位。
- -XX:+PrintHeapAtGC: 打印垃圾回收前后堆的详细状态,包括各代(年轻代、老年代、元空间)的内存分配情况。
- -XX:+UseParallelGC: 使用 Parallel GC(并行垃圾回收器),通过多线程并行执行垃圾回收来提高性能。
GC日志片段
OpenJDK 64-Bit Server VM (25.342-b07) for linux-amd64 JRE (1.8.0_342-b07), built on Jul 16 2022 09:19:19 by "openjdk" with gcc 4.4.7 20120313 (Red Hat 4.4.7-23)
Memory: 4k page, physical 8388608k(8386904k free), swap 0k(0k free)
CommandLine flags: -XX:CompressedClassSpaceSize=528482304 -XX:InitialHeapSize=4294967296 -XX:MaxHeapSize=4294967296 -XX:MaxMetaspaceSize=536870912 -XX:MaxNewSize=2147483648 -XX:MetaspaceSize=536870912 -XX:NewSize=2147483648 -XX:+PrintGC -XX:+PrintGCDateStamps -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintHeapAtGC -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseParallelGC
2024-09-24T10:43:44.094+0800: 21.703: Total time for which application threads were stopped: 0.0015655 seconds, Stopping threads took: 0.0000978 seconds
{Heap before GC invocations=11 (full 0):
PSYoungGen total 1494528K, used 1466389K [0x0000000790800000, 0x00000007f0800000, 0x00000007f0800000)
eden space 1414656K, 100% used [0x0000000790800000,0x00000007e6d80000,0x00000007e6d80000)
from space 79872K, 64% used [0x00000007eba00000,0x00000007eec85748,0x00000007f0800000)
to space 78336K, 0% used [0x00000007e6d80000,0x00000007e6d80000,0x00000007eba00000)
ParOldGen total 2621440K, used 72408K [0x00000006f0800000, 0x0000000790800000, 0x0000000790800000)
object space 2621440K, 2% used [0x00000006f0800000,0x00000006f4eb60e0,0x0000000790800000)
Metaspace used 114761K, capacity 120350K, committed 120576K, reserved 1155072K
class space used 13324K, capacity 14260K, committed 14336K, reserved 1048576K
2024-09-24T10:43:44.149+0800: 21.759: [GC (Allocation Failure) [PSYoungGen: 1466389K->41915K(1492992K)] 1538798K->152295K(4114432K), 0.0591035 secs] [Times: user=0.16 sys=0.01, real=0.06 secs]
Heap after GC invocations=11 (full 0):
PSYoungGen total 1492992K, used 41915K [0x0000000790800000, 0x00000007f0800000, 0x00000007f0800000)
eden space 1414656K, 0% used [0x0000000790800000,0x0000000790800000,0x00000007e6d80000)
from space 78336K, 53% used [0x00000007e6d80000,0x00000007e966ee58,0x00000007eba00000)
to space 78336K, 0% used [0x00000007ebb80000,0x00000007ebb80000,0x00000007f0800000)
ParOldGen total 2621440K, used 110380K [0x00000006f0800000, 0x0000000790800000, 0x0000000790800000)
object space 2621440K, 4% used [0x00000006f0800000,0x00000006f73cb088,0x0000000790800000)
Metaspace used 114761K, capacity 120350K, committed 120576K, reserved 1155072K
class space used 13324K, capacity 14260K, committed 14336K, reserved 1048576K
}
2024-09-24T10:43:44.209+0800: 21.818: Total time for which application threads were stopped: 0.0593724 seconds, Stopping threads took: 0.0000333 seconds
{Heap before GC invocations=906 (full 2):
PSYoungGen total 2065920K, used 2041627K [0x0000000760800000, 0x00000007e0800000, 0x00000007e0800000)
eden space 2034688K, 100% used [0x0000000760800000,0x00000007dcb00000,0x00000007dcb00000)
from space 31232K, 22% used [0x00000007de980000,0x00000007df046e10,0x00000007e0800000)
to space 31232K, 0% used [0x00000007dcb00000,0x00000007dcb00000,0x00000007de980000)
ParOldGen total 2097152K, used 2080736K [0x00000006e0800000, 0x0000000760800000, 0x0000000760800000)
object space 2097152K, 99% used [0x00000006e0800000,0x000000075f7f8060,0x0000000760800000)
Metaspace used 176015K, capacity 189742K, committed 191104K, reserved 1218560K
class space used 19024K, capacity 21351K, committed 21632K, reserved 1048576K
2024-09-24T14:14:45.047+0800: 11571.644: [GC (Allocation Failure) [PSYoungGen: 2041627K->26414K(2061312K)] 4122363K->2109278K(4158464K), 0.0208053 secs] [Times: user=0.07 sys=0.00, real=0.02 secs]
Heap after GC invocations=906 (full 2):
PSYoungGen total 2061312K, used 26414K [0x0000000760800000, 0x00000007e0800000, 0x00000007e0800000)
eden space 2034688K, 0% used [0x0000000760800000,0x0000000760800000,0x00000007dcb00000)
from space 26624K, 99% used [0x00000007dcb00000,0x00000007de4cba70,0x00000007de500000)
to space 33792K, 0% used [0x00000007de700000,0x00000007de700000,0x00000007e0800000)
ParOldGen total 2097152K, used 2082863K [0x00000006e0800000, 0x0000000760800000, 0x0000000760800000)
object space 2097152K, 99% used [0x00000006e0800000,0x000000075fa0be58,0x0000000760800000)
Metaspace used 176015K, capacity 189742K, committed 191104K, reserved 1218560K
class space used 19024K, capacity 21351K, committed 21632K, reserved 1048576K
}
{Heap before GC invocations=907 (full 3):
PSYoungGen total 2061312K, used 26414K [0x0000000760800000, 0x00000007e0800000, 0x00000007e0800000)
eden space 2034688K, 0% used [0x0000000760800000,0x0000000760800000,0x00000007dcb00000)
from space 26624K, 99% used [0x00000007dcb00000,0x00000007de4cba70,0x00000007de500000)
to space 33792K, 0% used [0x00000007de700000,0x00000007de700000,0x00000007e0800000)
ParOldGen total 2097152K, used 2082863K [0x00000006e0800000, 0x0000000760800000, 0x0000000760800000)
object space 2097152K, 99% used [0x00000006e0800000,0x000000075fa0be58,0x0000000760800000)
Metaspace used 176015K, capacity 189742K, committed 191104K, reserved 1218560K
class space used 19024K, capacity 21351K, committed 21632K, reserved 1048576K
2024-09-24T14:14:45.068+0800: 11571.665: [Full GC (Ergonomics) [PSYoungGen: 26414K->0K(2061312K)] [ParOldGen: 2082863K->300700K(2097152K)] 2109278K->300700K(4158464K), [Metaspace: 176015K->174750K(1218560K)], 0.6404574 secs] [Times: user=1.88 sys=0.00, real=0.64 secs]
Heap after GC invocations=907 (full 3):
PSYoungGen total 2061312K, used 0K [0x0000000760800000, 0x00000007e0800000, 0x00000007e0800000)
eden space 2034688K, 0% used [0x0000000760800000,0x0000000760800000,0x00000007dcb00000)
from space 26624K, 0% used [0x00000007dcb00000,0x00000007dcb00000,0x00000007de500000)
to space 33792K, 0% used [0x00000007de700000,0x00000007de700000,0x00000007e0800000)
ParOldGen total 2097152K, used 300700K [0x00000006e0800000, 0x0000000760800000, 0x0000000760800000)
object space 2097152K, 14% used [0x00000006e0800000,0x00000006f2da7140,0x0000000760800000)
Metaspace used 174750K, capacity 187618K, committed 191104K, reserved 1218560K
class space used 18827K, capacity 20997K, committed 21632K, reserved 1048576K
}
应用程序的暂停时间
在 GC 过程中,应用程序的所有线程都会被暂停,这称为 "Stop-The-World"(STW)事件。暂停时间直接影响应用的性能和响应速度。
日志示例:
2024-09-24T10:43:44.094+0800: 21.703: Total time for which application threads were stopped: 0.0015655 seconds, Stopping threads took: 0.0000978 seconds
Total time for which application threads were stopped:
- 应用程序线程被暂停的总时间,这里是 0.0015655 秒(约 1.57 毫秒)。
Stopping threads took:
- 暂停线程所花费的时间,这里是 0.0000978 秒(约 0.098 毫秒)。
GC(Minor GC)
日志示例
2024-09-24T10:43:44.149+0800: 21.759: [GC (Allocation Failure) [PSYoungGen: 1466389K->41915K(1492992K)] 1538798K->152295K(4114432K), 0.0591035 secs]
- GC 类型:Minor GC,因内存分配失败(Allocation Failure)触发。
- 年轻代变化:从 1466389K 降至 41915K,总容量 1492992K。
- 堆内存总变化:从 1538798K 降至 152295K,总容量 4114432K。
- 耗时:0.0591035 秒(约 59 毫秒)。
Full GC
日志示例:
2024-09-24T14:14:45.068+0800: 11571.665: [Full GC (Ergonomics) [PSYoungGen: 26414K->0K(2061312K)] [ParOldGen: 2082863K->300700K(2097152K)] 2109278K->300700K(4158464K), [Metaspace: 176015K->174750K(1218560K)], 0.6404574 secs]
- GC 类型:Full GC,触发原因是 JVM 自适应机制(Ergonomics)。
- 年轻代变化:从 26414K 降至 0K,表示年轻代已完全回收。
- 老年代变化:从 2082863K 降至 300700K,释放了大量内存。
- 堆内存总变化:从 2109278K 降至 300700K,总容量 4158464K。
- Metaspace 变化:从 176015K 降至 174750K。
- 耗时:0.6404574 秒(约 640 毫秒)。
堆内存的详细状态
由于使用了 -XX:+PrintHeapAtGC 参数,GC 日志中会在每次 GC 前后打印堆内存的详细状态,包括各内存区域的容量和使用情况。
日志示例:
Heap before GC invocations=11 (full 0):
PSYoungGen total 1494528K, used 1466389K [0x0000000790800000, 0x00000007f0800000, 0x00000007f0800000)
eden space 1414656K, 100% used [0x0000000790800000,0x00000007e6d80000,0x00000007e6d80000)
from space 79872K, 64% used [0x00000007eba00000,0x00000007eec85748,0x00000007f0800000)
to space 78336K, 0% used [0x00000007e6d80000,0x00000007e6d80000,0x00000007eba00000)
ParOldGen total 2621440K, used 72408K [0x00000006f0800000, 0x0000000790800000, 0x0000000790800000)
object space 2621440K, 2% used [0x00000006f0800000,0x00000006f4eb60e0,0x0000000790800000)
Metaspace used 114761K, capacity 120350K, committed 120576K, reserved 1155072K
class space used 13324K, capacity 14260K, committed 14336K, reserved 1048576K
-
PSYoungGen(年轻代):
- total(总容量):1494528K。
- used(已使用):1466389K。
- eden space(Eden 区):容量 1414656K,使用率 100%。
- from space(Survivor 区):容量 79872K,使用率 64%。
- to space(Survivor 区):容量 78336K,未使用。
-
ParOldGen(老年代):
- total(总容量):2621440K。
- used(已使用):72408K,使用率约 2%。
-
Metaspace(元空间):
- used(已使用):114761K。
- capacity(容量):120350K。
JVM 启动参数和 GC 日志的对应关系
由于手动设置了 JVM 启动参数,GC 日志中包含了更详细的信息,这些信息有助于深入分析:
-
内存分配和使用情况:
- 通过
-XX:+PrintHeapAtGC
,可以查看每次 GC 前后的堆内存状态,了解各区域的内存分配和使用率。
- 通过
-
时间戳信息:
-
-XX:+PrintGCDateStamps
和-XX:+PrintGCTimeStamps
提供了精确的时间信息,便于分析 GC 事件的时间点和间隔。
-
-
GC 事件的详细信息:
-
-XX:+PrintGCDetails
输出了 GC 事件的类型、触发原因、内存回收情况和耗时等详细信息。
-
Top comments (0)