我在Windows 7 64位上运行1.6.0_25 64位。
我正在尝试让JVM以最大内存运行,因为我的应用程序非常耗费内存......但遗憾的是......内存分配不会累积,并且Windows中存在很多页面错误以继续使用下一组虚拟内存。
我正在运行java -Xms2G -Xmx3G Test
以下代码是我尝试将整个文件放入...以便我不会因为读取而遇到页面错误。
File f = new File("veryLARGEfile.txt");
FileInputStream in = new FileInputStream(f);
int i = (int) f.length();
System.out.println("Bytes in file: " + i);
byte[] file = new byte[i];
i = in.read(file);
System.out.println("Bytes read: " + i);
执行此方法我可以看到,在Windows任务管理器中,系统在读取文件时达到了2G的内存...但是一旦完成读取它...内存再次下降!
这是一个主要问题......我需要整个字节数组保留在活动内存中。
谢谢你, ey
我修改了代码以使用基本数组类型int [] []和float [] []来保存我的数据,而不是保持包含int和float的对象的ArrayLists。
这样做,我发现我的java内存没有被交换(所以,我认为堆内存在这里与堆栈有点不同)[哦,我确实将所有代码更改为静态类型 - 我知道,非常差的编程风格]
我现在遇到的问题是如何处理我的HashMap ...我尝试构建查找表的所有尝试都失败了O(n ^ 2)运行时间来构建!
答案 0 :(得分:1)
决定进程的内存中哪些部分保留在RAM中以及将哪些内存交换出来是由操作系统进行的,而不是由JVM进行的。通常,操作系统会保留经常在RAM中访问的内存 - 如果不是,为什么还需要它呢?
可能有OS API允许您在RAM中“固定”某个内存,但Java不会公开此功能。
但是根据您的要求,您应该考虑使用文件memory-mapped而不是明确地读取它。它可能会快得多。
答案 1 :(得分:0)
Java尝试将其所有应用程序保留在内存中,或者换一种方式,它作为最后的手段进行交换,因为如果它的任何内存交换到磁盘,它的执行情况非常糟糕。
如果您的Java应用程序正在交换到磁盘,那是因为您的应用程序为您拥有的系统使用了太多内存。如果您的应用程序是内存密集型的,并且您必须使用这么多内存,我建议您确保系统有足够的内存。 BTW。您可以购买8 GB的服务器,价格约为500美元,新的16 GB工作站的价格为1000美元。 ;)