用JProbe对你的程序进行监测,看看问题出在哪个地方

解决方案 »

  1.   

    如果java中设仆个手动的垃极回收就好了。
      

  2.   

    Java的垃圾回收机制是一种可靠的机制,这点我们首先不怀疑.
    其次,对于Java语言编写的程序是否存在MLK(Memory Leak)呢?答案是肯定的,严格的说,Java中不叫内存泄漏,更准确点叫做"无意识的对象保留".意思就是一些本来应该生命周期结束的对象确一直有引用保存,那么GC当然不会回收这些对象了.
    再回头看看你的例子,1G的内存被渐渐吃光,所以我觉得存在这种MLK的情况可能存在.
    下面我们来看看一些建议如何来解决你的问题.
    问题最容易出在什么地方?是在内存由你自己来管理的地方,比如你自己做的推栈,缓存或者对象池这类自己维护内存的地方是非常容易出错的.所以建议你先检查程序的这些地方.看看是否存在应该释放的对象而没有释放.
    其次,还有一种情况也是经常容易发生的.从你的描述来看,你的程序连续运行3天,我们可以认为是连续运行的,如果在连续运行的程序中你不断创建大量的细粒度的对象也会导致内存的不断消耗.对于这样的情况,你可以参见Flyweight Pattern,把对象internal state和external state区分开,使用共享的方式就可以解决这类的问题.
    这些意见仅供参考.
      

  3.   

    定时收集何解?Java的GC线程本身就是定时收集.正常情况下,不推荐做手工的垃圾回收.
    关键还是在程序本身的原因.我们曾经经历过一个项目,优化之后的情况下,垃圾回收线程每天才运行一次.另外也有一个反例,至今未解,GC在1分钟之内运行了1500次.
    所以还是信任Java自己的GC,把主要的精力放在code review上面吧.
      

  4.   

    java 是多线程的,每个程序一旦开始,至少有两个线程在运行,一个是main 入口,一个就是垃圾回收,
    所以 垃圾回收 是实时的。
      

  5.   

    考虑到多用一些设计模式了,比如Singleton模式,MVC模式等,注意尽量少的new对象,有些对象是无状态对象,其实可以反复利用的,而不用去新建,减少内存开支。
      

  6.   

    kinhope(java兵) 误解了,"实时"和"定时"是两个概念.