【发布时间】:2011-10-02 08:26:44
【问题描述】:
我在 windows 7 64bit 上运行 1.6.0_25 64bit。
我试图让 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 和 float 的对象的 ArrayList。
这样做,我发现我的 java 内存没有被交换(所以,我猜堆内存的处理方式与这里的堆栈有点不同)[哦,我确实将所有代码也更改为静态类型 - 我知道,非常糟糕的编程风格]
我现在遇到的问题是如何处理我的 HashMap...我尝试构建查找表的所有尝试都以 O(n^2) 运行时间来构建失败!!!
【问题讨论】:
-
所以如果我做对了,你是在故意制造内存泄漏吗?或者您需要文件始终存在于内存中?我有兴趣了解您的用例..
-
您在加载文件后是否保留对
byte[] file的引用?你的系统有多少内存?您的其余代码如何处理此文件? -
实际上...我最初是使用 BufferReader 读取一个 1GB 的文件并将输入和输出处理到 BufferedWriter... 该系统应该创建近 5GB 的处理数据。可悲的是,观察内存使用情况,它在 6 小时内从 30K 增加到 .5G 非常缓慢,并且每增加几个 k 字节,就会完成另外一到两次 IO 读取......
-
这听起来像是一个用例,人们会非常尝试避免将整个文件保存在内存中(特别是因为通过 IO 流 API 很容易做到这一点)。
-
继续...所以我重新编写了代码以快速加载数据。所以,好消息,确实如此,它会在 2 分钟内加载......但是一旦加载完成并且我准备好使用数据,内存就会恢复,然后我开始看到非常严重的页面错误。跨度>
标签: java jvm memory-management page-fault