在运行内存密集型Java应用程序后,导致操作系统变慢的原因是什么?

时间:2010-10-12 13:23:00

标签: java performance memory-leaks memory-management

我目前正在运行一个小型java类,用于在MacOSX Snow Leopard上从Eclipse内部进行科学计算(内部创建大量集合)。我有一台带有2GB RAM的Macbook并且在没有OutOfMemory错误的情况下成功运行应用程序我需要使用-Xmx1200m从eclipse运行它(我知道这非常多)。

我需要大约500秒来完成我需要运行的所有计算,它也耗尽了我给它的所有内存(我使用macosx进度监视器进行监视,对于Real Mem进行了1.2GB的监视)

完成此应用程序后,我的MacOSX几乎无法使用。即使我关闭Eclipse,一切都变得缓慢而缓慢。我也注意到,无论我事后做什么(即使在关闭Eclipse之后),例如Finder导航非常慢。渲染一些文件夹或更改目录需要很长时间。有时我会重新启动系统以便能够有效地再次工作。

我想了解发生这种情况时后台发生了什么? 我的印象是,当一个java类/应用程序运行完毕时,垃圾收集器至少在最后会清理所有内容,我希望其他程序可以再次使用这个内存。但它“感觉”就像一个影响整个系统的内存泄漏,即使Java应用程序不再运行了。

我很感激这方面的任何提示或阅读。

4 个答案:

答案 0 :(得分:5)

你的Mac运行缓慢,因为它有2GB,你运行Eclipse并且你有一个1.2GB的应用程序。它可能像疯了一样交换。

您的Java程序可能存在内存泄漏。您正在添加集合而不是从集合中删除。您可以使用TPTP,NetBeans或VisualVM等分析器来搜索它。

如果你做错了,Java程序可能会泄漏任何其他语言。

如果你真的需要那么多内存并且它不是泄漏那么你可能需要购买更多内存,如果你不能拆分程序或将中间结果保存到文件或数据库。

答案 1 :(得分:3)

确保退出应用程序后java进程正常结束。我和JBoss AS有类似的问题

答案 2 :(得分:3)

您遇到的内容称为页面交换。操作系统已将一堆虚拟内存页面逐出(或分页)到磁盘,以满足Java代码的要求。程序完成后,如果您尝试切换回其他已运行的程序,则操作系统必须先从磁盘进行页面调入才能恢复。

您可以使用top或Activity Monitor等工具查看所有这些情况。

答案 3 :(得分:1)

帮自己一个忙,买另一个2Gb内存。我正在运行我的MBP上的32位内核(即较小的内核),内核本身有800Mb的RAM连线。对于你来说,总共会留下1.2Gb的其他所有东西。这还不够。相信我,如果你购买额外的RAM,你的Java进程不仅会更好,而且一切看起来会更加快捷。