Java JVM针对操作系统保留内存分配

| 我在Windows 7 64bit上运行1.6.0_25 64bit。 我试图让JVM在最大内存下运行,因为我的应用程序占用大量内存...但是可悲的是...内存分配没有建立,并且Windows出现了很多Page Faults来继续带来下一组虚拟内存。 我正在运行java -Xms2G -Xmx3G测试 下面的代码是我试图将整个文件导入...,这样我就不会遇到页面错误以进行读取。
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)运行时间而失败!!!     
已邀请:
决定进程内存中哪些部分保留在RAM中以及将哪些部分交换掉是由操作系统而不是由JVM决定的。通常,操作系统会将经常访问的内存保留在RAM中-如果不是,为什么在那儿需要它? 可能会有OS API,使您可以“固定” RAM中的某些内存,但是Java并未公开此功能。 但是出于您的要求,您应该考虑将文件映射到内存,而不是显式地读取它。它可能会更快。     
Java竭尽全力将其所有应用程序保留在内存中,或者换种方式,它作为最终手段换出了,因为如果将其任何内存换成磁盘,它的性能都会很差。 如果您的Java应用程序正在交换到磁盘,则是因为您的应用程序为您的系统使用了过多的内存。如果您的应用程序占用大量内存,并且您必须使用这么多的内存,那么我建议您确保系统具有足够的内存。顺便说一句。您可以以$ 500的价格购买具有8 GB的服务器,并以$ 1000的价格购买新的16 GB工作站。 ;)     

要回复问题请先登录注册