Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/336.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 使用并发标记扫描GC收集器?_Java_Garbage Collection - Fatal编程技术网

Java 使用并发标记扫描GC收集器?

Java 使用并发标记扫描GC收集器?,java,garbage-collection,Java,Garbage Collection,这个问题是基于我对《Java垃圾收集器》一节的理解 看起来jvm默认在Windows7上使用“并行GC”,正如我确认的那样-XX:+PrintCommandLineFlags-version。这篇文章还说 并行垃圾收集器使用多个线程来执行 年轻一代垃圾收集。当有大量数据时,应使用此收集器 工作需要完成,长时间的停顿是可以接受的 我不确定哪个收集器用于并行GC的终身空间收集 此外,我想不出可以接受长时间暂停的应用程序(会导致响应速度降低)。任何人都想减少GC的暂停次数,让应用程序尽可能响应 然后,

这个问题是基于我对《Java垃圾收集器》一节的理解 看起来jvm默认在Windows7上使用“并行GC”,正如我确认的那样-XX:+PrintCommandLineFlags-version。这篇文章还说

并行垃圾收集器使用多个线程来执行 年轻一代垃圾收集。当有大量数据时,应使用此收集器 工作需要完成,长时间的停顿是可以接受的

我不确定哪个收集器用于并行GC的终身空间收集

此外,我想不出可以接受长时间暂停的应用程序(会导致响应速度降低)。任何人都想减少GC的暂停次数,让应用程序尽可能响应

然后,我阅读了收集终身生成的
并发标记扫描(CMS)收集器

CMS表示,
它需要较低的暂停时间,并且可以与垃圾收集共享资源

我的问题是不应该是最 大多数web应用程序使用并发标记扫描(CMS)收集器,因为它具有响应能力。?我相信,一定还有其他一些因素使这一结果得以实现 但在浏览了这个链接之后,我觉得应该将默认的GC类型更改为并发标记扫描(CMS)收集器。有什么想法/见解吗

此外,我认为应用程序可以是最好的,如果我们使用CMS收集器和并行收集器在一起,CMS用于旧一代和并行fpr 年轻一代

我不确定哪个收集器用于并行GC的终身空间收集

下一页,如果使用并行GC,则并行清除收集器用于年轻一代,并行标记/扫描收集器用于老一代(也称为终身一代)。所以我猜答案是“并行GC用于并行GC的终身空间收集”。这是一个循环的说法,但我想这是有道理的

此外,我想不出可以接受长时间暂停的应用程序(会导致响应速度降低)。任何人都想减少GC的暂停次数,让应用程序尽可能响应

“长暂停”是相对的,是否可以接受取决于应用程序的类型及其使用。需要快速用户交互的应用程序(如游戏)可能需要较低的暂停时间,而长期运行的应用程序几乎没有用户交互(夜间批处理作业、可运行数天的处理作业、可能运行较长时间的服务器等),或者不需要快速用户交互(文字处理器?但是谁用java编写文字处理器?)不会有严格的暂停要求,所以暂停是可以的。此外,暂停不是唯一考虑的GC因素,所以即使停顿是好的,也会有其他原因来选择具有较长停顿的GC。我将进一步解释。

我的问题是,大多数web应用程序不应该因为其响应性而使用并发标记扫描(CMS)收集器吗

CMS收集器有缺点。在您提到的文章中,有这样一行:

通常,并发低暂停收集器不会复制或压缩活动对象。垃圾收集是在不移动活动对象的情况下完成的

因此,没有堆压缩会导致堆碎片,这可能对性能有害。post指出了另一个缺点(我不确定这篇文章到底有多可靠,但乍一看似乎相当不错):

CMS收集器的一个更重要的缺点是,当旧一代堆满时,它无法启动。一旦旧一代堆满,CMS就太迟了,它必须回到通常的停止世界策略(通过GC日志中的“并发模式故障”宣布)

然而,CMS最大的缺点是它不能压缩旧一代堆,因此它会带来堆碎片化的风险,并且随着时间的推移会导致严重的操作降级

很明显,通过这些设置,JVM在负载测试条件下工作了近14个小时(在生产环境中,在较低的负载下,这种危险的良性周期可能会持续更长时间)。然后突然出现了很长的GC暂停,这实际上使JVM停止了大约一半的剩余时间。不仅有人试图清理旧一代中持续超过10秒的混乱,甚至新一代的GC暂停也在秒范围内,因为收集器花费了大量时间搜索JVM中的空间当它试图将对象从新的一代提升到老的一代时

这篇博文中有更多的细节,你可能应该读一下,因为这里的引文之外有很多内容,还有一些精彩的演示。但需要说明的是,CMS收集器不是一个适合所有人的收集器。它也有它的缺点,这可能会导致程序员选择不同的收集器对于短时间运行的应用程序,使用它作为默认值是可以的,但是对于长时间运行的应用程序,这种行为将非常糟糕

此外,我认为应用程序可以是最好的,如果我们使用CMS收集器和并行收集器在一起,CMS用于老一代和并行fpr年轻一代

当您将
-XX:+UseConMarkSweepGC
参数传递给VM时,这实际上是默认模式。但是如上所述,您可能需要花一些时间考虑您想要使用的收集器。在不考虑您的用例的情况下选择收集器可能不是一个好主意。(旁注:我想我看到了一些Oracle关于如何决定使用什么GC的文档,但我再也找不到了…)

此外,如果您有java 7U4或更高版本,您可能需要考虑闪亮的G1收集器。