我正在尝试了解此日志记录:

2017-01-19T12:01:11.058+0000: [GC (Allocation Failure) [PSYoungGen: 172192K->1760K(171520K)] 379103K->208719K(521216K), 0.2104413 secs] [Times: user=0.02 sys=0.00, real=0.21 secs]
         vmop                    [threads: total initially_running wait_to_block]    [time: spin block sync cleanup vmop] page_trap_count
50409.055: ParallelGCFailedAllocation       [     392          3              4    ]      [     0     0     0     0   210    ]  0
2017-01-19T12:01:11.268+0000: Total time for which application threads were stopped: 0.2115093 seconds, Stopping threads took: 0.0001451 seconds


让我介绍一下我认为我知道的信息,如果我写错了,请纠正我:

首先是年轻部分:PSYoungGen: 172192K->1760K(171520K)

这意味着年轻一代的容量为171520K,其中已使用172192K。结果,VM在尝试分配内存时触发了GC,此后,年轻一代被缩减为使用的1760K。

这里让我困扰的是总共使用了172192K> 171520K。

现在,转到另一部分:379103K->208719K(521216K)

这意味着老一代的容量为521216K,仅使用了379103K。不知何故它下降到208719K ???

因此,我的问题是,如果这是年轻一代的收藏,为什么老一代会减少使用量?老一辈不应该保持不变或增加(如果有人提倡)吗?我在这里想念什么?

那么,要设法使用的年轻人一代/已使用的总大小又比可用的更多?

最佳答案

1)问题:


所以,我的问题是,如果这
是年轻一代的收藏吗?


值379103K-> 208719K(521216K)定义了整个堆而不是旧堆的GC之前的大小-> GC之后的总大小(总计)。

2)为了解释年轻一代的已用/总大小之间的差异,让我们看一下每个部分的定义(以粗体显示我认为有区别的部分):


箭头前后的数字(172192K-> 1760K)表示
垃圾回收之前和之后的活动对象的总大小,
分别。进行次要收集后,大小包括一些对象
是垃圾(不再存在),但是无法回收。
这些对象包含在使用权的世代中,或从使用权的世代或永久代中引用。

括号中的下一个数字(171520K)是
堆:无需请求即可用于Java对象的空间量
来自操作系统的更多内存。请注意,这个数字确实
不包括幸存者空间之一,因为在
在任何给定时间,并且也不包括永久代,
包含虚拟机使用的元数据。


提供更多信息here

10-07 13:23