Android 编码规范:(六)消除过期的对象引用

尽管Java不像C/C++那样需要手工管理内存资源,而是通过更为方便、更为智能的垃圾回收机制来帮助开发者清理过期的资源。即便如此,内存泄露问题仍然会发生在你的程序中,只是和C/C++相比,Java中内存泄露更加隐匿,更加难以发现,见如下代码:

[java] view plaincopy
  1. // Can you spot the "memory leak"?  
  2.   
  3. import java.util.*;  
  4.   
  5. public class Stack {  
  6.     private Object[] elements;  
  7.     private int size = 0;  
  8.     private static final int DEFAULT_INITIAL_CAPACITY = 16;  
  9.   
  10.     public Stack() {  
  11.         elements = new Object[DEFAULT_INITIAL_CAPACITY];  
  12.     }  
  13.   
  14.     public void push(Object e) {  
  15.         ensureCapacity();  
  16.         elements[size++] = e;  
  17.     }  
  18.   
  19.     public Object pop() {  
  20.         if (size == 0)  
  21.             throw new EmptyStackException();  
  22.         return elements[--size];  
  23.     }  
  24.   
  25.     /** 
  26.      * Ensure space for at least one more element, roughly 
  27.      * doubling the capacity each time the array needs to grow. 
  28.      */  
  29.     private void ensureCapacity() {  
  30.         if (elements.length == size)  
  31.             elements = Arrays.copyOf(elements, 2 * size + 1);  
  32.     }  
  33. }  
以上示例代码,在正常的使用中不会产生任何逻辑问题,然而随着程序运行时间不断加长,内存泄露造成的副作用将会慢慢的显现出来,如磁盘页交换、OutOfMemoryError等。那么内存泄露隐藏在程序中的什么地方呢?当我们调用pop方法是,该方法将返回当前栈顶的elements,同时将该栈的活动区间(size)减一,然而此时被弹出的Object仍然保持至少两处引用,一个是返回的对象,另一个则是该返回对象在elements数组中原有栈顶位置的引用。这样即便外部对象在使用之后不再引用该Object,那么它仍然不会被垃圾收集器释放,久而久之导致了更多类似对象的内存泄露。修改方式如下:
[java] view plaincopy
  1. public Object pop() {    
  2.     if (size == 0)     
  3.         throw new EmptyStackException();    
  4.     Object result = elements[--size];    
  5.     elements[size] = null;  
  6.     return result;    
  7. }   

由于现有的Java垃圾收集器已经足够只能和强大,因此没有必要对所有不在需要的对象执行obj = null的显示置空操作,这样反而会给程序代码的阅读带来不必要的麻烦,该条目只是推荐在以下3中情形下需要考虑资源手工处理问题:

1) 类是自己管理内存,如例子中的Stack类。

2) 使用对象缓存机制时,需要考虑被从缓存中换出的对象,或是长期不会被访问到的对象。

3) 事件监听器和相关回调。用户经常会在需要时显示的注册,然而却经常会忘记在不用的时候注销这些回调接口实现类。


转载于:https://www.cnblogs.com/springside-example/archive/2012/05/29/2530079.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/422455.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

android 歌曲剪辑 原理,在Android上,我该如何制作怪异的剪辑区域?

Path path new Path();path.addCircle(200,200,100,Direction.CW);c.clipPath(path); // c is a Canvas现在有上防止绘制圆的边界之外的任何画布剪切区域。但是,如果我想让裁剪区域的形状像甜甜圈(或其他)呢?我试着玩弄创建第二个路径并在其上使用toggl…

初始化toolstrip

/// <summary>/// 初始化工具条/// </summary>private void InitializeToolbar(){Image img global::Win.Properties.Resources.mainfram;//240 15int heigh 15;int width 16;for (int i 0; i < 15; i){Bitmap bitmap new Bitmap(16, 15, System.Drawing.I…

html 鼠标图标做成动画效果,纯css3实现的鼠标悬停动画按钮

今天给大家带来一款纯css3实现的鼠标悬停动画按钮。这款按钮鼠标经过前以正方形的形式&#xff0c;当鼠标经过的时候以动画的形式变成圆形。效果图如下&#xff1a;实现的代码。html代码&#xff1a;复制代码代码如下:css3代码&#xff1a;复制代码代码如下:body{background-co…

联想乐Pad_A1获取root权限

1、下载root包&#xff1a;参考http://bbs.anzhi.com/thread-4786308-1-1.html 里面的root包&#xff0c;共两个&#xff0c;到电脑。2、将tf卡&#xff0c;置入平板电脑&#xff0c;通过大存储方式连接电脑&#xff0c;以fat或者fat32方式将tf卡格式化&#xff0c;然后将下载的…

html表单不允许修改,[问题]如何在表单里定义(form)仅仅可读,不可修改的列?

经过我不懈努力的寻找及测试&#xff0c;现在有一个解决方案可以解决typeform表单里设置只读字段。只需要覆写columns中的renderFormItem字段即可。下面以设置用户名只读为例&#xff1a;pro-table版本&#xff1a;"ant-design/pro-table": "^2.9.16"colum…

