Java 创建大量的类放到集合中,清空集合,内存未被回收

背景:我在做一个数据的解析,会创建大量的类,里面会有长字符串和数组。我会把这些类存到数组,集合和HashMap中。

问题:解析完成后我会清空这些数组集合,但是内存并没有下降。导致多个数据进来,内存持续上涨。我试着在清空数组集合后,调用System.GC或者Runtime的GC,但是没有用。

期望目标:清空数组后内存回落

以下是模拟程序

class mTest{
    private double[] m_dMatArray = new double[]{
            1.0, 0.0, 0.0, 0.0,
            0.0, 1.0, 0.0, 0.0,
            0.0, 0.0, 1.0, 0.0,
            0.0, 0.0, 0.0, 1.0};

    private String t0 = "F:\\test\\test_Trunk\\Objects_Java\\com.test.modelConvert.threeddesigner.citygmlconvertor\\src\\main\\java\\com\\test\\modelConvert\\threeddesigner\\citygmlconvertor";
    private String t1 = "F:\\test\\test_Trunk\\Objects_Java\\com.test.modelConvert.threeddesigner.citygmlconvertor\\src\\main\\java\\com\\test\\modelConvert\\threeddesigner\\citygmlconvertor";

    public void clear(){
        m_dMatArray = null;
        t0 = null;
        t1 = null;
    }
}
// 内存测试
public class memoryTest {
    public static void main(String[] args) {
        System.out.println("1");
//        testMat();
        testHashMap();
        System.out.println("2");
//        Runtime.getRuntime().gc();
        try {
            Thread.sleep(100000000);
        } catch (Exception e) {}
    }
    public static void testArraylist(){
        ArrayList<mTest> mat = new ArrayList<>();
        for (int i = 0; i < 1000000; i++) {
            mTest m = new mTest();
            mat.add(m);
        }
        mat.clear();
    }
    public static void testArray(){
        mTest[] mat = new mTest[1000000];
        for (int i = 0; i < 1000000; i++) {
            mTest m = new mTest();
            mat[i] = m;
        }
        for (int i = 0; i < mat.length; i++) {
            mat[i].clear();
            mat[i] = null;
        }
        mat = null;
    }
    public static void testHashMap(){
        HashMap<String, mTest> map = new HashMap<>();
        for (int i = 0; i < 100000; i++) {
            mTest matrix = new mTest();
            map.put("i" + i, matrix);
        }
        map.clear();
    }
}

内存的测试结论:清空数组或者集合后,内存占用:
数组:216M
集合:209M
HashMap:36M
如果不添加到数组集合,只是在循环中创建类实例,最终内存只涨了4M
请问有没有什么方法使内存占用降下来

gc
讨论数量: 1

file
对象s从线程栈打断指针后应该可以被回收。
尝试手动触发GC。

3个月前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!