我们喜爱Java的其中一个原因就是它的垃圾回收机制。绝大部分情况下,JVM都能过自动回收垃圾。
但是,在有些情形下,你还是要自己回收垃圾的,这些情形多是JVM无从通过“物理”性质来识别垃圾,而需要程序员通过“逻辑”性来判断哪些是垃圾并回收之。
所以,在支持垃圾回收的语言中,内存泄漏更应该被称之为“无意识的对象保持”。
例子:我们有两个String数组: a[100] 和 b[1000]。
现在要将a的所有元素拷贝给b(由于元素是String,所以写法和仅仅赋地址看起来是一样的),前提:不能改变b的地址,也就是不能new它(可能其它地方还保留着b的地址而且要用的着)
for (int i=0;i<a.lenght;i++){
b[i] = a[i];
}
完了吗?如果你认为工作完了,那么b[100]~b[999]就成了未被回收的垃圾,或称为未被释放的垃圾、无意被保留下来的垃圾。由于b整个数组的地址指针还在(没有改变地址),所以JVM是不会回收b中的任何一个元素的,JVM也不知道你的用意是用a来代替b,还是只更新b的前100个元素。
如果你的用意确实是前者的话,那么加上下面的代码吧:
for(int i=a.length; i<b.length; i++){
b[i] = null;
}
书上举的Stack的例子也是不错的,而且比起我这个例子来,Bug更不容易被意识到。再好好看一遍吧。
【Effective Java 学习笔记】系列连载专题请见:
http://tonylian.iteye.com/categories/64208
分享到:
相关推荐
6. **条目6:消除过期的对象引用(Eliminate Unused Object References)** 过期的对象引用可能导致内存泄漏,确保及时释放不再使用的对象。 7. **条目7:覆盖equals时总要覆盖hashCode(Override equals() and ...
###### 第5步:使用改进的代码运行内存泄漏会话 - 根据之前的分析结果修改代码,以消除内存泄漏。 - 重新运行内存泄漏会话,验证修改是否有效。 #### 四、总结 通过本文档的学习,开发者不仅能够了解如何使用JProbe...
- **第二范式 (2NF)**:在满足 1NF 的基础上,消除部分依赖。 - **第三范式 (3NF)**:在满足 2NF 的基础上,消除传递依赖。 #### 二十六、数据库设计工具 - **ER 图**:实体关系图用于描述数据模型。 - **数据流图 ...
#### 5. C++目标文件的默认扩展名 - **知识点说明**:C++源程序编译后的目标文件默认扩展名为`.obj`。 - **实际应用**:在编译过程中,理解目标文件的作用及其文件扩展名对于后续的链接操作至关重要。 #### 6. 避免...
b+ v+ T d/ R在活动目录中每个对象都有一个标识名,标识名确定了对象所在的域和可以找到对象的完整路径。比如,典型的标识名包括: ) v( ^# h2 Q% P ) k( @' h3 e4 k* G+ s" i7 `CN=TOM,OU=Manager,DC=Tech,DC=...
引用计数法............................................................................................................................................... 26 2.4.1.2. 可达性分析..........................