在java中,空循环比非空循环消耗更多内存

buc*_*h11 6 java jvm memory-management

我正在阅读java性能调优并遇到了这个问题.

我们跑的时候

public class test {
public static void main(String a[]){
    for(int i=0;i<1000000;i++){
        for(int j=0;j<100000;j++){
            Double d = new Double(1.0);
        }
    }
}
}
Run Code Online (Sandbox Code Playgroud)

JVisualVM显示内存消耗图表:

在此输入图像描述

但是当我们运行下面的代码时,

public class test {
public static void main(String a[]){
    for(int i=0;i<1000000;i++){
        for(int j=0;j<100000;j++){
        }
    }
}
}
Run Code Online (Sandbox Code Playgroud)

JVisualVM呈现锯齿:

在此输入图像描述

为什么会这样?两种情况如何以及为什么gc触发限制都会改变?

naf*_*fas 1

原因是代码编译后的优化算法。在第一种情况下,因为你每次都创建一个 double 而不保留它的记录。这将使程序不断使用 GC。因此,编译器会优化代码,从而减少使用的内存。空循环是一种特殊情况,因为许多程序员使用它来使线程等待。所以编译器不会尝试优化它。