大佬教程收集整理的这篇文章主要介绍了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的详细信息:
[GC^C 1024064K->259230K(3925376K),87,3591890 secs]
在低端linux服务器上运行GC的同一程序(从SUN运行SLES,Java 1.6.0_11);
[GC 1092288K->253266K(3959488K),3.0125460 secs]
在减速期间TOP:
top - 11:23:33 up 87 days,19:55,5 users,load average: 14.27,4.50,10.17 Tasks: 250 @R_447_10586@l,39 running,211 sleeping,0 stopped,0 zombie cpu(s): 0.0%us,71.8%sy,0.0%ni,28.2%id,0.0%wa,0.0%hi,0.0%si,0.0%st Mem: 129033M @R_447_10586@l,128576M used,457M free,1388M buffers Swap: 32765M @R_447_10586@l,13M used,32752M free,113732M cached
procs -----------memory---------- ---swap-- -----io---- -system-- -----cpu------ r b swpd free buff cache si so bi bo in cs us sy id wa st 0 0 13552 1714328 1422268 116462260 0 0 10 9 0 0 0 0 100 0 0 1 0 13552 1241780 1422268 116462292 0 0 0 0 240 353 1 0 99 0 0 1 0 13552 695616 1422268 116462292 0 0 0 17 419 431 3 0 97 0 0 55 0 13552 486384 1422268 116462292 0 0 0 2 20228 458 1 57 43 0 0 75 0 13552 476172 1422268 116462300 0 0 0 8 12782 684 0 70 30 0 0 65 0 13552 470304 1422268 116462304 0 0 0 0 13108 792 0 72 28 0 0
为什么GC在高端服务器上比在低端服务器上如此昂贵?有什么想法寻找线索?
java -Xmx4g -Xms4g -verbose:gc -server -cp "./dest/" UseMemorymain
给予
[GC^C 1024064K->259230K(3925376K),3591890 secs]
变成;
java -Xmx4g -Xms4g -XX:+UseParallelGC -verbose:gc -cp "./dest/" UseMemorymain
给予
[GC 1048640K->265430K(4019584K),0902660 secs]
变成;
java -Xmx4g -Xms4g -XX:+UseConcMarkSweepGC -verbose:gc -cp "./dest/" UseMemorymain
给予
[GC 1092288K->272230K(3959488K),1791320 secs]
真正有趣的是,今天重新运行而不告诉使用哪种GC方法给出了这个;
java -Xmx4g -Xms4g -verbose:gc -server -cp "./dest/" UseMemorymain
给予
[GC 1024064K->259238K(3925376K),0839190 secs]
Java以某种方式改变了违约GC的策略……
正如你所说,使用GC开关搁浅有帮助.原因在于,对于目前使用的许多应用程序来说,默认设置不是最佳选择.对于许多需要快速响应的应用程序,因为它们是交互式的,所以参数
-XX:UseConcMarkSweepGC
会有很大的不同.
值得注意的是,使用你提到的JVM,使用更大的堆(比如更大的10GB)总是需要一些调整.获取您拥有的GC日志,并观察使用GC选项时行为的变化.我建议尝试不同的收集器策略(如CMS或G1),并尝试使用Eden Space的配置(如Xmn).
最后,但并非最不重要的是,您可以使用分析器调查应用程序对内存的作用.也许代码可以改进,因此可以避免很多GC.
以上是大佬教程为你收集整理的Linux使用运行Java GC的系统/内核CPU全部内容,希望文章能够帮你解决Linux使用运行Java GC的系统/内核CPU所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。