首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Java程序在运行了一段时间后变慢了

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

Stack Overflow用户
提问于 2015-04-20 20:52:43
回答 7查看 4.7K关注 0票数 19

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

代码语言:javascript
复制
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时达到峰值)。

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

在windows上,我的程序运行得很好:每次迭代使用非常相似的运行时间。然而,所有centos机器的运行时间都很奇怪。它最初运行正常,但在第7/8次迭代时显著减速(~10倍),然后在此后的每次迭代中保持减速~10%。

我怀疑这可能是由Java的垃圾收集器引起的。因此,我使用jconsole来监视我的程序。此外,我使用了"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

然而,编辑后,两种机器的统计数据有很大不同:

windows上的

  1. “S1”在0到50之间快速跳跃,而centos上的
  2. "E“保持在"0.00”。windows上的
  3. "E“在0到100之间变化非常快。当我每秒打印统计数据时,屏幕截图没有显示其增量到100。但是,在centos上,”E“增长得相当慢,接近100,然后减少到0,然后再次增加。

我的程序的奇怪行为似乎是由于Java?我是一个新的Java性能监视器,没有一个优化GC参数设置的好主意。你有什么意见建议?非常感谢!

EN

回答 7

Stack Overflow用户

发布于 2015-04-21 04:26:43

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

如果您认为这是一个与GC相关的问题,我会将其更改为垃圾1收集器-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 profiler。这可能会对你有很大帮助。

我注意到你有自己的向量和矩阵的封装。也许你在这方面也花费了很多不必要的内存。但我不认为这是问题所在。

再次抱歉,我没有发表评论。(这会更合适)

票数 1
EN

Stack Overflow用户

发布于 2015-04-22 06:35:28

我会考虑在循环外声明var,这样只需分配一次内存,就可以完全消除GC。

票数 1
EN

Stack Overflow用户

发布于 2015-04-23 06:26:42

给Java (或任何垃圾收集语言)太多的内存会对性能产生不利影响。活动的(引用的)对象在内存中变得越来越稀疏,从而导致更频繁地从主存获取数据。请注意,在你向我们展示的例子中,更快的windows比Linux做了更快更全面的GC -但是GC周期(特别是完整的GC)通常对性能不利。

如果运行训练集不会花费特别长的时间,那么请尝试以不同的内存分配进行基准测试。

一种更激进的解决方案,但应该有很大影响的解决方案是通过回收池中的对象来消除(或尽可能减少)循环中的对象创建。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29748429

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档