技术开发 频道

Java也玩内存泄漏?



    3. 什么导致Java的内存泄露——成也GC,败也GC,因此,通过以上分析,我们知道在Java中也有内存泄漏,但范围比C++要小一些。因为Java从语言上保证,任何对象都是可达的,所有的不可达对象都由GC管理。

    对于程序员来说,GC基本是透明的,不可见的。虽然,我们只有几个函数可以访问GC,例如运行GC的函数System.gc(),但是根据Java语言规范定义, 该函数不保证JVM的垃圾收集器一定会执行。因为,不同的JVM实现者可能使用不同的算法管理GC。通常,GC的线程的优先级别较低。JVM调用GC的策略也有很多种,有的是内存使用到达一定程度时,GC才开始工作,也有定时执行的,有的是平缓执行GC,有的是中断式执行GC。但通常来说,我们不需要关心这些。除非在一些特定的场合,GC的执行影响应用程序的性能,例如对于基于Web的实时系统,如网络游戏等,用户不希望GC突然中断应用程序执行而进行垃圾回收,那么我们需要调整GC的参数,让GC能够通过平缓的方式释放内存,例如将垃圾回收分解为一系列的小步骤执行,Sun提供的Hot Spot JVM就支持这一特性。

    Java正式因为有GC的存在,减少了程序员的负担,使得程序员不必纠缠在内存申请与释放这些细节上,能够更加专著与程序的逻辑与结构。可以说,Java之所以如此成功,一经推出就迅速走红,GC功不可没;然后,GC存在也助长了程序员的“懒惰”,大多数的Java程序员从来都不在意内存的管理,肆意挥霍内存,想申请多少个对象就申请多少个对象,许多明明已经无用的对象仍然有引用关联,造成了GC无法回首这种无用的内存,因而产生内存泄漏。Java的内存泄漏对于小的应用程序来说,危害还是比较小的,因为毕竟泄漏的可能性小、数量小,但是对于用Java开发的服务程序(如JSP、Servlet、EJB等等)来说,危害是十分巨大的,因为这些程序一般都是常年累月的运行,只要有一点点内存泄漏,经过长时间的运行积累,再大的内存,也会被“吃”光。

    4. 如何检测内存泄漏
    最后一个重要的问题,就是如何检测Java的内存泄漏。目前,我们通常使用一些工具来检查Java程序的内存泄漏问题。市场上已有几种专业检查Java内存泄漏的工具,它们的基本工作原理大同小异,都是通过监测Java程序运行时,所有对象的申请、释放等动作,将内存管理的所有信息进行统计、分析、可视化。开发人员将根据这些信息判断程序是否有内存泄漏问题。这些工具包括Optimizeit Profiler,JProbe Profiler,JinSight , Rational 公司的Purify等。
    综上所述,Java也存在内存泄露问题,其原因主要是一些对象虽然不再被使用,但它们仍然被引用。为了解决这些问题,我们可以通过软件工具来检查内存泄露,检查的主要原理就是暴露出所有堆中的对象,让程序员寻找那些无用但仍被引用的对象。
0
相关文章