解决方案 »

  1.   

    public Object pop(){
    if(size==0) throw new EmptyStackException();
    return elements[--size];
    }
    其实就是这个函数实现上的问题如果是这样的实现,比如说原来有10个成员,pop1一个之后,虽然size变成了9,但是element[9]的值仍然有一个引用。正确的做法应该是
    public Object pop(){
    if(size==0) throw new EmptyStackException();
    Obecjt o  = elements[size];
    element[size]=null;
    size--;
    return o;
    }
      

  2.   


    1、首先这种做法跟pop后push其实是一个意思吧?
    2、即便出现那种极端情况,就是先push1W个元素,然后再pop9990个元素,这样确实会出现大量用不到的引用对象,但作者却说到了内存泄露的问题,我实在想不到push都没有造成内存泄露,为何pop还造成内存泄露了呢?
      

  3.   


    1、首先这种做法跟pop后push其实是一个意思吧?
    2、即便出现那种极端情况,就是先push1W个元素,然后再pop9990个元素,这样确实会出现大量用不到的引用对象,但作者却说到了内存泄露的问题,我实在想不到push都没有造成内存泄露,为何pop还造成内存泄露了呢?1. pop后,push就不会有这个问题。你看我后面写的那一段,关键是后面的引用没有被 释放。再push就等于原来的引用被释放了。2. java中的内存泄露并不同于C语言所说的内存泄露,而是一种和业务无关的引用仍然存在,从而造成了JVM无法回收这块内存。
     这么说,你理解了为什么作者说内存泄露了吧。然后你可以想想你举的这个例子,是不是就是作者所说的内存泄露了呢?
      

  4.   


    1、首先这种做法跟pop后push其实是一个意思吧?
    2、即便出现那种极端情况,就是先push1W个元素,然后再pop9990个元素,这样确实会出现大量用不到的引用对象,但作者却说到了内存泄露的问题,我实在想不到push都没有造成内存泄露,为何pop还造成内存泄露了呢?1. pop后,push就不会有这个问题。你看我后面写的那一段,关键是后面的引用没有被 释放。再push就等于原来的引用被释放了。2. java中的内存泄露并不同于C语言所说的内存泄露,而是一种和业务无关的引用仍然存在,从而造成了JVM无法回收这块内存。
     这么说,你理解了为什么作者说内存泄露了吧。然后你可以想想你举的这个例子,是不是就是作者所说的内存泄露了呢?哦,,,,好像明白了点了,就是如果有很多类似这样的类,或者每个类都出现这种极端的扩展后收缩的情况,就造成了过多的资源浪费,从而导致内存泄露。。 这种牛角尖要自己拐过来还真是困难呢谢谢了
      

  5.   

    虽然我收分走人了。但是,memory leak这事,不分大小,就怕和业务有关。一次业务leak 一点点,时间长了,也会导致OOM