java运行慢_Java程序运行一段时间后越来越慢

博主在文中描述了一个遇到的Java程序性能问题,该程序在进行机器学习算法迭代时,在CentOS机器上出现运行速度显著下降,尤其是在第七或第八次迭代时。Windows系统上则运行正常。通过jconsole监控,发现CentOS上的次要GC频繁且行为异常。博主怀疑问题可能与Java的垃圾收集器有关。虽然Windows上的“S1”和“E”区域GC行为正常,但CentOS上的“E”区域GC表现缓慢。博主寻求关于优化GC参数的建议。

我有一个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),这远远大于它所需的(“6”由“顶”命令或窗口的任务管理器的峰值)。

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

在Windows上,我的程序运行良好:每次迭代使用非常相似的运行时间。然而,所有centos机器上的运行时间是奇怪的。

它最初运行正常,但在第七次/第八次迭代时显着减慢(〜10倍),然后在每次迭代中保持减速〜10%。

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

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

> Windows上的“S1”在0到50之间快速跳转,而在centos上保持“0.00”。

窗口上的“E”会从0到100迅速变化。当我打印每秒的统计数据时,屏幕截图不会显示其增量为100.然而,在“centos”中,“E”相对缓慢地向100增加,然后减小到0,并再次增加。

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

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值