首页 > 代码库 > WeakHashMap回收时机

WeakHashMap回收时机

import java.util.ArrayList;import java.util.List;import java.util.WeakHashMap;public class TestWeakHashMap {    public static void main(String[] args) throws Exception {//        createDoNothing();        createSomething();    }    /**     * 由于Java内存是64M~256M不等,所以再不改变内存参数的情况下,该测试跑一段后就内存溢出了。果不其然,WeakHashMap这个时候并没有自动帮我们释放不用的内存。     */    private static void createDoNothing() {        List<WeakHashMap<byte[][], byte[][]>> maps = new ArrayList<WeakHashMap<byte[][], byte[][]>>();        for (int i = 0; i < 1000; i++) {            WeakHashMap<byte[][], byte[][]> d = new WeakHashMap<byte[][], byte[][]>();            d.put(new byte[1000][1000], new byte[1000][1000]);            maps.add(d);            System.gc();            System.err.println(i);        }    }        /**     * 总结来说:WeakHashMap并不是你啥也干他就能自动释放内部不用的对象的,而是在你访问它的内容的时候释放内部不用的对象。这两句话看似区别不大,但是有时候一个小小的区别就会要了命的。     */    private static void createSomething() {        List<WeakHashMap<byte[][], byte[][]>> maps = new ArrayList<WeakHashMap<byte[][], byte[][]>>();        for (int i = 0; i < 1000; i++) {            WeakHashMap<byte[][], byte[][]> d = new WeakHashMap<byte[][], byte[][]>();            d.put(new byte[1000][1000], new byte[1000][1000]);            maps.add(d);            System.gc();            System.err.println(i);                        for (int j = 0; j < i; j++) {                  System.err.println(j+  " size" + maps.get(j).size());              }        }    }}

 

WeakHashMap回收时机