import java.awt.Robot; 
import java.awt.AWTException; class test1{ 
    public static void main(String args[]) throws AWTException{ 
    while(pp==1){ 
        Robot screenPosF = new Robot(); 
            screenPosF = null; 
            System.gc(); 
        } 
    } 
} 虽然此程序是死循环,但是死循环不一定就发生内存泄漏。该程序里的screenPosF对Robot对象的引用我取消了啊,为什么我用Jprobe还是提示Robot screenPosF = new Robot() 这行是导致内存泄漏的原因?  这个程序的gc开始4分钟内确实回收内存了,也没有见到内存增长。但是到5分钟的时候,内存需求就陡增?如果一个程序的进程需要无休止的处理一个事件的话,那还有什么方法保证内存不泄漏?

解决方案 »

  1.   

    首先,System.gc()不会按你想的立刻进行内存回收的,
    其次,JAVA程序运行会默认分配一个大小的空间,可能不是你的程序实际需要的,因为JAVA程序都是动态分配内存,所以它需要这么做。
    这也是你在4分钟内没看到内存增加的原因,5分钟时,可能默认的空间大小已经不够了,就不得不增加了。
    最后,这个代码这样看的不会发生内存泄漏,只是GC还没到它想内存回收的时刻,它是自动执行回收的,调用system.gc()不会立即回收的还有一点,screenPosF=null这句是没必要的,在循环一次后,在循环作用域内它已经是不可见的。且你的程序中的pp是写错了,哪里来的,呵呵。
      

  2.   

    java可以用gc解决内存泄露,但是作为程序员要有防止过多垃圾内存的意识。
      

  3.   

    程序总是java.lang.OutOfMemoryError很是郁闷所以我很想弄明白如何造成内存泄漏和怎样有针对性的解决的网上的 java关于内存泄漏和解决的文章看的也很多,可能我理解能力不强,感觉那些文章反而没有一些小例子有针对性。恳请大家帮帮忙说清楚这类问题
    System.gc() 这个方法为什么不能在程序中常用?  我的理解就是它专门清除垃圾(未引用的对象)来释放内存空间(纯java程序里),我死循环调用它清除未引用的对象,反而会造成内存泄漏? 那这个方法还有什么用,调用了反而不如它自己管理合适,这就是困扰我很久的问题很想知道一些服务器应用,里面有的进程基本都是好几天甚至一个月时间不断运行,它们是如何解决内存不泄露的?
      

  4.   


    我又用几个简单的代码做了内存泄漏测试,发现我不使用System.gc()反而比我手动调用gc要稳定得多,运行20多分钟也没发现内存不断增长。而我手动调用gc,5分钟内存必不断增长。就有个疑问了,System.gc()这个方法是不是平时就要避免手动调用? 我试了这么多,发现gc自己管理比手动管理稳定得多
      

  5.   

    对,一般是不会有人写System.gc()的。gc的算法是会遍历所有引用的,所以可能频繁回收会造成你所说的情况
      

  6.   


    谢谢你提醒了我关于while循环的作用域问题,之前确实没注意创建的对象已经是垃圾了。
    还有那个int型变量pp未定义是手误,敲的时候忘了定义了:)