0

我在 Windows 7 64 位上运行 1.6.0_25 64 位。

我试图让 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 的对象的 ArrayLists。

这样做,我发现我的 java 内存没有被交换(所以,我猜堆内存的处理方式与这里的堆栈有点不同)[哦,我确实将所有代码也更改为静态类型 - 我知道,非常糟糕编程风格]

我现在遇到的问题是如何处理我的 HashMap ......我尝试构建查找表的所有尝试都以 O(n^2) 运行时间来构建失败!!!

4

2 回答 2

1

决定将进程内存的哪些部分保留在 RAM 中以及换出哪些部分是由操作系统决定的,而不是由 JVM 决定的。通常,操作系统会将经常访问的内存保留在 RAM 中——如果不是,为什么需要它呢?

可能有一些操作系统 API 允许您在 RAM 中“固定”某块内存,但 Java 并未公开此功能。

但是根据您的要求,您应该考虑对文件进行内存映射,而不是显式地读取它。它可能会快得多。

于 2011-04-25T10:41:40.690 回答
0

Java 相当努力地将其所有应用程序保留在内存中,或者换一种说法,它作为最后的手段进行交换,因为如果它的任何内存被交换到磁盘,它的性能就会非常糟糕。

如果您的 Java 应用程序正在交换到磁盘,那是因为您的应用程序为您拥有的系统使用了过多的内存。如果您的应用程序是内存密集型的,并且您必须使用这么多内存,我建议确保您的系统有足够的内存。顺便提一句。您可以花 500 美元购买 8 GB 的服务器,花 1000 美元购买新的 16 GB 工作站。;)

于 2011-04-25T14:41:09.980 回答