我正在尝试了解此日志记录:
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 ???
所以,我的问题是,如果这是年轻一代的收藏品,为什么老一代会减少使用量呢?老一代不应该保持不变,或者增加(如果某些事情得到提升)?我在这里缺少什么?
那么年轻一代的使用/总体规模如何?它可以使用的东西比现有的更多?
答案 0 :(得分:1)
1)对于这个问题:
所以,我的问题是,为什么老一代减少使用量呢? 是年轻一代的收藏品?
值379103K-> 208719K(521216K)定义GC之前的大小 - >在整个堆的GC(总数)之后,而不是旧一代。
2)为了解释年轻一代的使用/总大小之间的差异,让我们看一下每个部分的定义(粗体表示我认为有所不同的部分):
箭头前后的数字(172192K-> 1760K)表示 垃圾收集前后活动对象的总大小, 分别。在次要集合之后,大小包括一些对象 这是垃圾(不再活着),但无法回收。 这些对象包含在终身代中,或者从终身代或永久代引用。
括号中的下一个数字(171520K)是承诺的大小 heap:没有请求的java对象可用的空间量 来自操作系统的更多内存。 请注意,这个数字确实如此 不包括幸存者空间之一,因为只有一个可以使用 任何给定的时间,也不包括永久世代, 它包含虚拟机使用的元数据。
有更多信息here