Java JVM内存设置影响
我正在尝试为我们拥有的web应用程序找出最佳内存设置。此应用程序需要检索大型数据集,导致内存使用率高 我写了一个小程序来测试JVM内存设置,这段代码基本上用虚拟对象来淹没内存Java JVM内存设置影响,java,performance,memory,memory-management,jvm,Java,Performance,Memory,Memory Management,Jvm,我正在尝试为我们拥有的web应用程序找出最佳内存设置。此应用程序需要检索大型数据集,导致内存使用率高 我写了一个小程序来测试JVM内存设置,这段代码基本上用虚拟对象来淹没内存 import java.io.FileNotFoundException; import java.io.FileWriter; import java.io.IOException; import java.util.ArrayList; class Dummy{ public final long v1 =
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();
}
}
}
}
所有这些平均为10次
我可以理解从768M到1G的性能改进,我猜JVM必须减少内存页移动
但是,我不理解性能从1G下降到2G的原因,为什么内存量越大,性能越慢?
我不知道这是否有关系,我正在使用带有16G内存和2.7GHz Intel Core i7的mac pro尝试更多运行。差异可能趋于0初始内存分配可能需要更多时间-如果您运行测试30秒而不是0.5秒,您可能会看到不同的结果。您正在创建的保留对象不足1 GB。如果你把伊甸园的尺寸变大,你可以避免GCs。尝试
-Xmn1500m
进行-Xmx2g
测试,以增加eden大小。顺便说一句,现在32GB的堆是中等大小的将大量对象添加到默认的ArrayList
会在每次内部数组满时导致大量内部重新分配。使用ArrayList(1000000000)
实例化,以防止出现这种情况,并减少内存使用。由于@Gas-touch,您的测试是无用的,在这种特殊情况下,很可能是您正在使用默认的并行GC,而额外的时间是当您成功地使用完所有2G后,为完全停止所需的额外时间。
-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