Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 热点&x27;s扫掠GC停止运行,只留下标记扫掠GC_Java_Garbage Collection_Jvm Hotspot - Fatal编程技术网

Java 热点&x27;s扫掠GC停止运行,只留下标记扫掠GC

Java 热点&x27;s扫掠GC停止运行,只留下标记扫掠GC,java,garbage-collection,jvm-hotspot,Java,Garbage Collection,Jvm Hotspot,我在某个程序中体验到Hotspot的GC有点奇怪。有时,似乎扫掠GC刚刚死亡,每次伊甸园空间填满时,只留下mark sweep GC运行。不用说,这对性能来说是可怕的。我还没有弄清楚这个问题发生的条件 现在来看一个具有这种行为的JVM,旧的gen是170MB(已使用且最大),在一个集合上从不增长或收缩,Eden gen是85MB,幸存者空间从未被使用过(我猜这与未运行的清除GC一致),总分配的堆大小是256MB(显然,匹配old+Eden) 有什么线索可以说明是什么原因吗?我怀疑堆太满了。如果旧

我在某个程序中体验到Hotspot的GC有点奇怪。有时,似乎扫掠GC刚刚死亡,每次伊甸园空间填满时,只留下mark sweep GC运行。不用说,这对性能来说是可怕的。我还没有弄清楚这个问题发生的条件

现在来看一个具有这种行为的JVM,旧的gen是170MB(已使用且最大),在一个集合上从不增长或收缩,Eden gen是85MB,幸存者空间从未被使用过(我猜这与未运行的清除GC一致),总分配的堆大小是256MB(显然,匹配old+Eden)


有什么线索可以说明是什么原因吗?

我怀疑堆太满了。如果旧空间+伊甸园空间加起来等于最大堆空间,那么就没有空间容纳幸存者空间,无法运行分代收集器

尝试增加最大堆空间


关键是幸存者空间中必须有足够的自由空间来容纳在伊甸园空间集合中幸存下来的所有对象。如果可用空间不可用,那么复制收集器将无法工作,JVM必须返回到标记和扫描

这对于世代/复制收集器的工作方式至关重要


就像我说的,试着增加堆空间。

我怀疑堆太满了。如果旧空间+伊甸园空间加起来等于最大堆空间,那么就没有空间容纳幸存者空间,无法运行分代收集器

尝试增加最大堆空间


关键是幸存者空间中必须有足够的自由空间来容纳在伊甸园空间集合中幸存下来的所有对象。如果可用空间不可用,那么复制收集器将无法工作,JVM必须返回到标记和扫描

这对于世代/复制收集器的工作方式至关重要


就像我说的,试着增加堆空间。

我忘了提到它,但是虽然幸存者空间是空的,但它们的大小不是零。VisualGC说S0是576KB,S1是512kB,这比我通常在实时虚拟机中看到的要多(我现在看到的一个功能正常的虚拟机有448KB的幸存者空间)。考虑到这一点,这个解释还能成立吗?确实,Eden和Old Gen空间都与分配的空间一样大,但这是否应该阻止清除GC运行?同意。我从来没有考虑过GC在内存紧张的情况下会做什么,我一直认为GC之后伊甸园空间总是被完全丢弃,所以我无法理解到底发生了什么。我从未意识到自己的记忆力越来越差。谢谢你似乎确实是对的,但这确实让我想知道当时到底发生了什么。当伊甸园空间填满,而幸存者空间或旧世代空间都没有足够的空间时,伊甸园空间中仍然存在的物体会去哪里?显然,JVM不会抛出OutOfMemoryException或任何东西。伊甸园的空间被压缩了吗?“伊甸园的空间被压缩了吗?”-我想是的。还有什么其他选择?无论如何,最好的办法是首先避免陷入这种情况。我忘了提到它,但尽管幸存者空间是空的,但它们的大小不是零。VisualGC说S0是576KB,S1是512kB,这比我通常在实时虚拟机中看到的要多(我现在看到的一个功能正常的虚拟机有448KB的幸存者空间)。考虑到这一点,这个解释还能成立吗?确实,Eden和Old Gen空间都与分配的空间一样大,但这是否应该阻止清除GC运行?同意。我从来没有考虑过GC在内存紧张的情况下会做什么,我一直认为GC之后伊甸园空间总是被完全丢弃,所以我无法理解到底发生了什么。我从未意识到自己的记忆力越来越差。谢谢你似乎确实是对的,但这确实让我想知道当时到底发生了什么。当伊甸园空间填满,而幸存者空间或旧世代空间都没有足够的空间时,伊甸园空间中仍然存在的物体会去哪里?显然,JVM不会抛出OutOfMemoryException或任何东西。伊甸园的空间被压缩了吗?“伊甸园的空间被压缩了吗?”-我想是的。还有什么其他选择?不管怎样,最好的办法是首先避免陷入那种情况。