zoukankan      html  css  js  c++  java
  • [Effective Java 读书笔记] 第二章 创建和销毁对象 第六-七条

    第六条 消除过期引用

      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即可

  • 相关阅读:
    Netty之ProtoBuf(六)
    Netty对WebSocket的支持(五)
    Netty之心跳检测技术(四)
    Netty之多用户的聊天室(三)
    Docker Compose 笔记
    vue.js学习笔记
    powerdesigner 生成C#code 实体 模板设备
    .net 接收post 的参数 加载xml
    powerdesigner 生成实体代码 附加生成xml
    PostgreSql 获取所有的表、视图、字段、 主键
  • 原文地址:https://www.cnblogs.com/jiangz222/p/4758959.html
Copyright © 2011-2022 走看看