gpt4 book ai didi

Java程序运行一段时间后变慢

转载 作者:IT王子 更新时间:2023-10-28 23:30:13 25 4
gpt4 key购买 nike

我有一个 java 程序,它是一个典型的机器学习算法,通过一些方程式更新一些参数的值:

for (int iter=0; iter<1000; iter++) {
// 1. Create many temporary variables and do some computations
// 2. Update the value for the parameters
}

更新参数的计算相当复杂,我必须创建许多临时对象,但它们没有被引用到循环之外。循环中的代码是 CPU 密集型的,并且不访问磁盘。该程序加载了一个相对较大的训练数据集,因此,我为 JVM 授予了 10G 内存 (-Xmx10G),这比它所需的要大得多(通过“top”命令或窗口的任务管理器达到约 6G 的峰值)。

我在几台安装了 SUN Hotspot JDK/JRE 1.8 的 linux 机器(centos 6, 24G 内存)和一台 windows 机器(win7, 12G)上对其进行了测试。我没有指定除-Xmx 之外的其他JVM 参数。两台机器都专用于我的程序。

在 Windows 上,我的程序运行良好:每次迭代使用非常相似的运行时间。但是,所有 centos 机器上的运行时间都很奇怪。它最初运行正常,但在第 7 次/第 8 次迭代时会显着减慢(慢约 10 倍),然后在以后的每次迭代中都会减慢约 10%。

我怀疑这可能是由 Java 的垃圾收集器引起的。因此,我使用 jconsole 来监控我的程序。 Minor GC 在两台机器上都非常频繁地发生,这是因为程序在循环中创建了许多临时变量。此外,我使用“jstat -gcutil $pid$ 1s”命令并捕获了统计信息:

Centos:https://www.dropbox.com/s/ioz7ai6i1h57eoo/jstat.png?dl=0

窗口:https://www.dropbox.com/s/3uxb7ltbx9kpm9l/jstat-winpng.png?dl=0

[已编辑] 但是,两种机器上的统计数据差异很大:

  1. windows 上的“S1”在 0 到 50 之间快速跳跃,而 centos 上保持在“0.00”。
  2. windows 上的“E”从 0 到 100 变化非常迅速。当我打印每秒的统计数据时,屏幕截图并没有显示它的增量为 100。然而,在 centos 上,“E”向 100 增长相当缓慢,并且然后减少到 0,然后再次增加。

我的程序的奇怪行为似乎是由于 Java GC 造成的? 我是 Java 性能监视器的新手,不知道如何优化 GC 参数设置。你有什么建议吗?非常感谢!

最佳答案

我很抱歉发布这个作为答案,但我没有足够的分数来发表评论。

如果您认为这是与 GC 相关的问题,我会为 Garbage 1 Collector –XX:+UseG1GC 更改它

我找到了这个简短的解释: http://blog.takipi.com/garbage-collectors-serial-vs-parallel-vs-cms-vs-the-g1-and-whats-new-in-java-8/

您可以在分析下运行您的软件吗?尝试使用 jprofiler、VisualVM 甚至 netbeans 分析器。可能对你有很大帮助。

我注意到您有自己的 vector 和矩阵封装。 也许您也为此花费了过多的内存。但我认为这不是问题。

再次抱歉没有作为评论贡献。 (这样会更合适)

关于Java程序运行一段时间后变慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29748429/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com