问题的引出

这段程序有一个“内存泄露”,随着GC活动的增加,或者由于内存占用的不断增加,程序性能降低会逐渐表现出来。在极端的情况下,这种内存泄露会导致磁盘交换,甚至导致程序失败(OutOfMemoryError),但是这种失败情况相对比较少见。

  内存泄露的地方:一个栈先是增长,然后再收缩,那么,从栈中弹出来的对象将不会被当做垃圾回收,即使使用栈的程序不再引用这些对象,它们也不会被回收。

  栈内部维护着对这些对象的过期引用(永远也不会再被解除的引用)。

elements数组中下标小于size的那些元素都是过期的。

无意识的对象保持导致的问题

在支持垃圾回收的语言中,内存泄露是很隐蔽的,无意识的对象保持。

一个对象引用被无意识地保留起来,那么,GC不仅不会处理这个对象,而且也不会处理这个对象所引用的所有其他对象,因此有可能会对性能造成潜在的重大影响。

无意识的对象保持修复方法

  一旦对象引用已经过期,只需清空这些引用即可。

清空过期引用的另一个好处是,如果它们以后又被错误地解除引用,程序会立即抛出NullPointerException异常,而不是悄悄地错误运行下去。

  清空对象引用应该是一种例外,而不是一种规范行为

  清除过期引用最好的办法是让包含该引用的变量结束其生命周期。

清空引用的时机

Stack类自己管理内存。存储池包含了elements数组的元素。数组活动区域中的元素是已分配的,而数组其余部分的元素则是自由的。但是GC并不知道这一点;对于GC而言,elements数组中的所有对象引用都同等有效。只有程序员知道数组的非活动部分是不重要的。程序员可以把这个情况告知GC:一旦数组元素变成了非活动部分的一部分,程序员就手工清空这些数组元素。

  只要类是自己管理内存,程序员就应该警惕内存泄露问题。一旦元素被释放掉,则该元素中包含的任何对象引用都应该被清空。

内存泄露的另一个常见来源是缓存

只要在缓存之外存在对某个项的键的引用,该项就有意义,那么就可以用WeakHashMap代表缓存;当缓存中的项过期之后,它们就会自动被删除。记住只有当所要的缓存项的生命周期是由该键的外部引用而不是由值决定时,才有用处。

  "缓存项的生命周期是否有意义"并不是很容易确定,随着时间的推移,其中的项会变得越来越没有价值。在这种情况下,缓存应该时不时地清理掉没用的项。这项清除工作可以由一个后台线程来完成,或在给缓存添加新条目的时候顺便进行清理。

LinkedHashMap类可以使用removeEldestEntry()实现在给缓存添加新条目的时候进行清理。

对于更复杂的缓存,必须直接使用java.lang.ref。

内存泄露的第三个常见的来源是监听器和其他回调。

客户端在API中注册回调,却没有显示地取消注册。

确保回调立即被当做垃圾回收的最佳方法是只保存它们的弱引用,例如,只将它们保存成中的键。

 为了让学习变得轻松、高效,今天给大家免费分享一套Java教学资源。帮助大家在成为Java架构师的道路上披荆斩棘。需要资料的欢迎加入学习交流群:9285,05736

