Topic: 郁闷了2天的一个关于OutOfMemoryError的问题,有空的进来帮帮忙看看吧

  Print this page

1.郁闷了2天的一个关于OutOfMemoryError的问题,有空的进来帮帮忙看看吧 Copy to clipboard
Posted by: darx
Posted on: 2004-11-21 18:06

我写的一个程序要求一天24小时运行
有三个文件
A.java,B.java和C.java

A.java负责启动和监视
B.java是主要运行的程序,实现了Runnable接口
C.java是具体执行的,实现了Runnable接口

我的思路是
B.java运行时要从外部读取数据,然后根据这些数据来创建C的实例,数据在C的run()中处理执行,执行完后C关闭
因为外部很多的不稳定因素,导致B读取数据时可能会出错,也可能超时,所以我用了A来监视B最后一次读取数据的时间,如果超过xx秒,就重新执行B

现在程序运行几个小时后就出现java.lang.OutOfMemoryError的内存漏洞错误
在控制台中不停显示 “B reboot”

大家帮我看看结构上有不有问题
程序代码太多,大概的结构是
class A{
....main(){
........B b = new B();
........while(true){
............if (System.currentTimeMillis() - B.lastTime > 15000) {
................b.go = false;
................b = new B();
................System.out.println("B reboot");
............}
............Thread.sleep(8000);
........}
....}
}

class B implements Runnable{
....lastTime = 0;
....go = true;
....B(){
........t = new Thread(this);
........t.start();
....}

....run(){
........while(go){
............从外部读取数据

............if(...){
................new C(...);
............}
............if(){
................new C(...);
............}
............lastTime = System.currentTimeMillis();
............t.sleep(1000);
........}
....}
}

class C implements Runnable{
....C(...){
........t = new Thread(this);
........t.start();
....}
....run(){
........处理数据
....}
}

大家帮帮忙,多谢

2.Re:郁闷了2天的一个关于OutOfMemoryError的问题,有空的进来帮帮忙看看吧 [Re: darx] Copy to clipboard
Posted by: kavinwang
Posted on: 2004-11-21 18:15

当b.go = false时,B中生成的C什么时候退出,当你生成很多B时,在B中生成的更多C什么时候退出?

3.Re:郁闷了2天的一个关于OutOfMemoryError的问题,有空的进来帮帮忙看看吧 [Re: darx] Copy to clipboard
Posted by: darx
Posted on: 2004-11-21 20:22

每当new C(),每一个C的run()执行完后它不会自动关闭的吗?

4.Re:郁闷了2天的一个关于OutOfMemoryError的问题,有空的进来帮帮忙看看吧 [Re: darx] Copy to clipboard
Posted by: littledeer1974
Posted on: 2004-11-21 20:59

在循环中使用new 语句是一件很不明智的选择,我觉得,建议你修改这一部分的代码再试试看

5.Re:郁闷了2天的一个关于OutOfMemoryError的问题,有空的进来帮帮忙看看吧 [Re: littledeer1974] Copy to clipboard
Posted by: darx
Posted on: 2004-11-21 21:07

littledeer1974 wrote:
在循环中使用new 语句是一件很不明智的选择,我觉得,建议你修改这一部分的代码再试试看

你是指在B中的new C()吗?
这是为什么呢

6.Re:郁闷了2天的一个关于OutOfMemoryError的问题,有空的进来帮帮忙看看吧 [Re: darx] Copy to clipboard
Posted by: littledeer1974
Posted on: 2004-11-21 21:26

因为循环就是不停的执行,尤其是在线程种,更是这样的情况多,而new是用来生成一个新的内存空间,为新的Object作准备,对吧,那你如果让这个生成新的对象的步骤不停的重复的执行的后果是什么呢,对,那就是内存被用到没有,在调用new的时候就没有内存了,就会是你说的状况了

#我也有遇到过类似的状况,以上供你参考

7.Re:郁闷了2天的一个关于OutOfMemoryError的问题,有空的进来帮帮忙看看吧 [Re: darx] Copy to clipboard
Posted by: darx
Posted on: 2004-11-21 21:36

我new出来的不会自动释放的吗
我曾经用过一个线程池来处理C,结果运行一段时间后就提示池已经满了

8.Re:郁闷了2天的一个关于OutOfMemoryError的问题,有空的进来帮帮忙看看吧 [Re: darx] Copy to clipboard
Posted by: littledeer1974
Posted on: 2004-11-21 21:50

你new出来的怎么就会自动释放呢?如果会的话,你的根据是什么呢?

9.Re:郁闷了2天的一个关于OutOfMemoryError的问题,有空的进来帮帮忙看看吧 [Re: darx] Copy to clipboard
Posted by: darx
Posted on: 2004-11-21 22:06

能不能加我msn?
dddeee6@hotmail.com

自己new的必须手动释放吗?
用System.gc()?

10.Re:郁闷了2天的一个关于OutOfMemoryError的问题,有空的进来帮帮忙看看吧 [Re: darx] Copy to clipboard
Posted by: littledeer1974
Posted on: 2004-11-21 22:12

恩,System.gc();是一个方法,但是最好的还是避免在循环(尤其是次数不定,很难计数的循环)中使用new

11.Re:郁闷了2天的一个关于OutOfMemoryError的问题,有空的进来帮帮忙看看吧 [Re: littledeer1974] Copy to clipboard
Posted by: jameszhang
Posted on: 2004-11-22 08:19

