`
TonyLian
  • 浏览: 403275 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

【第5条】消除过期的对象引用

阅读更多

    我们喜爱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

 

分享到:
评论

相关推荐

    effectice_java第二版 英文

    6. **条目6:消除过期的对象引用(Eliminate Unused Object References)** 过期的对象引用可能导致内存泄漏,确保及时释放不再使用的对象。 7. **条目7:覆盖equals时总要覆盖hashCode(Override equals() and ...

    Quest JProbe教程:Java内存分析示例(节选)

    ###### 第5步:使用改进的代码运行内存泄漏会话 - 根据之前的分析结果修改代码,以消除内存泄漏。 - 重新运行内存泄漏会话,验证修改是否有效。 #### 四、总结 通过本文档的学习,开发者不仅能够了解如何使用JProbe...

    oracle.pdf

    - **第二范式 (2NF)**:在满足 1NF 的基础上,消除部分依赖。 - **第三范式 (3NF)**:在满足 2NF 的基础上,消除传递依赖。 #### 二十六、数据库设计工具 - **ER 图**:实体关系图用于描述数据模型。 - **数据流图 ...

    2021-2022计算机二级等级考试试题及答案No.1341.docx

    #### 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=...

    JAVA核心知识点整理(有效)

    引用计数法............................................................................................................................................... 26 2.4.1.2. 可达性分析..........................

Global site tag (gtag.js) - Google Analytics