论坛首页 Java企业应用论坛

JVM的GC-生命不能承受之重

浏览 56179 次
精华帖 (17) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (9)
作者 正文
   发表时间:2008-11-18  
jvm 的运行机制是一个?
0 请登录后投票
   发表时间:2008-11-18   最后修改:2008-11-18
建议还是查查代码吧。用JProfiler看看method的calltree。我现在在做一个系统的调优,刚开始也是怀疑服务器硬件啊,jdk版本或者heap堆内存不是最优,最后发现还是代码中的问题。有时候看来很简单的,到了系统中就是瓶颈了。举例来说吧,一个对象是使用new还是clone来创建?如果只有一个实例这个问题就不是问题,但是如果你一次运算需要2000或者20000个对象呢?在代码自身问题查明前,不要用什么cache、集群,这些方法会掩盖你系统中问题的实质。另外,数据缓存要慎重,我不敢说绝对,但是尽量不要往jvm里面放。
0 请登录后投票
   发表时间:2008-11-18  
S0     S1     E      O      P     YGC     YGCT    FGC    FGCT     GCT  
23.39   0.00  69.88  65.27  77.91    684  200.083    16  113.838  313.921
0 请登录后投票
   发表时间:2008-11-18  
helloboy9527 写道
我们有一个要求非常高性能的应用,其实也是部署在一台普通的PE2850上面。4CPU,内存8G,JVM的heap开了5G,其中新生代为1.5G。在高峰期每秒超过5000次调用,约3秒就需要minor GC一次,每次停顿约0.3秒。隔十分钟左右就要Full GC一次,需要停顿约10秒。有点受不了。这样相当于每隔3秒应用就要停顿0.3秒,每隔10分钟就要停顿10秒。也改成CMS试过,Full GC的停顿会减少,但minor GC照样。这样的效果,对于一些高性能的应用来算,GC可能真是无法承受之重,而如果用C++来开发,这个停顿的问题将会消除,不过当然开发成本会大很多。有个疑问,不知道GC算法何时可以做到完全不停顿,其实已经有4个CPU了,能否用一个CPU不断地在GC,另外三个CPU不断地在服务,一刻也不停顿。否则这样下去,这种高性能的应用可能只能转用C++来开发了。


如果3s就要发生一次0.3s的minor GC,是否可以调小新生代的大小为1G以内,使得1.0到1.5s时执行一次minor GC,如果这个minor GC所花时间在30ms以内就值得了(同样3s时间内,这样改了后只中断了0.09S),这样还加大了年老代大小,减少了Full GC.
0 请登录后投票
   发表时间:2008-11-18  
都是高手啊,学习中!不知道上面一直说的老生代,新生代什么意思,也希望大侠给指导下。
看了以上那么多的方案,感觉IBM的jvm可以处理并行gc问题,不知道说的对不对。
0 请登录后投票
   发表时间:2008-11-18  
程序里面是否自己添加上了System.gc()这个语句?不要显式调用这个。
0 请登录后投票
   发表时间:2008-11-19  
sun得jdk实现不是那种停止-复制,还有个标记-清扫
这个过程要停止程序
如果你得代码占用很大  那么这个停止过程可能会很长

1.试试别的jdk
2.修改代码
0 请登录后投票
   发表时间:2008-11-19  
要不开个线程  隔一段system.gc一次?
0 请登录后投票
   发表时间:2008-11-19  
检查代码质量是正解.
0 请登录后投票
   发表时间:2008-11-19  
System.gc();不要随意调用,我还是坚持我的观点,先检查代码,用一些工具,诸如JProfiler,很多时候想当然都是错误的。
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics