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分钟的时候,内存需求就陡增?如果一个程序的进程需要无休止的处理一个事件的话,那还有什么方法保证内存不泄漏?
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分钟的时候,内存需求就陡增?如果一个程序的进程需要无休止的处理一个事件的话,那还有什么方法保证内存不泄漏?
解决方案 »
- javacomm20-win32.zip——配置好驱动后,怎么配置系统环境变量?
- java 怎么弹出yes or no 的对话框
- 奇数魔阵的算法
- java中使用JNI的registry-3.1.3能否远程访问注册表,一个例子
- 显示Exception in thread "main" java.lang.NullP的错误,在线等
- 急问!为什么JTree中的结点图标我怎么也改不了。
- 大家帮我看看,关于Statement对象批量执行sql问题
- BufferedWriter的缓冲限制
- 在Applet中如何画“虚线”? 急~!!!
- 一个合理化建议!
- 谁能说说java的容器类及数组的效率
- 求applet画多边形代码(用drawPolygon)
其次,JAVA程序运行会默认分配一个大小的空间,可能不是你的程序实际需要的,因为JAVA程序都是动态分配内存,所以它需要这么做。
这也是你在4分钟内没看到内存增加的原因,5分钟时,可能默认的空间大小已经不够了,就不得不增加了。
最后,这个代码这样看的不会发生内存泄漏,只是GC还没到它想内存回收的时刻,它是自动执行回收的,调用system.gc()不会立即回收的还有一点,screenPosF=null这句是没必要的,在循环一次后,在循环作用域内它已经是不可见的。且你的程序中的pp是写错了,哪里来的,呵呵。
System.gc() 这个方法为什么不能在程序中常用? 我的理解就是它专门清除垃圾(未引用的对象)来释放内存空间(纯java程序里),我死循环调用它清除未引用的对象,反而会造成内存泄漏? 那这个方法还有什么用,调用了反而不如它自己管理合适,这就是困扰我很久的问题很想知道一些服务器应用,里面有的进程基本都是好几天甚至一个月时间不断运行,它们是如何解决内存不泄露的?
我又用几个简单的代码做了内存泄漏测试,发现我不使用System.gc()反而比我手动调用gc要稳定得多,运行20多分钟也没发现内存不断增长。而我手动调用gc,5分钟内存必不断增长。就有个疑问了,System.gc()这个方法是不是平时就要避免手动调用? 我试了这么多,发现gc自己管理比手动管理稳定得多
谢谢你提醒了我关于while循环的作用域问题,之前确实没注意创建的对象已经是垃圾了。
还有那个int型变量pp未定义是手误,敲的时候忘了定义了:)