我有一个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时达到峰值)。
我在几台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上的
我的程序的奇怪行为似乎是由于Java?我是一个新的Java性能监视器,没有一个优化GC参数设置的好主意。你有什么意见建议?非常感谢!
https://stackoverflow.com/questions/29748429
复制相似问题