内存问题一直是程序员比较关心的问题,每个程序员都希望自己开发的程序足
够健壮,在运行过程中不会因内存泄露而导致程序运行变慢或者崩溃。
现在,较新出现的面向对象语言(比如 )增强了内存管理机制,能够自动
回收不被使用的内存,或者说能够回收垃圾内存,这种内存管理机制通常被称
为“(垃圾回收)”,简称 。
开发中所使用的 语言,简称 ,也是支持 的一种语言,
经过编译后的 代码运行在 虚拟机(简称 )中,由 自动完成垃
圾内存回收的工作。就是一个 ,所以有时候我们将二者混
为一谈。
既然 能够自动完成垃圾回收的功能,那么是不是 程序员就可以认为
所开发的 应用不存内存泄露问题呢?答案是否定的。在某些情况下,处理
不妥当的代码仍然会导致内存泄露。如何才能避免内存泄露?应该说, 程序
员在清楚了解 垃圾回收的基本原理,并且高度重视内存泄露这个
问题才能有效避免内存泄露情况的发生。
垃圾回收机制
垃圾回收工作是由垃圾回收器()完成的。
垃圾回收器是运行在后台的一个进程,它释放那些不再被应用所使用对象所占
用的内存。不再被应用所使用的对象是指那些不再会被那些活动着(工作着)
的对象所“引用”的对象。在 中,对于非基本类型(
)的对象,在对象之间传递的都是对象引用,而不是对象本
身。删除一个变量只是删除了对象的引用,而不是删除对象本身。一个对象可
以被多处引用,通过这些不同的引用所操作的都是同一个对象。
通过以下两段代码可以了解基本类型和非基本类型对象的差异:
基本类型的值传递:
! "#$%&
'
(%)*&*+,,创建了一个新字符串 (,值为”&*
-%)(+,, 是基本类型,所以创建了一个新的字符串 -,-
的值拷贝自 (。
-.)*!*+,,改变 - 的值 ( 不会受影响。
#/(%*($+,,输出 &
#/-%*-$+,,输出 &!
(% )(00+,,创建一个新的 值为 (00。
-% )(+,, 是基本类型所以又创建一个新
-- 的值拷贝自 (。
-)-.(00+,,改变 - 对 ( 不会有任何影响。
#/(1($+,,输出 (00
#/-1-$+,,输出 -00
2
非基本类型对象的引用传递:
! "#$%&
'
,,创建一个新对象然后将其引用给变量a%
%34)'!%**2