尽管-Xmx10G,Java GC仍然大约2.5GB

时间:2016-02-17 07:49:14

标签: java garbage-collection jvm

我对大堆大小的Java垃圾收集有疑问。

当我使用64位JDK(java8u72)在64位窗口上执行我的Java程序时:

java -Xmx10G -Xms6G -verbose:gc <Class>

然后:

  • java.exe内存利用率保持在2.5 GB左右(Windows任务管理器)。
  • 我每10-30秒获得一次GC,大约有相同的值:[GC (Allocation Failure) 2766094K->239630K(6647808K), 0.0270937 secs]

首先,这是什么意思?这2766094K在堆利用率(2.7G)之前,然后239630(2.3G)之后,然后6647808K(6G)是堆大小,对吧?

为什么当我要求最大堆10 GB时,GC会在2.5G左右开始?如何解决这个问题?

我的笔记本电脑有8 GB的物理内存,但我认为虚拟内存可以处理更大的堆大小并为虚拟机提供透明服务!

的Tx

2 个答案:

答案 0 :(得分:2)

  1. 6647808K(6G)是年轻一代的堆大小。它不是实际的堆大小。
  2. 由于堆积大小分为年轻一代和老一代,因此年轻一代和老一代之间的比例通常为1:8。因此,休息4 GB分配给Old gen。 JVM未能在年轻时分配内存,因此它启动了小型GC,因此年轻代的对象大小为2766094K,并且在较小的GC内存大小变为239630K之后。
  3. 检查完整GC的执行时间。它就像下面 -

    <完全GC(元数据GC阈值)[PSYoungGen:11605K-> 0K(150016K)] [ParOldGen:27075K-> 32787K(87040K)] 38681K-> 32787K(237056K),[Metaspace:19481K-> ; 19481K(1067008K)],0.0989447 secs] [次:用户= 0.33 sys = 0.00,实际= 0.10秒]

答案 1 :(得分:0)

一个可能的原因可能是您正在尝试分配大块内存(例如,大型数组,可能通过ArrayList)。有足够的可用空间总计不足以为大型阵列分配内存,可用空间也需要不间断(你需要一块内存块,它们都是免费的,至少和你的阵列一样大)。

例如,如果你尝试创建一个大小为5的数组,并且你有3个,3个和2个块的可用内存,那么即使你总共有8个可用内存单元,Java仍然需要做GC。