过期的对象引用
消除过期的对象引用
修正前
public class Stack { public Object[] elements; public int size = 0; private static final int DEALULT_VLAUE = 16; public Stack() { elements = new Object[DEALULT_VLAUE]; } public void push(Object e) { ensureCapacity(); elements[size++] = e; } public Object pop() { if (size == 0) { throw new RuntimeException(); } return elements[--size]; } private void ensureCapacity() { if (elements.length == size) { elements = Arrays.copyOf(elements, 2 * size + 1); } } }
这段程序中并没有很明显的错误.无论如何测试,它都会成功通过每一项测试.
但是! 这段程序有一个"内存泄漏"
解析
// elements="Stack@539" Stack stack = new Stack(); // elements[0]="1" size=1 stack.push("1"); // elements[0]="1" elements[1]="2" size=2 stack.push("2"); // elements[0]="1" elements[1]="2" size=1 pop="2" Object pop = stack.pop(); // elements[0]="1" elements[1]="3" size=1 stack.push("3");
从上方可以看出如果pop后没有重新push那么elements对象还在引用已经删除的对象
内存泄漏-如果一个栈显示增长,然后再收缩,那么,从栈中弹出来的对象将不会被当做垃圾回收,即使使用的栈的程序不再引用这些对象,它们也不会被回收.这是因为,栈内部维护着对这些对象的过期引用.
过期引用-,是指永远也不会再被删除的引用.
修正后
public Object pop() { if (size == 0) { throw new RuntimeException(); } Object result = elements[--size]; elements[size] = null; return result; }
解析
// elements="Stack@539" Stack stack = new Stack(); // elements[0]="1" size=1 stack.push("1"); // elements[0]="1" elements[1]="2" size=2 stack.push("2"); // elements[0]="1" size=1 pop="2" Object pop = stack.pop(); // elements[0]="1" elements[1]="3" size=1 stack.push("3");
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
C# WPF 实现鼠标固定在指定范围内运动
原文: C# WPF 实现鼠标固定在指定范围内运动 一.背景: 需要实现带有三个屏幕,三个屏幕分别显示窗体,但鼠标只能在主窗体中运动,不能移动到其他的两个附屏中。 二.实现: 具体实现使用的是user32.dll下的GetWindowRect(inthwnd, refRECTlpRect)函数。 参考百度百科:https://baike.baidu.com/item/ClipCursor ClipCursor,函数名。该函数把鼠标限制在屏幕上的一个矩形区域内,如果调用SetCursor或用鼠标设置的一个随后的鼠标位置在该矩形区域的外面,则系统自动调整该位置以保持鼠标在矩形区域之内。 函数原型 BOOL ClipCursor(CONST RECT * lpRect); 参数 IpRect:指向RECT结构的指针,该结构包含限制矩形区域左上角和右下角的屏幕坐标,如果该指针为NULL(空),则鼠标可以在屏幕的任何区域移动。 返回值 如果成功,返回值非零;如果失败,返回值为零。若想获得更多错误信息,请调用GetLastError。 备注 1.光标是一个共享资源,如果一个应用控制了鼠标,在...
- 下一篇
入职三天,公司给了100块钱叫我走人
十月,金秋季节,本是丰收之时,却因为陆续有同事离职,心中多少有些悲凉之意,顿然想起从参加工作到现在,五年已过,当年青涩懵懂的小年轻,如今出街招摇过市时,被小孩子看到都会喊声大叔。回想这五年,有心酸和无奈、有快乐和期待、也有不断的蜕变和成长。趁着国庆长假,写下这一路的心路历程,于己,是一个总结和督促,于读者,是一个故事,兼听则明,希望对你们有些许启发,足矣。 1. 毕业=失业?有可能的 2013年6月底,虽然此前早已被某软(国内最大的软件开发商)的政府事业部录用并被寄以厚望要培养成核心人员,但出于对乡土的眷恋和对南方的热爱,还没领到毕业证的我,怀着极大的憧憬,拖着一个行李箱,兜里怀揣着几百块钱,坐了三十多个小时的绿皮从山东回到广州。 “初来乍到,请多多指教”,踏入广州那一刻,我满怀热情的对广州说。 本以为,作为985/211大学毕业的我,在国内最大的软件服务商被寄予厚望的我,在广州应该也是个热饽饽,不愁吃不愁穿不愁offer的。 然而现实是广州的公司对我并没有多多指教,而是多多抛弃。 到广州第二天,我就开始海投简历,可能是985的原因,我得到了不少的面试通知,忙的不亦乐乎,可结果却是事与...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
-
Docker使用Oracle官方镜像安装(12C,18C,19C)
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- CentOS8编译安装MySQL8.0.19
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- MySQL8.0.19开启GTID主从同步CentOS8
- CentOS7,8上快速安装Gitea,搭建Git服务器
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
推荐阅读
最新文章
- Windows10,CentOS7,CentOS8安装Nodejs环境
- CentOS8编译安装MySQL8.0.19
- CentOS6,CentOS7官方镜像安装Oracle11G
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- 设置Eclipse缩进为4个空格,增强代码规范
- CentOS7,8上快速安装Gitea,搭建Git服务器
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- CentOS7安装Docker,走上虚拟化容器引擎之路
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题