高效Java第六条消除过期的对象引用无意识的对象保持相关推荐

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

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

  2. Effective Java学习笔记之第6条 消除过期的引用对象

    第6条 消除过期的引用对象 所谓过期引用是指永远也不会再被解除的引用. 一旦对象引用已经过期,只需清空这些引用即可. public Object pop() { if (size == 0) { th ...

  3. WeakHashMap 消除过期的对象引用 避免内存泄漏

    WeakHashMap 消除过期的对象引用 避免OOM内存泄漏 自己管理的内存(数组长度减小后,pop出的对象容易导致内存泄漏) 缓存 监听和回调 自己管理的内存 public class Stack ...

  4. java 取消引用_java代码优化——消除过期的对象引用

    很多人可能在想这么一个问题:Java有垃圾回收机制,那么还存在内存泄露吗?答案是肯定的,所谓的垃圾回收GC会自动管理内存的回收,而不需要程序员每次都手动释放内存,但是如果存在大量的临时对象在不需要使用 ...

  5. effectiveJava(5)消除过期的对象引用

    过期引用:永远也不会再被解除的引用. 内存泄漏常见来源: 一.类自己管理内存时,程序员应该警惕内存泄漏问题.一旦元素被释放掉,则该元素中包含的任何对象引用都应该被清空. 二.缓存.一旦对象引用放到缓存 ...

  6. Java中用一条语句把基础类型(int)数组转为对象数组(Integer),或者变为List

    //不多说直接上代码int[] a={1,3,4};/**下面是将基本数组转化为对象数组*/ Integer[] ib= IntStream.of(a).boxed().collect(Collect ...

  7. ai人工智能的数据服务_从AI数据集中消除无意识的偏见

    ai人工智能的数据服务 当人工智能的失败犯下愚蠢的错误(如这张愚蠢的照片)时,通常会引起很多笑声. 但是,"问题在于机器学习失常并不总是很有趣--当用于训练这些机器学习算法的数据集不够多样化 ...

  8. java延迟覆盖_高效Java第九条覆盖equals时总要覆盖hashCode

    原标题:高效Java第九条覆盖equals时总要覆盖hashCode 高效Java第九条覆盖equals时总要覆盖hashCode 在每个覆盖了equals方法的类中,也必须覆盖hashCode方法. ...

  9. java 三维数组长方体求体积_已知任意一个四面体的六条棱长,如何求出其体积?...

    如果现在有一个任意形状的四面体,我们只知道它的六条棱长,那我们该如何确定它的体积呢?这就是著名的 四面体问题了,在解决这个问题之前,我们先来学习一点预备知识. 棱锥的体积 由于正四面体是一个棱锥,所以 ...

最新文章

  1. Netweaver工作进程的内存限制 VS CloudFoundry应用的内存限制
  2. JVM内存GC的骗局
  3. python显示图像某列的颜色值_Python Pandas Matplotlib图由单列中定义的类型值着色
  4. 西门子Mendix发低代码最新报告趋势:客户体验先行、智能化和全渠道化
  5. pwn环境搭建_pwndbg、pwntools环境搭建(Unix系统)
  6. js 根据固定位置获取经纬度--腾讯地图
  7. 大话图像处理之入门篇
  8. react项目开发问题整理
  9. linux运维常见网络协议含义及端口
  10. python 去掉字符串第一个字符_10 个 Python 字符串处理技巧
  11. 黑龙江伊春现受伤雄性东北虎 目前已被成功救治
  12. Android麦克风探测器
  13. processing实现图像碎片化
  14. centos系统安装教程
  15. Go语言6种字符串拼接的方式
  16. 宝宝专业智力测试软件,希-内学习能力测验软件 - 智力评估软件 - 唯普诺心理,心理测评系统,心理测评软件,婴幼儿智能发育,心理软件...
  17. 通灵学院|游戏设计研习6:制作谜题的原则★(1800字)
  18. 日常生活中,你都是如何记账的
  19. python自助电影售票机_2019-03-20_面向对象_模拟电影院自动售票机选票[Python练习题]...
  20. [1007]魔法少女小Scarlet

热门文章

  1. PowerDesigner11技巧
  2. 03_MySQL多表事务课堂笔记
  3. 数据库高级知识——索引优化分析(二)
  4. TCP的拥塞控制机制
  5. 【剑指offer】面试题23:链表中环的入口节点
  6. )类 新建javafx程序时_第三章 第一个OpenCV的JavaFX应用程序.md
  7. 怎么把python模型部署到线上_如何将机器学习模型成功部署到.Net环境中
  8. VC++6.0怎么打开工程
  9. 爬虫:突破有道翻译js加密(最新)
  10. 数据结构之字典序全排列