【发布时间】:2014-08-20 10:57:52
【问题描述】:
我正在阅读有关 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);
}
}
}
}
JVisualVM 显示了一个平坦的内存消耗图:
但是当我们运行下面的代码时,
public class test {
public static void main(String a[]){
for(int i=0;i<1000000;i++){
for(int j=0;j<100000;j++){
}
}
}
}
JVisualVM 呈现锯齿:
为什么会这样? 两种情况下如何以及为何更改 gc 触发限制?
【问题讨论】:
-
我认为空循环需要更多的处理器。所以 GC 没有机会运行。
-
Java 的哪个版本?什么参数?空循环的第二次测试应该工作 0 秒,因为 java 运行空循环并不是那么愚蠢。
-
@Andremoniy - 没有。java 可以运行空循环(即使在引入逃逸分析之后,即在 jdk6U23 之后)
-
我必须说,这是一个很好的问题,用一个简单的例子证明在进行性能测试时不做任何假设是多么重要。我们可以得到你正在阅读这篇文章的来源吗?是 Oracle 性能调优文章还是一本书?
标签: java memory-management jvm