帮忙分析个gc日志,该如何解决

帮忙分析个gc日志
本帖最后由 easyreal 于 2014-08-20 10:43:45 编辑
full gc触发的条件:
1)年老代(Tenured)被写满
2)持久代(Perm)被写满
3)System.gc()被显示调用
4)上一次GC之后堆的各域分配策略动态变化
请高手帮忙分析下是什么导致了每次普通gc后紧跟着一个full gc,尽量详细点,谢谢

8639.992: [GC [PSYoungGen: 471864K->52395K(471872K)] 837089K->628751K(1520448K), 0.1120670 secs] [Times: user=1.73 sys=2.66, real=0.12 secs] 
12453.326: [GC [PSYoungGen: 471851K->50412K(471872K)] 1048207K->839545K(1520448K), 0.1384360 secs] [Times: user=1.93 sys=3.44, real=0.14 secs] 
12453.465: [Full GC [PSYoungGen: 50412K->0K(471872K)] [PSOldGen: 789133K->246290K(1048576K)] 839545K->246290K(1520448K) [PSPermGen: 142463K->142463K(142592K)], 0.9010210 secs] [Times: user=0.90 sys=0.00, real=0.90 secs] 
16236.909: [GC [PSYoungGen: 419456K->52400K(471872K)] 665746K->525456K(1520448K), 0.0332800 secs] [Times: user=1.15 sys=0.01, real=0.03 secs] 
19080.239: [GC [PSYoungGen: 471856K->52400K(471872K)] 944912K->1048810K(1520448K), 0.1112960 secs] [Times: user=2.59 sys=1.76, real=0.12 secs] 
19080.350: [Full GC [PSYoungGen: 52400K->0K(471872K)] [PSOldGen: 996410K->351624K(1222784K)] 1048810K->351624K(1694656K) [PSPermGen: 142998K->142998K(196608K)], 0.9334410 secs] [Times: user=0.93 sys=0.00, real=0.93 secs] 
21632.003: [GC [PSYoungGen: 419115K->52400K(471872K)] 770739K->855466K(1694656K), 0.0555060 secs] [Times: user=2.16 sys=0.00, real=0.06 secs] 
21632.058: [Full GC [PSYoungGen: 52400K->0K(471872K)] [PSOldGen: 803066K->420085K(1355712K)] 855466K->420085K(1827584K) [PSPermGen: 143491K->143491K(196608K)], 0.8611330 secs] [Times: user=0.86 sys=0.00, real=0.86 secs] 
23624.824: [GC [PSYoungGen: 418642K->52400K(471872K)] 838727K->855477K(1827584K), 0.0489030 secs] [Times: user=2.01 sys=0.01, real=0.05 secs] 
23624.873: [Full GC [PSYoungGen: 52400K->0K(471872K)] [PSOldGen: 803077K->465047K(1425088K)] 855477K->465047K(1896960K) [PSPermGen: 143974K->140271K(196608K)], 1.2262000 secs] [Times: user=1.23 sys=0.00, real=1.22 secs] 
25541.341: [GC [PSYoungGen: 419456K->52384K(471872K)] 884503K->1009416K(1896960K), 0.0544770 secs] [Times: user=2.18 sys=0.01, real=0.06 secs] 
25541.395: [Full GC [PSYoungGen: 52384K->0K(471872K)] [PSOldGen: 957032K->583854K(1572864K)] 1009416K->583854K(2044736K) [PSPermGen: 140744K->140744K(196608K)], 0.8544400 secs] [Times: user=0.86 sys=0.00, real=0.85 secs] 

------解决方案--------------------
楼主,你能不能jstat来看看相应的输出啊?

你的业务是不是每一次请求都是需要大块的内存啊?
------解决方案--------------------
这样应该看不出什么问题吧。
------解决方案--------------------
你先说说你这个程序在干嘛啊,哪些地方申请了大量内存等等,不然就一个GC记录情况太多了
单从GC看,你是不是经常申请一大块内存(>10M左右),然后马上就不需要了?通常大块内存(具体多大和Eden区和相关设置有关)是直接在老年代里分配的,所以导致老年代迅速爆满,不得不进行Full GC。
------解决方案--------------------
引用:
Quote: 引用:

你先说说你这个程序在干嘛啊,哪些地方申请了大量内存等等,不然就一个GC记录情况太多了
单从GC看,你是不是经常申请一大块内存(>10M左右),然后马上就不需要了?通常大块内存(具体多大和Eden区和相关设置有关)是直接在老年代里分配的,所以导致老年代迅速爆满,不得不进行Full GC。


 用什么命令能看到是否一次申请了大块内存呢,如果应用确实是这样,那应该考虑调整哪些参数,如何调整呢,谢谢

好像一些商用的软件可以, 能查看虚拟机进程中一共创建了多少对象, 每个对象的内存大小什么的