2

在 Java 8 中,我在我的服务上运行 GC log,通过 GCeasy 我看到元空间分配了 1GB,而峰值在 40m 左右,那么为什么分配了 1GB?

我使用这些标志并添加了“-XX:MaxMetaspaceSize=10M”。

然后我得到了 java.lang.OutOfMemoryError: Metaspace,正如预期的那样,但仍然在 GC 日志上我看到分配了 1 GB。日志中有错误吗?或者我错过了一些东西。

我在 GC 日志文件上运行 grep Metaspace 并得到以下输出:

命令行标志:-XX:CompressedClassSpaceSize=2097152 -XX:+DisableExplicitGC -XX:GCLogFileSize=104857600 -XX:InitialHeapSize=536870912 -XX:MaxHeapGCSize=536870912 -XX:MaxMetaspaceSize=10485760 -XX:MetaspaceSize =10485760 -XX :NumbersOf=10485760 -XX:+PrintGC -XX:+PrintGCApplicationConcurrentTime -XX:+PrintGCApplicationStoppedTime -XX:+PrintGCDateStamps -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:ReservedCodeCacheSize=134217728 -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+ UseGCLogFileRotation -XX:+UseParallelGC

2020-05-19T16:38:18.359+0000:0.837:[完整 GC(元数据 GC 阈值)[PSYoungGen:7298K->0K(153088K)][ParOldGen:8K->6944K(349696K)]7306K->6944K(502784K) ), [元空间: 9975K->9975K(1058816K)], 0.0249384 secs] [Times: user=0.08 sys=0.01, real=0.02 secs]

2020-05-19T16:38:18.386+0000:0.864:[完整 GC(元数据 GC 阈值)[PSYoungGen:0K->0K(153088K)][ParOldGen:6944K->6944K(349696K)]6944K->6944K(502784K) ), [元空间: 9975K->9975K(1058816K)], 0.0129850 secs] [Times: user=0.04 sys=0.00, real=0.01 secs]

2020-05-19T16:38:18.400+0000: 0.879: [Full GC (Last ditch collection) [PSYoungGen: 0K->0K(153088K)] [ParOldGen: 6944K->6816K(349696K)] 6944K->6816K(502784K) ), [元空间: 9975K->9965K(1058816K)], 0.0252318 secs] [Times: user=0.07 sys=0.00, real=0.03 secs]

4

1 回答 1

1

答案基本上就在这里,尽管理解起来并不简单。

MaxMetaspaceSize限制了提交的内存,而您的 GC 日志实际上打印了保留的内存。所以保留:1058816K,提交:9975K,根据您的日志。保留内存根本不必由交换或实际 RAM 支持,因此通常它非常大。

这就是为什么您会在GC log.

于 2020-05-20T16:24:52.493 回答