今天去掏宝面试,被问到"java的内存泄露是错误还是异常?"
我答:是错误
我不知道答得对不对?
请大家说说!!
我答:是错误
我不知道答得对不对?
请大家说说!!
解决方案 »
- 我的程序为什么会报说sysdatabases无效呢!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- struts2类型转换
- Spring3的源码有多少行?
- 几个面试题,高手解决一下。谢谢
- tomcat连接oracle 需要添加什么jar包
- 请教Hibernate中的Session应该是单例还多例的?
- 对struts的一点疑惑 高手请指教
- 怎么配置TOMCAT5.0.27自带数据库连接池程序
- 如何让自己的程序没有BUG!!!
- 谁有 电子版 mastering ejb 2e 多谢!!及学习EJB 集合什么实例学习比较快一点?
- 租个空间放Java应用程序
- 手动解析webservice包的问题
内存泄漏可以通过一些手段避免
而error 是不能通过修改程序避免的...
网上关于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变量等等。
不太清楚 学习一下
我觉得吧,面试官问迩这个问题,不一定就是要迩二选一的,或许只是想考察你是不是细心,是否对java认识得够透彻,就好比二楼说的,可能本身题目就故意出得有点模糊;再或者是想考察迩的其他一些方面;在面试中,什么情况都是有可能的。