littledeer1974 wrote:
恩,System.gc();是一个方法,但是最好的还是避免在循环(尤其是次数不定,很难计数的循环)中使用new

gc 会是程序有明显停顿,同意LULU,垃圾回收不是想象的那样及时

12.Re:郁闷了2天的一个关于OutOfMemoryError的问题,有空的进来帮帮忙看看吧 [Re: darx] Copy to clipboard
Posted by: kavinwang
Posted on: 2004-11-22 08:50

kavinwang wrote:
当b.go = false时,B中生成的C什么时候退出,当你生成很多B时,在B中生成的更多C什么时候退出?


当线程的run方法没有退出前,线程是不可能被回收的。
java的程序是多线程的,是由线程堆积而成的,每个线程都运行在自己的内存空间中(不严格),当你不停地生成线程时,对系统有两个挑战,1是线程数目,每一个系统都有一个线程的数目限制的,线程多时并不能提升系统的运行性能,2是对内存的消耗,这个就不多加解释了。
当一个线程正在运行时,gc是没有办法对它进行清理的,更深的原因是ThreadGroup的原因(只是一个方面),因为任一个线程都会在group中注册,也就是说在group中有一个针对此线程的引用,在线程退出时,此引用才被清除,gc才能对线程(已死掉)进行回收。
在你的程序中,一是大量生成线程并没有明显的让线程退出,其内存和线程空间的消耗是非常可观的,经过一定时间系统的资源就会被消耗尽,你也许会说你的系统有2G的内存,这也只能让时间稍稍退后一点,并不能解决根本问题。

13.Re:郁闷了2天的一个关于OutOfMemoryError的问题,有空的进来帮帮忙看看吧 [Re: darx] Copy to clipboard
Posted by: darx
Posted on: 2004-11-22 09:56

那我怎么才能让这些线程退出呢

14.Re:郁闷了2天的一个关于OutOfMemoryError的问题,有空的进来帮帮忙看看吧 [Re: darx] Copy to clipboard
Posted by: kavinwang
Posted on: 2004-11-22 11:34

run方法退出后,线程就退出了。

15.Re:郁闷了2天的一个关于OutOfMemoryError的问题,有空的进来帮帮忙看看吧 [Re: darx] Copy to clipboard
Posted by: darx
Posted on: 2004-11-22 11:57

是啊
难道是C中的run在处理数据时死掉了?才导致没有退出?

忘了说
在B的循环中new C时最多一次可能new20多个C
循环的执行时间在1秒左右,加上sleep的时间,也就是2秒左右循环一次

BTY,被你说中了,确实是2G的内存,呵呵
在windows中启动这个程序时,占用2M不到的内存
但是由于调试很不方便,我一直没找到什么时候开始内存占用变多
也就只有看代码找原因了

16.Re:郁闷了2天的一个关于OutOfMemoryError的问题,有空的进来帮帮忙看看吧 [Re: darx] Copy to clipboard
Posted by: kavinwang
Posted on: 2004-11-22 16:19

你可以使用optimizeit监控一下内存和线程及各种对象的使用情况,可能便于你查问题。这个东西是borland的产品,如果你使用jbuilder的话,它和jbuilder结合的比较号,当然也可单独使用。

17.Re:郁闷了2天的一个关于OutOfMemoryError的问题,有空的进来帮帮忙看看吧 [Re: darx] Copy to clipboard
Posted by: ftang
Posted on: 2004-11-23 02:10

General speaking, the previouse B should be killed before lauch the NEW thread, and another thing is you always need some sort of way out(exit, break) in "while" loop, according to "Code Compulete" book, when you use while loop as Deamon process, you always need a "break out" to terminate the deamon, in your case that will be a protection for memory overflow.

18.Re:郁闷了2天的一个关于OutOfMemoryError的问题,有空的进来帮帮忙看看吧 [Re: darx] Copy to clipboard
Posted by: darx
Posted on: 2004-11-23 21:42

多谢几位斑竹的帮忙

19.Re:郁闷了2天的一个关于OutOfMemoryError的问题,有空的进来帮帮忙看看吧 [Re: darx] Copy to clipboard
Posted by: darx
Posted on: 2004-12-05 22:37

今天我又把这个调试了下,问题出在这里
C处理外部数据时很不稳定。由于C处理时还得从外部再读一部分数据,正常情况下1秒左右就可以读出来,但是有时候居然读到一半就停住,也不关闭,也不继续读下去。
就像我们在网速慢的时候开网页一样,有时候打开一个页面开到一半就再也打不开,IE下面的蓝色进度条也停住。
这样就导致了那个C线程一直处于运行状态,没有退出
当运行时间一长,这样的情况多了的时候,就把内存吃光了

有不有办法设置一个失效时间?当一段时间之后C还没有执行完,就把它关掉?

20.Re:郁闷了2天的一个关于OutOfMemoryError的问题,有空的进来帮帮忙看看吧 [Re: darx] Copy to clipboard
Posted by: darx
Posted on: 2004-12-07 10:32

代码贴出来

client和clientb是两个版本
client是有线程池管理,clientb没有
Init对应A,Update1gq对应B,SimpleThread对应C
client中有相应注解

src.rar (8.63k)


   Powered by Jute Powerful Forum® Version Jute 1.5.6 Ent
Copyright © 2002-2021 Cjsdn Team. All Righits Reserved. 闽ICP备05005120号-1
客服电话 18559299278    客服信箱 714923@qq.com    客服QQ 714923