本帖最后由 easyreal 于 2014-08-20 10:43:45 编辑

解决方案 »

  1.   

    楼主,你能不能jstat来看看相应的输出啊?你的业务是不是每一次请求都是需要大块的内存啊?
      

  2.   

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

  3.   

    文字表达能力差,内容看不懂,回复第三点,copy了gc函数的文档来回复吧:Calling the gc method suggests that the Java Virtual Machine expend effort toward recycling unused objects in order to make the memory they currently occupy available for quick reuse. 是suggests ok!?别老动不动就触发条件
      

  4.   

    谢谢大家的回复,人人有分~~
    因为最近在学习内存优化,gc原理和jvm参数都看了,还有jstat、jmap、mat这些工具,但是就象学武术一样,学了很多招式,这些招式如何连起来用,如何打出漂亮的组合拳啊?
    这个gc日志是之前某个项目的,后来如何优化的我也不知道,现在也没法用jstat来看,我的疑问主要是从gc日志上看,后续的gc非常有规律,每次普通gc距离上次gc有2000秒左右时间,gc后年轻代减少,但是总内存占用反而增加,说明gc时有大对象直接进入老年代吗?然后马上会触发一次full gc,触发原因是什么呢?这种情况用jstat -gccause会看出原因吗,我用这个命令的时候经常打出unknown GCCause。还有这是个web应用,是不是改成cms收集器更合适,如果用cms收集器,该不该把-XX:SurvivorRatio调小点?
    大家是如何提升自己的内存调优能力的?有哪些好的内存调优的案例分享吗,谢谢
      

  5.   


     用什么命令能看到是否一次申请了大块内存呢,如果应用确实是这样,那应该考虑调整哪些参数,如何调整呢,谢谢
    好像没有这种命令吧。。反正我没听说过
    这个还是需要你自己检查源码,或者我一般也只是跑个Jave VisualVM看看Visual GC和Profile,不过好像也只能具体到某个线程吧(好像能看到对象内存统计,忘了)。如果你确定是经常申请大内存,那可以调整一下Eden区的大小,让这块内存可以先在Eden区分配,不过其实这种调整也没必要,Full GC虽然耗时但也不是慢到不行,而且你这样调来调去也不利于项目拓展,除非你的程序已经基本不会变了。
      

  6.   


     用什么命令能看到是否一次申请了大块内存呢,如果应用确实是这样,那应该考虑调整哪些参数,如何调整呢,谢谢
    好像一些商用的软件可以, 能查看虚拟机进程中一共创建了多少对象, 每个对象的内存大小什么的不用商用软件也可以的,jdk里本身就带了相应的工具去查看,里面有个工具叫jvisualvm命令行也可以,叫jmap ,可以直接dump内存看里面的内容。
      

  7.   


     用什么命令能看到是否一次申请了大块内存呢,如果应用确实是这样,那应该考虑调整哪些参数,如何调整呢,谢谢
    好像没有这种命令吧。。反正我没听说过
    这个还是需要你自己检查源码,或者我一般也只是跑个Jave VisualVM看看Visual GC和Profile,不过好像也只能具体到某个线程吧(好像能看到对象内存统计,忘了)。如果你确定是经常申请大内存,那可以调整一下Eden区的大小,让这块内存可以先在Eden区分配,不过其实这种调整也没必要,Full GC虽然耗时但也不是慢到不行,而且你这样调来调去也不利于项目拓展,除非你的程序已经基本不会变了。从楼主FGC的命令来看,如果是个对响应要求比较高的系统的话,还是有问题的。一个FGC有时需要2s 以上不太好最好用gc的参数设置一下。