我正在尝试找到我们拥有的Web应用程序的最佳内存设置。此应用程序需要检索大型数据集并导致高内存使用率。
我写了一个小程序来测试JVM内存设置,这段代码基本上是用虚拟对象来淹没内存。
import java.io.FileNotFoundException;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
class Dummy{
public final long v1 = 132132343243245L;
public final long v2 = 132132343243245L;
public final long v3 = 132132343243245L;
public final long v4 = 132132343243245L;
}
public class MemoryTest {
public static void main(String[] args){
FileWriter fw = null;
long start = System.currentTimeMillis();
try{
fw = new FileWriter("out.txt");
ArrayList<Dummy> alDummies = new ArrayList<Dummy>();
for(int i =0 ; i < 1000; i++){
long begin = System.currentTimeMillis();
for(int j=0; j< 10000; j++){
alDummies.add(new Dummy());
}
long end = System.currentTimeMillis();
fw.write(Long.toString(end-begin) + "\n");
}
} catch(FileNotFoundException e){
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
if(fw != null)
try {
long finish = System.currentTimeMillis();
fw.write("Total: " + Long.toString(finish-start));
fw.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
当我使用各种内存设置运行代码时发生这种情况。
-Xms512M -Xmx512M: Errors out with insufficient memory.
-Xms768M -Xmx768M: Took total time of ~3300ms
-Xms1G -Xmx1G: Took total time of ~450ms
-Xms2G -Xmx2G: Took total time of ~500ms
所有这些都是平均10次运行。
我可以理解从768M到1G的性能提升,我猜JVM必须减少内存页面的移动。
但是我不明白从1G到2G的性能下降,为什么内存量越大表现越慢?
我不知道是否重要我正在使用带有16G内存和2.7 GHz Intel Core i7的mac pro