我在Windows 7 64bit上运行1.6.0_25 64位。Java JVM保持对操作系统的内存分配
我想让JVM以最大的内存运行,因为我的应用程序内存密集,但可惜......内存分配不会建立起来,并且有很多从Windows的页面错误继续带来在接下来设置虚拟内存。
我正在运行的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内存......但是一旦完成读取操作,内存又会再次下降!
这是一个主要问题......我需要整个字节数组留在活动内存中。
谢谢 安永
我已经修改了代码,使用基本的数组类型int [] []和float [] []握着我的数据,而不是含有INT的对象保持的ArrayList和浮动的。
这样做,我发现我的Java内存不会被交换(所以,我想堆内存有点不同于堆栈在这里)[哦,我没有改变所有的代码静态类型以及 - 我知道,非常糟糕的编程风格]
现在我遇到的问题是如何处理我的HashMap ...我试图建立一个查找表的所有尝试失败O(n^2)运行时间建立!!!
所以,如果我得到这个权利,你试图有目的地创建一个内存泄漏?或者你需要文件始终存在于内存中?我有兴趣了解您的使用案例。 – lobster1234 2011-04-25 10:34:59
加载文件后,您是否保留对“byte []文件”的引用?你的系统有多少内存?你的其他代码用这个文件做什么? – WhiteFang34 2011-04-25 10:37:04
其实...我最初使用BufferReader读取1GB文件并处理输入和输出到BufferedWriter ... 该系统应该创建近5GB的处理数据。 令人难过的是,观察内存使用情况,它在6小时内从30K增加到.5G的速度非常缓慢,而且每增加k个字节,又增加了一个或两个IO读取操作...... – 2011-04-25 10:41:14