详细介绍 Java 的内存管理与内存泄露
作为 Internet 最流行的编程语言之一,Java 现正非常流行。我们的网络应用程
序就主要采用 Java 语言开发,大体上分为客户端、服务器和数据库三个层次。
在进入测试过程中,我们发现有一个程序模块系统内存和 CPU 资源消耗急剧增
加,持续增长到出现 java.lang.OutOfMemoryError 为止。经过分析 Java 内
存泄漏是破坏系统的主要因素。这里与大家分享我们在开发过程中遇到的 Java
内存泄漏的检测和处理解决过程.
本文先介绍 Java 的内存管理,以及导致 Java 内存泄露的原因。
一. Java 是如何管理内存
为了判断 Java 中是否有内存泄露,我们首先必须了解 Java 是如何管理内存的。
Java 的内存管理就是对象的分配和释放问题。在 Java 中,内存的分配是由程
序完成的,而内存的释放是由垃圾收集器(Garbage Collection,GC)完成的,
程序员不需要通过调用函数来释放内存,但它只能回收无用并且不再被其它对
象引用的那些对象所占用的空间。
Java 的内存垃圾回收机制是从程序的主要运行对象开始检查引用链,当遍历一
遍后发现没有被引用的孤立对象就作为垃圾回收。GC 为了能够正确释放对象,
必须监控每一个对象的运行状态,包括对象的申请、引用、被引用、赋值等,
GC 都需要进行监控。监视对象状态是为了更加准确地、及时地释放对象,而
释放对象的根本原则就是该对象不再被引用。
在 Java 中,这些无用的对象都由 GC 负责回收,因此程序员不需要考虑这部分
的内存泄露。虽然,我们有几个函数可以访问 GC,例如运行 GC 的函数
System.gc(),但是根据 Java 语言规范定义,该函数不保证 JVM 的垃圾收集
器一定会执行。因为不同的 JVM 实现者可能使用不同的算法管理 GC。通常 GC
的线程的优先级别较低。JVM 调用 GC 的策略也有很多种,有的是内存使用到
达一定程度时,GC 才开始工作,也有定时执行的,有的是平缓执行 GC,有的
是中断式执行 GC。但通常来说,我们不需要关心这些。
二. 什么是 Java 中的内存泄露
导致内存泄漏主要的原因是,先前申请了内存空间而忘记了释放。如果程序中
存在对无用对象的引用,那么这些对象就会驻留内存,消耗内存,因为无法让
垃圾回收器 GC 验证这些对象是否不再需要。如果存在对象的引用,这个对象
就被定义为"有效的活动",同时不会被释放。要确定对象所占内存将被回收,
我们就要务必确认该对象不再会被使用。典型的做法就是把对象数据成员设为
null 或者从集合中移除该对象。但当局部变量不需要时,不需明显的设为
null,因为一个方法执行完毕时,这些引用会自动被清理。
评论0