首页
学习
活动
专区
圈层
工具
发布

了解JVM
EN

Stack Overflow用户
提问于 2013-02-20 16:56:54
回答 4查看 155关注 0票数 0

我正在试着理解我下面写的代码是如何工作和输出的。

代码语言:javascript
复制
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));

}

当我运行这段代码时,它总是给我132KB作为输出(9/10运行)。然而,如果我删除了rt.gc()调用,我会在输出语句中获得更多的内存释放(>100MB)。我如何理解Java运行时的这种行为?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-02-20 17:10:08

我不完全确定你在尝试什么。

此外,您放入for循环的列表中的整数不符合垃圾收集的条件,因为它们是由活动对象(即列表)引用的。我不确定什么是垃圾收集,因为我看不到你程序的其余部分,但你应该修改你的测试,在垃圾收集的点上,你拥有的对象不是被活动对象引用的。

票数 2
EN

Stack Overflow用户

发布于 2013-02-20 17:13:02

您应该只比较rt.gc()之前和之后的rt.freeMemory()。您的表达式打印已使用的内存。这就是为什么这些值与您的预期相反的原因。

票数 2
EN

Stack Overflow用户

发布于 2013-02-20 17:05:46

这里的垃圾收集不会真正删除任何东西,因为您没有任何真正超出作用域的对象。该方法确定两个列表的作用域,以便在垃圾收集调用后仍可访问它们。在java中,垃圾收集通常是一个调度任务,所以理论上它可以在任何时候运行。这意味着这里的行为实际上是好的,因为你不希望垃圾回收破坏仍然在作用域中的对象(就像你在这里所做的那样)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14975723

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档