今天去掏宝面试,被问到"java的内存泄露是错误还是异常?"
我答:是错误
我不知道答得对不对?
请大家说说!!

解决方案 »

  1.   

    个人愚见:如果内存泄露的消息被java反馈回来,并有警示消息那么应该是异常,应该说所谓“异常”就是被程序捕获的错误,超出程序预期的目的或者计划。如果内存泄露后,未能捕获进而引发了灾难性的后果,例如主程序崩溃或者蓝屏死机,那么就是应该是错误。能否捕获并处理是区分是否是错误或者异常的关键,这个题目感觉出的很模糊,java的内存泄露到底指的什么?java本身编译器的内存泄露?还是说java编写的程序的内存泄露?
      

  2.   

    这个 我觉得应该是异常
    内存泄漏可以通过一些手段避免
    而error 是不能通过修改程序避免的...
      

  3.   

    找了点有用的   和大家分享一下:
    网上关于java内存泄露的资料都过于玄乎,其实java导致内存泄露的原因很明确:长生命周期的对象持有短生命周期对象的引用就很可能发生内存泄露,尽管短生命周期对象已经不再需要,但是因为长生命周期对象持有它的引用而导致不能被回收,这就是java中内存泄露的发生场景。作者在书中提到了3个场景:   1.流失监听器问题,在awt、swing编程中,给组件添加了事件监听器,这些组件的生命周期如果很长的话,监听器对象将不能被正确回收。关于GUI编程我不是很熟悉,这一点存有疑问,因为显然你触发一个按钮的事件,当然是一直期待同样的行为发生,如果删除了监听器或者使用弱引用让JVM回收不符合业务逻辑和用户体验。   2.集合类,集合类仅仅有添加元素的方法,而没有相应的删除机制,导致内存被占用。这一点其实也不明确,这个集合类如果仅仅是局部变量,根本不会造成内存泄露,在方法栈退出后就没有引用了会被jvm正常回收。而如果这个集合类是全局性的变量(比如类中的静态属性,全局性的map等),那么没有相应的删除机制,很可能导致集合所占用的内存只增不减,因此提供这样的删除机制或者定期清除策略非常必要。   3.单例模式。不正确使用单例模式是引起内存泄露的一个常见问题,单例对象在被初始化后将在JVM的整个生命周期中存在(以静态变量的方式),如果单例对象持有外部对象的引用,那么这个外部对象将不能被jvm正常回收,导致内存泄露,考虑下面的例子:   class A{   public A(){   B.getInstance().setA(this);   }   ....   }   //B类采用单例模式   class B{   private A a;   private static B instance=new B();   public B(){}   public static B getInstance(){   return instance;   }   public void setA(A a){   this.a=a;   }   //getter...   }   显然B采用singleton模式,他持有一个A对象的引用,而这个A类的对象将不能被回收。想象下如果A是个比较大的对象或者集合类型会发生什么情况。   上面所讲的这些也启发我们如何去查找内存泄露问题,第一选择当然是利用工具,比如jprofiler,第二就是在代码复审的时候关注长生命周期对象:全局性的集合、单例模式的使用、类的static变量等等。
      

  4.   

    java有内存泄漏吗?只听说过内存溢出。
      

  5.   

    JVM有垃圾回收 内存泄露应该是C/C++吧
    不太清楚 学习一下
      

  6.   

    OutOfMemoryError类,可能想考察的是这个吧
      

  7.   


    我觉得吧,面试官问迩这个问题,不一定就是要迩二选一的,或许只是想考察你是不是细心,是否对java认识得够透彻,就好比二楼说的,可能本身题目就故意出得有点模糊;再或者是想考察迩的其他一些方面;在面试中,什么情况都是有可能的。
      

  8.   

    是错误吧,内存溢出会报这个错误 java.lang.OutOfMemoryError