科技信息 0计算机与信息技术0 SCIENCE&TECHNOLOGY INFORMATION 2007年 第 3l期
Java中存在的内存漏洞问题与处理
吴万琴
f甘肃联合大学理工学院 甘肃 兰州 730000)
【摘 要 java语言中,其内存管理工作是由一个后台垃圾自动收集 (Garbage couector)完成的,但在java编程中,仍然存在这内存漏洞,内
存管理仍旧是要考虑的问题,在本文中,您将了解到什么导致了java的内存漏洞以及这些问题的处理。
【关键词 java;内存漏洞
0.引言 :随着信息技术的快速发展与进步 ,Intemet与其以及相
关应用系统的快速普及 ,iava语言的正式发表可以说是 Intemet的一
次技术性革命。它成为网上最流行的编程语言。在 C、c++中,程序员必
须调用molloc0函数与freeO函数进行内存分配与释放,如不小心,就
可能造成系统故障或空间浪费,但在 iava中,专门有一个后台垃圾 自
动收集程序(Garbage collector,垃圾收集器),它以较低的线程优先级对
存储器进行扫描,自动管理内存的回收,因此,有些人认为,在 java中,
不必担心内存的分配以释放问题,然而,实际并非如此,在 iava中仍然
存在着内存漏洞。
1.垃圾收集器的工作方式
iava语言的特点是面向对象,在 iava中,绝大部分成员是对象,除
简单的基本类型外 。其他的对象都需要在程序中用 new运算符为其申
请内存空间。而空间的释放有垃圾收集器完成.垃圾收集器的功能是
发现应用程序中不再需要的对象,并在这些对象不在被访问或引用时
将它们删除。垃圾收集器从根结点f在 iava应用程序的整个生存期内
存在的那些类)开始,遍历被引用的所有结点,同时监控哪些对象正被
引着。任何类只要不再被引用。则被垃圾收集器收集,即删除这些对
象,将它们所占用的内存资源返回给 iava虚拟]~tl,(JVM)。
但是。大家一定要注意,只有当一个对象不再被引用时,才会被垃
圾收集器收集,如图一所示的情况则不被收集。
时间
上图说明在java的程序的执行期间具有不同生命周期的两个类,
类 A先被初始化,并在很长一段时间内存在,某一时刻,类 B被创建。
类 A创建一个对类 B的引用,即便不再需要类 B.如果不清除 A对 B
的应用,类B仍然存在并占用内存。这样,就产生了内存泄露。
2.常见 内存泄漏 问题
内存泄露是指分配出去后无法回收内存空间,跟其他传统的高级
编程语言相比,java虚拟机(JVM)的垃圾收集器已经在结构和算法做
了相当大改进,但在实际应用,垃圾收集器只收集不再被引用的对象.
当一个应用程序运行时间过长,这时,即或一个对象是无用的,也不能
被垃圾收集器回收,这就是内存漏洞,常见的内存漏洞问题如下:
(1)程序在执行了一段时间后发出iava.1ang.OutOfMemoryEror错
误。(2)垃圾收集器在应用程序的生存期内可能始终不会运行 ,在这种
情况下,那些没什么用途的”死”对象在程序执行期间始终占用内存
f3)在生命较短的应用程序中,分配大量的临时对象,在不用这些对象
时没有取消对它们的引用,则可能耗尽内存。f4)长期运行在服务器上
的代码。即便是小漏洞也会导致 JVM耗尽全部可用内存。
3.内存漏洞问题的处理
为了减少 java中的内存漏洞,提高内存利用率,如果知道哪些对
象会导致漏洞,有时候能够制止或避免泄露问题,常见方法