Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JVM内存设置影响_Java_Performance_Memory_Memory Management_Jvm - Fatal编程技术网

Java 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 =

我正在尝试为我们拥有的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();
                }
        }
    }

}
所有这些平均为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