我试图了解我下面编写的代码是如何工作和输出的。
public static void getRunTimeMemoryConsumption(){
List<Integer> array = new ArrayList<Integer>();
for(int i = 0 ; i < 100000 ; i++){
array.add(i);
}
List<Integer> array1 = new ArrayList<Integer>();
for(int i = 0 ; i < 100 ; i++){
array1.add(i);
}
Runtime rt = Runtime.getRuntime();
//Run the GC
rt.gc();
long memoryFreed = rt.totalMemory() - rt.freeMemory();
System.out.println("Memory freed in Mbytes :: " + memoryFreed/(1024));
}
当我运行此代码时,它总是为我提供 132 KB 作为输出(9/10 运行)。 但是,如果删除 rt.gc() 调用,我会在输出语句中释放更多内存 (>100 MB)。我如何理解 Java 运行时的这种行为?
最佳答案
我不完全确定您正在尝试什么。
您不是在计算释放了多少内存,而是在计算 rt.totalMemory() - rt.freeMemory()
,即使用了多少内存。考虑到这一点,您得到的结果很有意义,如果没有垃圾回收,则在 gc 之后会使用更多内存。要了解释放了多少内存,您应该比较 rt.totalMemory() - rt.freeMemory()
在调用垃圾收集器之前和之后。
此外,您放入 for 循环列表中的整数不符合垃圾回收条件,因为它们是 Activity 对象(即列表)的引用。不确定什么是垃圾收集,因为我没有看到程序的其余部分,但您应该以某种方式修改您的测试,以便在垃圾收集时您拥有不被 Activity 对象引用的对象。
关于java - 了解 JVM GC,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14975723/