我有一个只限于一个CPU的容器,这是java 11+的默认情况(可能也更旧)--在这种情况下,它是用户SerialGC的。我是应该强制使用线程GC (如G1GC),还是将其留在SerialGC上?
哪个CPU在单个CPU上表现得更好?在这种情况下,我总是认为SerialGC更好,但在某些情况下,我经常看到G1GC被强制使用。
编辑:我要求一般情况,因为我们有许多不同的应用程序运行使用相同的配置,很难测试每一种情况。
发布于 2019-09-13 11:07:13
根据文献资料的说法。
串行收集器使用单个线程执行所有垃圾收集工作,这使得它相对高效,因为线程之间没有通信开销。 它最适合于单处理器机器,因为它不能利用多处理器硬件,尽管它对于具有小数据集(高达100 MB)的应用程序非常有用。
我假设处理器=核心文档(以及您的问题)。虽然文档中说串行收集器对于多核机器来说不是一个好的选择,但它并没有说其他收集器对于一台单核机器是不好的。
不过,其他收集器确实倾向于使用多线程,而且您将无法从单核环境中获得这些线程的全部好处。
那么,你为什么看到G1GC使用?也许除了最新的原因之外没有别的理由。但是,如果有原因,则很可能是G1提供的GC暂停时间更短:
如果响应时间比总体吞吐量更重要,垃圾收集暂停必须保持在大约1秒以内,那么使用-XX:+UseG1GC或-XX:+UseConcMarkSweepGC选择一个主要并发的收集器。
最好的案例场景是,在这些情况下,他们用不同的收集器度量性能,并选择提供最佳结果的性能。
还可以考虑注释中提到的字符串去重复Holger。这是一个特定的内存优化,这可能是使用G1GC的原因。毕竟,如果您只有一个内核,那么您可能也没有太多的内存可供使用。
发布于 2019-09-13 13:16:57
发布于 2019-09-15 16:06:52
作为一个更一般的评论,不要假设因为您只有一个核心/CPU,使一个任务多线程将没有任何好处。根据所涉及的任务(在本例中是GC),很可能会出现一个线程被阻塞(例如等待IO完成)的情况,这允许执行任务另一部分的其他线程使用处理器并完成有用的工作。总体性能提高了,尽管一次只能运行一个线程。
https://stackoverflow.com/questions/57921891
复制相似问题