Linux使用运行Java GC的系统/内核CPU
索姆背景信息; 服务器; 新的SLES 12服务器,带有130 GB Ram,用于为大型数据库运行MySQL(150G数据). 服务器还将托管一些Java应用程序. Java版本(默认来自Oracle) – Java(TM)SE运行时环境(版本1.7.0-b147) – Java HotSpot(TM)64位服务器VM(版本21.0-b17,混合模式) 我们偶然发现了以下问题; 运行一些特定的Java应用程序会使kerne / system cpu峰值减慢/暂停应用程序一段时间.我通过制作一个Java应用程序来重现它,它只是随着时间的推移而占用内存并使用一些cpu. 调查显示在减速期间(10000-25000)有大量的中断. 每次放缓之后,Java都会获得更多内存.将Java设置为以固定内存开始似乎也可以减少问题(将-Xmx和-Xms设置为相同的值).详细垃圾收集也表明GC正在开始并可能成为触发器. 由于某种原因,GC和内存分配非常昂贵,我们不确定从这里查看.来自GC的详细信息:
在低端linux服务器上运行GC的同一程序(从SUN运行SLES,Java 1.6.0_11);
在减速期间TOP:
减速期间的vmstat(从3.行开始);
为什么GC在高端服务器上比在低端服务器上如此昂贵?有什么想法寻找线索? 更新 – 调用参数2012-11-26
给予
变成;
给予
变成;
给予
真正有趣的是,今天重新运行而不告诉使用哪种GC方法给出了这个;
给予
Java以某种方式改变了违约GC的策略…… 最佳答案
垃圾收集确实是一个棘手的话题.
要给出最佳答案,您应该发布用于调用java的完整命令行. 正如你所说,使用GC开关搁浅有帮助.原因在于,对于目前使用的许多应用程序来说,默认设置不是最佳选择.对于许多需要快速响应的应用程序,因为它们是交互式的,所以参数 -XX:UseConcMarkSweepGC 会有很大的不同. 值得注意的是,使用你提到的JVM,使用更大的堆(比如更大的10GB)总是需要一些调整.获取您拥有的GC日志,并观察使用GC选项时行为的变化.我建议尝试不同的收集器策略(如CMS或G1),并尝试使用Eden Space的配置(如Xmn). 最后,但并非最不重要的是,您可以使用分析器调查应用程序对内存的作用.也许代码可以改进,因此可以避免很多GC. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |