摘 要:本文将对Java内存泄露问题进行探讨,以此提高Java程序在使用中的安全性。
关键词:Java;内存泄露;问题;研究
前言
内存泄露就是指一个不再被程序使用的对象或变量一直被占据在内存中的情况,Java中的内存泄露是指存在于无用但是垃圾回收器无法回收的对象。即使有内存泄露问题存在,也不会一定会表现出来。java中存在垃圾回收机制,它可以保证一对象不再被引用的时候,并且即对象编程了孤儿的时候,该对象将依然自动被垃圾回收器从内存中清除掉。但是由于Java 使用有向图的方式进行垃圾回收管理,这时就可以消除引用循环的问题。分配是由内存的分配,是指由程序完成的,并且程序员需要通过关键字new为每个对象申请内存空间(基本类型除外),但所有的对象都在堆(Heap)中分配空间;并且而对象的释放是由垃圾回收机制决定和执行的。并且对于对象的释放往往是由垃圾回收机制决定和执行的,其目的是简化了程序员的工作。可是也加重了JVM的工作。这导致Java程序运行速度较慢的原因的一种情况。其问题是GC为了能够正确释放对象,GC这时就必须监控对每一个对象的运行状态,如对象的申请、引用、被引用、赋值等,GC都需要进行监控的作用。
一、认识Java是如何管理内存
在Java内存管理中内存泄漏就是存在一些被分配的对象,而这些对象往往存在两个方面的特点,一是这些对象是可达的,也就是说在有向图中存在通路可以与其相连(也就是说仍存在该内存对象的引用)。二是这些对象是无用的,也就是说在程序以后不会再使用这些对象。假设对象满足这两个条件,那么这些对象就可以判定为Java中的内存泄漏现象。同时为了判断Java中是否有内存泄露,那么我们就必须了解Java是如何管理内存的。Java的内存管理就是对象的分配和释放问题。Java的内存分配有三种:一是静态存储区,即是内存在程序编译时就分配好了,比如静态变量; 二是堆区,即对象(包括数组)都是在堆中创建的。而程序在运行的时候通过用new关键字来创建对象,对象创建时会在堆中为其分配内存。三是栈区,即各种原始数据类型的局部变量都是在栈上创建出来的,并且当程序退出该变量的作用范围的时候这个变量的内存就会被自动释放。
但是在C++中内存泄漏的范围往往就会更大一些。而这些对象被分配了内存空间,却不可达,由于C++中没有GC,这些内存将永远收不回来。在Java中这些不可达的对象都由GC负责回收,所以说程序员不需要考虑这部分的内存泄露。在Java中程序员需要通过关键字new为每个对象申请内存空间 (基本类型除外),并且所有的对象都在堆 (Heap)中分配空间。此外对象的释放是由GC决定和执行的。Java把内存分两种:一是栈内存,二是堆内存。在函数中定义的基本类型变量和对象的引用变量都存在于函数的栈内存中分配;同时堆内存用来存放由new创建的对象和数组,并且是对象的实例变量。Java就在栈中为这个变量分配内存空间变化,当超过变量的作用域后,Java就会自动释放掉以至于改变为该变量所分配的内存空间。同时在堆中分配的内存由Java虚拟机的自动垃圾回收器来管理
二、防止Java内存泄漏的方法
一般情况下对于Java的内存泄露往往表现为一个内存对象的生命周期超出了程序需要它的时间长度。这时我们就将其称为“对象游离”。Java的GC机制是建立在跟踪内存的引用机制上的。但是在以往我们所使用的引用都只是定义一个“Object o”这样形式的。其实在实际情况下这只是Java引用机制中的一种默认情况,除此之外,还有其他的一些引用方式。通过使用这些特殊的引用机制,再配合GC机制就可以达到一些我们需要的效果。如:
1 public class FileSearch{
2 private byte. 微型电脑应用 2005年07期