Java针对多线程环境的并行采集GC的优化程度如何?我编写了一些多线程的Jython代码,它大部分时间都在调用Java库。根据我运行程序的选项,库会调用大量的分配或几乎没有分配。当我使用需要大量堆分配的选项时,我无法让代码扩展到超过6个核心。当我使用不需要大量分配的选项时,它会扩展到至少20个。考虑到我使用的是Sun VM,并行GC和Jython,它与GC瓶颈相关的可能性有多大?作为我的胶水语言?
编辑:为了澄清,我不一定会想到那些对Java老手来说很明显的东西,因为我几乎从不使用Java / JVM语言。我在D中编写了大部分编程,并使用Python的旗舰CPython实现。我正在使用JVM和Jython进行小型一次性项目b / c我需要访问Java库。
答案 0 :(得分:3)
由于您的问题与GC瓶颈有关:您可以通过打开GC日志记录并检查日志来消除这种可能性 - 如果有大量的GC事件有大的暂停,您可以确认/折扣此理论。 (但是,在您描述的场景中,我猜它不是GC问题。)
答案 1 :(得分:2)
对我而言,GC和多线程的问题非常真实。我不是说JVM很糟糕,只是问题本身很难处理。
在我们的一个项目中,我们在一个JVM(app。服务器)中运行了两个应用程序。当单独强调它们时很好,但是当两者都是压力时,性能会以奇怪的方式降低。我们最终拆分了应用程序。在两个JVM中,性能恢复正常(当然比使用一个应用程序时要慢,但合理)。
调整GC非常困难。事情可以改善5分钟,然后主要集合将阻止等。您可能决定是否要在操作中获得高吞吐量或低延迟。高吞吐量适用于批处理,低延迟是交互式应用程序所必需的。最终,JVM的默认参数对我们来说是最好的结果!
这不是一个真正的答案,而是经验的回报,但是,对我来说,GC和多线程可能是一个问题。
答案 2 :(得分:1)
Java GC是世代相传的。第一代的集合旨在处理短期对象,并且预计会频繁运行。如果有许多短期分配,则每秒运行几次短暂的间隔是预期的行为。 (这应该是评论而不是答案 - 我没有代表,对不起)。
此外,根据您使用的VM,您可以选择GC算法。选项将根据您使用的VM的版本和供应商而有所不同。
有些(旧)信息在这里:http://java.sun.com/developer/technicalArticles/Programming/turbo/#The_new_GC
答案 3 :(得分:0)
线程性能可能因jdk版本而异。根据我的经验,在jdk6u18上,使用-XX:+ UseParallelGC(不并发标记扫描gc)启用的并行gc在具有数百个非常活跃的线程的四核上表现非常好。我认为它不可能超过6个核心。
Sun的硬件基于具有大量内核的处理器这一事实解释了为什么他们近年来在新的垃圾收集器上投入了大量精力。
默认情况下未启用并行gc,因为其单线程性能不如默认gc。