java - Java 垃圾收集器导致性能低下?需要建议

标签 java performance garbage-collection heap-memory

我将尝试简要解释这个问题。我在供应链领域工作,我们处理元素/产品和 SKU。

比如说,我的整个问题集是 100 万个 SKU,我正在运行一个算法。 现在,我的 JVM 堆大小为 4 GB。

我无法一次性处理所有 SKU,因为我需要更多内存。 因此,我将问题集分成更小的批处理。每个批处理都会有所有需要一起处理的相关SKU。

现在,我运行几次迭代来处理整个数据集。说,如果每批持有约。 5000 个 SKU,我将进行 200 次迭代/循环。在批处理完成之前,需要 5000 个 SKU 的所有数据。但是当下一个批处理开始时,不需要前一个批处理的数据,因此可以进行垃圾收集。

这是问题背景。现在,由于 GC 导致的特定性能问题 - 每批大约需要 2-3 秒才能完成。现在,在这段时间内,GC 无法释放任何对象,因为在处理特定批处理结束之前需要所有数据。因此,GC 正在将所有这些对象移动到旧的 Gen(如果我查看 yourkit 分析器,有新一代几乎没有任何东西)。所以,老一代增长得更快,需要完整的 GC,这让我的程序非常慢。在这种情况下有什么方法可以调整 GC,或者可以更改我的代码以不同的方式进行内存分配?

PS - 如果每批都非常小,我看不到这个问题。我相信这是因为 GC 能够在批处理完成得更快时足够快地释放对象,因此不需要移动旧代中的对象。

最佳答案

First Google hit表示您可以使用 -XX:NewRatio 设置相对于老年代更大的新生代大小。

关于java - Java 垃圾收集器导致性能低下?需要建议,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37316775/

相关文章:

java - 追踪 'GC overhead limit exceeded' 错误

经典 ASP 的 IIS6 中的 session 状态和垃圾收集

java - Android 删除操作栏标题保留工具栏菜单

Android:在 ImageView 中使用大图像时性能低下

python - 如何加速 numpy 数组掩码?

performance - 如何在不牺牲性能的情况下将函数作为参数传递给Julia中的其他函数?

c# - 是否有必要在 C# 中显式删除事件处理程序

java - 将 Android 应用程序连接到在线数据库时遇到一些问题

java - jni/java : thread safe publishing/sharing of effectively immutable native object

java - 无法连接到 Netbeans 中的 servlet 文件