Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/348.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新一代的集合会降级为使用CMS的单CPU?_Java_Garbage Collection - Fatal编程技术网

为什么java新一代的集合会降级为使用CMS的单CPU?

为什么java新一代的集合会降级为使用CMS的单CPU?,java,garbage-collection,Java,Garbage Collection,我一直无法找到一个解释,说明young集合的哪个阶段实际上是序列化到单个CPU的。我的猜测是,这是在老一代中进行第一次适合(最佳适合?)搜索时 从我所收集到的资料来看,我们看到的可怕的性能与伊甸园的规模太小有关,我们最终不必要地将大量数据复制到老一代中 在年轻的GC中,进程基本停止,CPU利用率下降到1 CPU左右,有时持续一分钟或更长时间。我们没有看到证据表明,由于碎片化,我们实际上无法在老一代中进行分配 我们在32台CPU机器上使用-XX:+useConMarkSweepGC-XX:+Use

我一直无法找到一个解释,说明young集合的哪个阶段实际上是序列化到单个CPU的。我的猜测是,这是在老一代中进行第一次适合(最佳适合?)搜索时

从我所收集到的资料来看,我们看到的可怕的性能与伊甸园的规模太小有关,我们最终不必要地将大量数据复制到老一代中

在年轻的GC中,进程基本停止,CPU利用率下降到1 CPU左右,有时持续一分钟或更长时间。我们没有看到证据表明,由于碎片化,我们实际上无法在老一代中进行分配


我们在32台CPU机器上使用-XX:+useConMarkSweepGC-XX:+UseParNewGC和16GB或31GB堆。在Java7和Java8(u66)上。升级会有帮助吗?

我已经找到了解决GC问题的方法,并且了解了发生了什么,但并不确切地知道ParNew young GC的哪个部分实际上被序列化到了一个CPU

事实证明,如果您使用的是CMS,那么即使在新的Java8上,也不会使用记录在案的默认值NewRatio 2。只需在命令行中指定-XX:NewRatio=2,我们就完全摆脱了31GB堆ElasticSearch实例的GC地狱。“这不是一个bug,它是一个特性”的解释如下:

我们得到的年轻尺寸是1.4GB,而不是我们从默认的NewRatio中预期的~10GB。因此,在线程数较高的情况下,年轻的数据被视为终身数据,即使我们有足够的内存


与此相关,我们注意到了线程池的一种现象,例如ElasticSearch。eden的大小对于通常运行的8-12个线程来说足够大,但是如果负载增加,我们就会陷入GC地狱。因此,如果您有一个带有线程池的服务器,那么eden的大小需要基于所有线程都在使用的情况。

我已经找到了解决GC问题的方法,并且了解了发生了什么,但并不确切地知道ParNew young GC的哪个部分实际上被序列化到了单个CPU

事实证明,如果您使用的是CMS,那么即使在新的Java8上,也不会使用记录在案的默认值NewRatio 2。只需在命令行中指定-XX:NewRatio=2,我们就完全摆脱了31GB堆ElasticSearch实例的GC地狱。“这不是一个bug,它是一个特性”的解释如下:

我们得到的年轻尺寸是1.4GB,而不是我们从默认的NewRatio中预期的~10GB。因此,在线程数较高的情况下,年轻的数据被视为终身数据,即使我们有足够的内存


与此相关,我们注意到了线程池的一种现象,例如ElasticSearch。eden的大小对于通常运行的8-12个线程来说足够大,但是如果负载增加,我们就会陷入GC地狱。因此,如果您有一个带有线程池的服务器,那么eden大小需要基于所有线程都在使用的情况。

是在用户空间还是内核空间中花费的CPU时间?您应该提供一些GC日志。如果Java8日志不够详细,您可以尝试java9预发布,并使用
-Xlog:gc*=trace、tlab*=off:file=gc.log
记录几乎所有与gc相关的内容。就日志而言,ParNew似乎没有像G1.for java 8日志那样的不同阶段,带有
-XX:+PrintGCDetails-XX:+printferencegc
。有关备忘表,请参阅。我将查看PrintReferenceGC是否提供更多信息。ElasticSearch中的标准GC日志记录不包括这一点。日志显示许多年轻的集合>1,以及一些并发模式故障。没什么有趣的。我真的在寻找GC阶段的详细描述。到目前为止,我发现的所有文档都是相当高的级别。我不记得任何young gen GCs在日志中将young集合分解为多个阶段。除了G1。ParNew、DefNew和PScavange在概念上做的事情基本相同。CPU时间是花费在用户空间还是内核空间?您应该提供一些GC日志。如果Java8日志不够详细,您可以尝试java9预发布,并使用
-Xlog:gc*=trace、tlab*=off:file=gc.log
记录几乎所有与gc相关的内容。就日志而言,ParNew似乎没有像G1.for java 8日志那样的不同阶段,带有
-XX:+PrintGCDetails-XX:+printferencegc
。有关备忘表,请参阅。我将查看PrintReferenceGC是否提供更多信息。ElasticSearch中的标准GC日志记录不包括这一点。日志显示许多年轻的集合>1,以及一些并发模式故障。没什么有趣的。我真的在寻找GC阶段的详细描述。到目前为止,我发现的所有文档都是相当高的级别。我不记得任何young gen GCs在日志中将young集合分解为多个阶段。除了G1。ParNew、DefNew和PScavange在概念上做的事情基本相同。