linux java gc_Linux使用运行Java GC的系统/内核CPU

在一台配置有130GB RAM的SLES 12服务器上,运行特定Java应用时,系统CPU被大量占用,导致应用程序暂停。问题与大量中断有关,且GC活动频繁。内存分配和GC似乎是触发问题的原因。在低端Linux服务器上,相同应用的GC行为更有效率。调整Java的-Xmx和-Xms参数或改变GC策略可以缓解问题。
摘要由CSDN通过智能技术生成

索姆背景信息;

服务器;

新的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 total,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 total,128576M used,457M free,1388M buffers

Swap: 32765M total,13M used,32752M free,113732M cached

减速期间的vmstat(从3.行开始);

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在高端服务器上比在低端服务器上如此昂贵?有什么想法寻找线索?

更新 – 调用参数2012-11-26

调用params;

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的策略……

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值