2011-04-25 42 views
0

我在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)运行时间建立!!!

+0

所以,如果我得到这个权利,你试图有目的地创建一个内存泄漏?或者你需要文件始终存在于内存中?我有兴趣了解您的使用案例。 – lobster1234 2011-04-25 10:34:59

+0

加载文件后,您是否保留对“byte []文件”的引用?你的系统有多少内存?你的其他代码用这个文件做什么? – WhiteFang34 2011-04-25 10:37:04

+0

其实...我最初使用BufferReader读取1GB文件并处理输入和输出到BufferedWriter ... 该系统应该创建近5GB的处理数据。 令人难过的是,观察内存使用情况,它在6小时内从30K增加到.5G的速度非常缓慢,而且每增加k个字节,又增加了一个或两个IO读取操作...... – 2011-04-25 10:41:14

回答

1

决定进程内存的哪些部分保留在RAM中,哪些交换出来是由操作系统而不是由JVM完成的。通常,操作系统会保留在RAM中经常访问的内存 - 如果不是,那么为什么你需要它?

可能有OS API允许您将某个内存“固定”在RAM中,但此功能未由Java公开。

但是对于您的要求,您应该考虑将文件memory-mapped而不是明确地读取它。它可能会快得多。

+0

好的......那么,我该如何处理这样一个事实,即我正在阅读的数据在ArrayLists和HashMaps中以预设的开始大小结束 这是正在被分页的部分...以及算法我正在执行的是非常密集的内存... 我被推荐迁移到Linux ...问题在这里......它会有什么不同的行为,并允许我保持活动内存ArrayLists? – 2011-04-25 10:52:12

+0

@Enas:由于分页是操作系统事务,因此不同的操作系统可能会有不同的行为。消费者版本的Windows倾向于针对最终用户应用程序而不是数据处理进行优化。转移到Windows Server操作系统也可能导致不同的分页行为。虽然我会说,一旦你的算法密集处理所有的数据,它应该在任何一个理智的操作系统上被分页。 – 2011-04-25 11:31:20

+0

谢谢,这很有道理。我正在考虑安装一个基于系统的Linux,看看是否能解决这个问题......你会推荐Ubuntu还是有更好的“服务器”来表现Linux发行版。 谢谢。 – 2011-04-25 11:51:03

0

Java会尽力将所有应用程序保留在内存中,或者换句话说,它将作为最后的手段进行交换,因为如果将其内存中的任何内存交换到磁盘时,性能会非常糟糕。

如果您的Java应用程序正在交换到磁盘,则会因为您的应用程序为您拥有的系统使用了太多的内存。如果你的应用程序是内存密集型的,你必须使用这么多的内存,我建议你的系统有足够的内存。 BTW。你可以购买一台8 GB的服务器,售价约500美元,新的16 GB工作站售价1000美元。 ;)

+0

我正在使用24G内存和24G虚拟内存的系统上运行。我正在计划消除虚拟内存,因此迫使系统使用所有可用的物理内存...... – 2011-04-25 15:45:45

+0

您确定这是导致交换的原因,如果您有24 GB并且您正在使用〜3 GB,我不明白你为什么要交换虚拟内存。系统上必须有其他的东西引起这种情况。 – 2011-04-25 20:59:52