ASP.NET多线程编程(一) 收藏

Thread的使用using System;using System.Threading;public class ThreadExample {public static void ThreadProc() {for (int i 0; i < 10; i) {Console.WriteLine("ThreadProc: {0}", i);Thread.Sleep(0);}}public static void Main() {Console.WriteLine(&quo…

html如何查看文档,查看文档

设计步骤(返回正文)一、绘制表格1、在手动设计Html模板之前&#xff0c;我们先需要一个模板的样式&#xff0c;这个样式我们可以拿原来的纸质的样式&#xff0c;也可以在Excel表格中画一个样式&#xff0c;如图1所示&#xff0c;我们后面的设计都要根据这个表格来进行设计。图1…

父亲的忠告:把孩子培养成普通人

现在你用不到&#xff0c;将来你肯定用的到。你一定会做个好爸爸。 转自&#xff1a;http://luo.bo/25512/转载于:https://www.cnblogs.com/webcc/archive/2012/06/01/2531207.html

U盘装XP系统(含截图,2012最新原创超简单方法)

U盘装XP系统(含截图&#xff0c;2012最新原创超简单方法)首先准备好3样必备东西 1.U盘2.XP系统&#xff08;推荐GhostXP SP3 2012统一论坛最新版&#xff1b;迅雷快传下载地址&#xff1a;http://kuai.xunlei.com/d/BMLHLZHXVGKT&#xff09;3.制作U盘WINPE软件(推荐UltraISO&a…

2021年峰峰春晖中学高考成绩查询,峰峰春晖中学2019年录取分数线

技校网专门为您推荐的类似问题答案问题1&#xff1a;河北丰润车轴山中学2011年录取分数线按学校名次录取问题2&#xff1a;广州美术中学2011年中考录取分数线提前批优先线为693分&#xff0c;比往年略高。公费线640分&#xff0c;择校、民办线为620分。问题3&#xff1a;2009年…

推到重做

自己做到太差了&#xff0c;完全是在1.16的基础上进行了少量的修改&#xff0c;和自己当初的想法完全不一样&#xff0c;推到重新做&#xff01;&#xff01;&#xff01; 先找下思路&#xff0c;复习下自己的系统以及uboot烧写过程。 自带Uboot烧写过程 硬件检测结果&#xff…

广东省2021年普通高考成绩复查结果查询,广东省2021年普通高考英语听说考试成绩可以查询啦!...

广东省2021年普通高考英语听说考试评卷工作已经结束。现将考试成绩发布的有关事项通知如下。一、考试成绩发布广东省2021年普通高考英语听说考试成绩将于4月28日统一发布。高考英语听说考试成绩按考生卷面成绩(满分60分)3&#xff0c;四舍五入取整数后计得。英语听说考试成绩与…

c#完美截断字符串(中文+非中文)

public static string Truncation(this HtmlHelper htmlHelper, string str, int len){if (str null || str.Length 0 || len < 0){return string.Empty;}int l str.Length;#region 计算长度int clen 0;while (clen < len && clen < l){//每遇到一个中文&…

2021辽宁大洼高中高考成绩查询,2021大洼高中最后一跑——励志高考,逆袭人生...

六月的天&#xff0c;湛蓝六月的风&#xff0c;不燥六月的日子&#xff0c;激情四溢六月里的故事&#xff0c;总是以青春为主题六月里的大洼高中高三学子们迎来了人生重要的里程碑——高考2021年6月5日&#xff0c;是大洼高中高三学子们热情饱满准备出征高考、逆袭人生的日子。…

jQuery ajax 和 普通js ajax 笔记

首先引用 两个js 文件 1 <script src"js/jquery-1.7.1.js" type"text/javascript"></script> 2 <script src"js/Common.js" type"text/javascript"></script> html 代码&#xff1a; 1 <body> 2 …

html 在手机上运行,怎么在手机上打开HTML

回答&#xff1a;一1、我们打开XMind软件2、点击插入----超链接3、我们输入我们的网址二使用二&#xff1a;XMind如何分享&#xff0c;XMind提供非常强大的共享功能&#xff0c;而且在不断完善&#xff0c;那么大家知道XMind如何分享吗&#xff1f;其实操作还是简单的。1、我们…

attribute 扩展

今天参考json-c的源码 读到一个关于attribute 扩展 static void json_object_init(void) __attribute__ ((constructor)); static void json_object_fini(void) __attribute__ ((destructor)); google到含义如下 void main_enter() __attribute__((constructor));//main_enter函…

计算机等级的有关知识,计算机等级二级基础知识.doc

计算机等级二级基础知识认真复习&#xff0c;努力冲刺&#xff0c;成功通过&#xff01;计算机基础知识教材张福炎孙志挥主编的南京大学出版社《大学计算机信息技术教程》。考题都是以单项选择题形式出现命题的基本考虑以常识性、实用性知识为主以知识点为单元进行考核基础部分…