Java(TM) 编程语言的一个真正强无力的特征是它的内存管理机制。Java虚拟机依据 new 操作符的请求动态地为对象在堆中分配空间。
其他语言将释放对象的重担都放到了顺序员身上,当对象不再使用时,顺序员通过 delete 这样的操作符或者是 free()这样的库函数来释放对象。而Java编程语言不为顺序员提供这样的功用,因为Java运转环境会自动发出那些没有援用与之相连的对象所占的内存。这种内存回收的进程就叫 渣滓回收。
渣滓回收包括:(1) 为每一个对象保管与之相连的一切援用的数目;(2) 定期回收那些援用数目为零的对象所占的内存。渣滓回收是一个新鲜的计算技术,在一些计算机语言和文本编辑器这样的环境中都用到过这中技术。
请看下面的办法:
...
void aMethod() {
Dog dog = new Dog();
// do something with the instance dog
...
}
...
dog 是办法 aMethod() 中的一个部分变量,在办法调用时自动分配了内存。new 创建了 Dog 的一个实例,其内存地址存放在 dog 中,对它的援用的数目添加到 1。当此办法完成/返回时,援用变量 dog 就不再在其作用范围内,对其的援用数目减为 0。此时,Dog 实例就要被渣滓回收器回收。
下面,看看这段代码:
...
while (true)
Dog dog = new Dog();
...
上述代码中,while 循环(一直进行)的每一轮都为Dog 的一个新实例分配空间,将其援用存放在 dog 中并替换掉在上一轮循环中放入的对 Dog 实例的援用。此时,后面分配的实例就成了渣滓回收的对象。
渣滓回收器自动定期执行。任何时候你都可以手动通过 System.gc() 调用渣滓回收器。文章由
歌瑞尔整理,收集辛苦,希望能保留出处,谢谢斑竹大哥。