博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[Effective Java 读书笔记] 第二章 创建和销毁对象 第六-七条
阅读量:6707 次
发布时间:2019-06-25

本文共 811 字,大约阅读时间需要 2 分钟。

第六条 消除过期引用

  JAVA中依然会有 memory leak的,比如一个栈先增长再收缩,那么从栈中弹出的对象是不会被当做垃圾回收的,即时使用栈的程序不再引用这些对象。这是因为栈的内部维护着对这些对象的过期引用(永远也不会被解除的引用),需要显示的将这些对象清空(置为null),告诉垃圾回收器回收这些对象。

    比如Stack类的实现里,pop()函数最后会有对element置null的操作:

public synchronized E pop() {        E       obj;        int     len = size();        obj = peek();        removeElementAt(len - 1);        return obj;    }    public synchronized void removeElementAt(int index) {        ...........        ...........        elementData[elementCount] = null; /* to let gc do its work */    }

 

    除了栈上的内存泄露以外,还有缓存上的内存泄露,即把对象放缓存然后忘记;还有监听器和其他回调时,这个貌似不太严重。。。。

   第七条 避免使用终结方法(finalizer)

 总得来说finalizer是不可预测的,也是危险的,一般情况下不必要使用。

 它不能保证及时的被执行(finalizer线程优先级很低,可能等待处理的队列越来越多,但是它又不能执行处理动作),甚至不被执行,导致内存泄露。

   同时它本身的性能也不好

   直接使用显示终止方法,比如try finally即可

转载于:https://www.cnblogs.com/jiangz222/p/4758959.html

你可能感兴趣的文章
Multiverse in Doctor Strange // Multiverse在《神秘博士》
查看>>
ASP.NET MVC(Razor)上运用UEditor和xhEditor编辑器检测到有潜在危险的 Request.Form的真正解决办法...
查看>>
【T08】避免重新编写TCP
查看>>
android Fragment
查看>>
java 、Android 提交参数转码问题
查看>>
iOS UIScrollView 停止滑动 减速
查看>>
[Codility] CommonPrimeDivisors
查看>>
GIS API乱弹
查看>>
对https的理解
查看>>
七周七语言(6)
查看>>
解决delphi10.2.3 android tools闪退
查看>>
在ASP.NET Atlas中创建自定义的Action
查看>>
深度观察:腾讯收购大众点评背景下的O2O大格局
查看>>
LightOJ 1061 N Queen Again(记忆化搜索)
查看>>
互斥量和信号量的区别
查看>>
Csharp run sql script create database
查看>>
#pragma once 与 #ifndef 的区别解析
查看>>
How to check Ubuntu version
查看>>
php 解析xml 的四种方法(转)
查看>>
qt 试用 (3)配置编译源代码及调试
查看>>