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
请问有没有什么方法使内存占用降下来
对象s从线程栈打断指针后应该可以被回收。
尝试手动触发GC。