【问题标题】:What is causing the OS to become slow after running a memory intensive Java application?运行内存密集型 Java 应用程序后导致操作系统变慢的原因是什么?
【发布时间】:2023-03-03 23:34:01
【问题描述】:

我目前在 MacOSX Snow Leopard 上的 Eclipse 中运行一个小型 Java 类,用于对图形(内部创建大量巨大的集合)进行科学计算。我有一台具有 2GB RAM 的 Macbook,并且要成功运行应用程序而不会出现 OutOfMemory 错误,我需要使用 -Xmx1200m 从 eclipse 运行它(我知道这非常重要)。

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

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

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

我将不胜感激在这个方向上的任何提示或阅读。

【问题讨论】:

  • 您可能在运行应用程序时疯狂地进行交换,因此当您的应用程序结束并释放内存时,OSX 仍然需要从磁盘恢复所有这些内容。
  • 我对 Mac 不太熟悉,但在 Windows 中,即使我关闭了某个进程,我也可以检查它是否仍在运行 - 你可以对 Mac 做同样的事情吗?我问是因为我不时关闭了从屏幕上消失的应用程序,但相关进程仍在运行并消耗资源。在这些情况下,我要么必须重新启动,要么手动查找并结束不会正常死亡的僵尸进程......

标签: java performance memory-leaks memory-management


【解决方案1】:

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

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

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

如果您确实需要这么多内存并且它没有泄漏,那么如果您无法拆分程序或将中间结果保存到文件或数据库中,您可能需要购买更多。

【讨论】:

  • OP 说,即使在 Eclipse 关闭后,减速仍在继续;关闭 Eclipse 是否也不会关闭它启动的任何 Java 环境? (诚​​实的问题,我对 Eclipse 在幕后的行为知之甚少,尤其是对于 Mac。)
  • 好点。但除此之外,提问者将很难在低规格机器上运行这么大的应用程序。代码审查和查找我发现的内存问题是一种很好的做法
  • 确实,我只是想澄清一下 Eclipse。
  • 您好,Java 进程已经完成,此外我也关闭了 Eclipse。我可以在 MacOSX 进度监视器(或控制台顶部)中看到这一点。 java 程序肯定可以编码得更好,但这是一个不同的话题 :) 我想知道为什么在所有与 java 相关的进程都停止之后一切都很慢。感谢有关页面交换的提示。
【解决方案2】:

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

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

【讨论】:

  • ... 或 vm_stat(在 Linux / UNIX / Solaris 上又名 vmstat
  • 好吧,这是有道理的。 Java 进程完成后,我现在将查看磁盘活动。阅读您的答案后,我期待很多。
【解决方案3】:

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

【讨论】:

  • 就是这样。通过活动监视器/顶部验证。
【解决方案4】:

帮自己一个忙,再购买一个 2Gb RAM。我现在在我的 MBP 上运行 32 位内核(即较小的内核),并且内核本身具有 800Mb RAM 有线。对您来说,其他所有内容总共会留下 1.2Gb。这还不够。相信我,如果您购买额外的 RAM,不仅您的 Java 进程会更好,而且 一切 都会显得更加快捷。

【讨论】:

  • 如果问题是内存泄漏,添加更多 RAM 只会推迟症状的出现。
  • 确实会,但这个特殊问题看起来更像是他的系统未指定。无论如何,拥有 4Gb 将全面改善他的 OS X 体验,而不仅仅是这一个应用程序。我可以根据经验这么说。
猜你喜欢
  • 2010-10-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-06
  • 1970-01-01
  • 2016-10-26
  • 1970-01-01
相关资源
最近更新 更多