我对大堆大小的Java垃圾收集有疑问。
当我使用64位JDK(java8u72
)在64位窗口上执行我的Java程序时:
java -Xmx10G -Xms6G -verbose:gc <Class>
然后:
java.exe
内存利用率保持在2.5 GB左右(Windows任务管理器)。[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
答案 0 :(得分:2)
检查完整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。