为什么在年轻一代GC期间老一代似乎被清除

时间:2017-01-23 17:01:37

标签: java garbage-collection

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

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 个答案:

答案 0 :(得分:1)

1)对于这个问题:

  

所以,我的问题是,为什么老一代减少使用量呢?   是年轻一代的收藏品?

值379103K-> 208719K(521216K)定义GC之前的大小 - >在整个堆的GC(总数)之后,而不是旧一代。

2)为了解释年轻一代的使用/总大小之间的差异,让我们看一下每个部分的定义(粗体表示我认为有所不同的部分):

  

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

     

括号中的下一个数字(171520K)是承诺的大小   heap:没有请求的java对象可用的空间量   来自操作系统的更多内存。 请注意,这个数字确实如此   不包括幸存者空间之一,因为只有一个可以使用   任何给定的时间,也不包括永久世代,   它包含虚拟机使用的元数据。

有更多信息here