问题描述
importjava.util.EmptyStackException;publicclassStack{/***Fieldelements.*/privateObject[]elements=newObject[10];/***Fieldsize.*/privateintsize=0;/***Methodpush.*@parameObject*/publicvoidpush(Objecte){ensureCapacity();elements[size++]=e;}/***Methodpop.*@returnObject*/publicObjectpop(){if(size==0)thrownewEmptyStackException();returnelements[--size];}/***MethodensureCapacity.*/privatevoidensureCapacity(){if(elements.length==size){Object[]oldElements=elements;elements=newObject[2*elements.length+1];System.arraycopy(oldElements,0,elements,0,size);}}/***Methodmain.*@paramargsString[]*/publicstaticvoidmain(String[]args){Stackstk=newStack();while(true){Objecto=newObject();for(inti=0;i<10000;i++){stk.push(o);}for(inti=0;i<10000;i++){stk.pop();}}}}
解决方案
解决方案二:
什么意思?
解决方案三:
就是这段代码有没有内存泄露。按照一般的说法,elements保留了对Object的引用。publicObjectpop(){if(size==0)thrownewEmptyStackException();returnelements[--size];}
解决方案四:
java应该不会有一般意义上的内存泄漏的吧。。
解决方案五:
你是指arraycop()后,原来的那个数组仍然包含着object的引用?
解决方案六:
有啊publicObjectpop(){if(size==0)thrownewEmptyStackException();returnelements[--size];}
应该先设置为nullObjectr=elements[--size];elements[size]=null;returnr;
为什么你要说在jdk5以下呢?
解决方案七:
可以试一下,使用jprofiler等测试不出有泄露。内存可以回收。
解决方案八:
引用2楼PFOOD的回复:
就是这段代码有没有内存泄露。按照一般的说法,elements保留了对Object的引用。publicObjectpop(){if(size==0)thrownewEmptyStackException();returnelements[--size];}
我觉得这样做,并不叫内存泄露,而是压根就没有释放,所谓内存泄露,是指那些应用或者操作系统压根无法回收的内存。而pop这样做的话,只是返回elements中的对象,却没有去掉elements对pop出对象的引用,所以,这些对象的空间暂时还是被程序占用,但将来再PUSH其它对象的时候,栈中旧的对象自然就会变成可释放状态,所以,我觉得使用这个结果,基本上不会有太大问题(应该和JDK版本也没有太大关系)。你可以做个试验,如果向其中push大量的数据(比如:100万个,目的是占用大量内存),然后再都pop处理,应该会发现,内存还是保存最高值,而没有释放。但我认为这不算内存泄露,只能说程序设计不合理罢了。
解决方案九:
和版本无关,不是内存泄露
解决方案十:
设计不合理,根据使用场景,可能会内存泄漏。例如,如果该栈是一个全局性的,这时因为pop时没有清空引用,则当栈中的对象已经没有用处时,本应该被虚拟机回收,但由于栈占用了引用,则就会发生内存泄漏。与jdk版本无关。
解决方案十一:
应该算吧,内存没及时释放
解决方案十二:
内存泄露?楼主请教一下
解决方案十三:
不会内存泄露,只会你自己一直引用,到内存放不下.大多是设计上的问题.
解决方案十四:
内存泄露?这个不清楚了,学习