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触发限制都会改变?
原因是代码编译后的优化算法。在第一种情况下,因为你每次都创建一个 double 而不保留它的记录。这将使程序不断使用 GC。因此,编译器会优化代码,从而减少使用的内存。空循环是一种特殊情况,因为许多程序员使用它来使线程等待。所以编译器不会尝试优化它。
| 归档时间: |
|
| 查看次数: |
221 次 |
| 最近记录: |