内存泄漏

    本图代码截取自《Effective Java》:

    内存泄漏的地方在于pop弹出后,对象还是被引用了,GC不能清楚那些无用对象。

    改进:

<span style="font-family:Microsoft YaHei;font-size:18px;"> public Object pop() {
        if (size == 0) 
            throw new EmptyStackException();
        Object result = element[--size];
         element[size] = null ;  // 清除无用引用
         return result;
    }</span>
    

    这个问题的出现原因:Stack类管理自己的内存。一般来说,如果类自己管理内存,就要警惕内存泄漏。

     

    还有一个内存泄漏的地方,缓存。对象引用放入内存中, 很容易在没有作用后存在很长时间。 

    其中的一种解决方案:

    用WeakHashMap来代表缓存, 缓存外存在对缓存内对象引用, 则不清空缓存。  没有引用, 则缓存自动清空。


    我们来看下WeakHashMap的特性:

   

<span style="font-family:Microsoft YaHei;font-size:18px;">import java.util.WeakHashMap;


class Key {  
        String name;  
  
        public Key(String name) {  
                this.name = name;  
        }  
  
        public void finalize() {  
                System.out.println("Finalizing Key " + name);  
        }  
}  
  
class Value {  
        String value;  
  
        public Value(String value) {  
                this.value = value;  
        }  
  
        public void finalize(){  
                System.out.println("Finalizing Value " + value);  
        }  
  
}  
  
public class WeakHashMapTest {  
        public static void main(String[] args) throws Exception {  
                int size = 100;  

                Key[] keys = new Key[size]; 
                Value[] values = new Value[size];
                WeakHashMap<Key, Value> whm = new WeakHashMap<Key, Value>();  
  
                for(int i=0; i < size; i++) {  
                        Key k = new Key(Integer.toString(i));  
                        Value v = new Value(Integer.toString(i));  
                        if(i%2 == 0) {  
                            keys[i] = k;  
                            values[i] = v;    
                        }  
                        whm.put(k, v);
                        System.out.println("WeakHashMap Size:" + whm.size());
                }  
                System.out.println("=========================");
                System.gc();  
                // 对象被放置在一个F-Queue 的队列中,并由一个优先级较低的Finalizer 线程去执行
                // 优先级高线程让出线程资源给finalize()执行
                Thread.sleep(1000);    
        }  
}  </span>

输出结果:

 WeakHashMap Size:1
WeakHashMap Size:2
WeakHashMap Size:3
WeakHashMap Size:4
WeakHashMap Size:5
WeakHashMap Size:6
WeakHashMap Size:7
WeakHashMap Size:8
WeakHashMap Size:9
WeakHashMap Size:10
WeakHashMap Size:11
WeakHashMap Size:12
WeakHashMap Size:13
WeakHashMap Size:14
WeakHashMap Size:15
WeakHashMap Size:16
WeakHashMap Size:17
WeakHashMap Size:18
WeakHashMap Size:19
WeakHashMap Size:20
WeakHashMap Size:21
WeakHashMap Size:22
WeakHashMap Size:23
WeakHashMap Size:24
WeakHashMap Size:25
WeakHashMap Size:26
WeakHashMap Size:27
WeakHashMap Size:28
WeakHashMap Size:29
WeakHashMap Size:30
WeakHashMap Size:31
WeakHashMap Size:32
WeakHashMap Size:33
WeakHashMap Size:34
WeakHashMap Size:35
WeakHashMap Size:36
WeakHashMap Size:37
WeakHashMap Size:38
WeakHashMap Size:39
WeakHashMap Size:40
WeakHashMap Size:41
WeakHashMap Size:42
WeakHashMap Size:43
WeakHashMap Size:44
WeakHashMap Size:45
WeakHashMap Size:46
WeakHashMap Size:47
WeakHashMap Size:48
WeakHashMap Size:49
WeakHashMap Size:50
WeakHashMap Size:51
WeakHashMap Size:52
WeakHashMap Size:53
WeakHashMap Size:54
WeakHashMap Size:55
WeakHashMap Size:56
WeakHashMap Size:57
WeakHashMap Size:58
WeakHashMap Size:59
WeakHashMap Size:60
WeakHashMap Size:61
WeakHashMap Size:62
WeakHashMap Size:63
WeakHashMap Size:64
WeakHashMap Size:65
WeakHashMap Size:66
WeakHashMap Size:67
WeakHashMap Size:68
WeakHashMap Size:69
WeakHashMap Size:70
WeakHashMap Size:71
WeakHashMap Size:72
WeakHashMap Size:73
WeakHashMap Size:74
WeakHashMap Size:75
WeakHashMap Size:76
WeakHashMap Size:77
WeakHashMap Size:78
WeakHashMap Size:79
WeakHashMap Size:80
WeakHashMap Size:81
WeakHashMap Size:82
WeakHashMap Size:83
WeakHashMap Size:84
WeakHashMap Size:85
WeakHashMap Size:86
WeakHashMap Size:87
WeakHashMap Size:88
WeakHashMap Size:89
WeakHashMap Size:90
WeakHashMap Size:91
WeakHashMap Size:92
WeakHashMap Size:93
WeakHashMap Size:94
WeakHashMap Size:95
WeakHashMap Size:96
WeakHashMap Size:97
WeakHashMap Size:98
WeakHashMap Size:99
WeakHashMap Size:100
=========================
Finalizing Key 99
Finalizing Key 97
Finalizing Key 95
Finalizing Key 93
Finalizing Key 91
Finalizing Key 89
Finalizing Key 87
Finalizing Key 85
Finalizing Key 83
Finalizing Key 81
Finalizing Key 79
Finalizing Key 77
Finalizing Key 75
Finalizing Key 73
Finalizing Key 71
Finalizing Key 69
Finalizing Key 67
Finalizing Key 65
Finalizing Key 63
Finalizing Key 61
Finalizing Key 59
Finalizing Key 57
Finalizing Key 55
Finalizing Key 53
Finalizing Key 51
Finalizing Key 49
Finalizing Key 47
Finalizing Key 45
Finalizing Key 43
Finalizing Key 41
Finalizing Key 39
Finalizing Key 37
Finalizing Key 35
Finalizing Key 33
Finalizing Key 31
Finalizing Key 29
Finalizing Key 27
Finalizing Key 25
Finalizing Key 23
Finalizing Key 21
Finalizing Key 19
Finalizing Key 17
Finalizing Key 15
Finalizing Key 13
Finalizing Key 11
Finalizing Key 9
Finalizing Key 7
Finalizing Key 5
Finalizing Key 3
Finalizing Key 1  


可以看出来, WeakHashMap 的大小是不断减少的, 因为被GC随机(除了能被2整除的Key被其他对象引用外)回收了。   


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值