【问题标题】:Why does Java use so much more memory on my Linux server?为什么 Java 在我的 Linux 服务器上使用这么多内存?
【发布时间】:2026-01-02 14:40:01
【问题描述】:

我有两个 Java 程序。在我的电脑上,其中一个使用 9MB 的 RAM,另一个使用 77MB。但是当我将它们上传到服务器时,相同的程序使用 382MB 和 186MB!有没有办法阻止这种情况发生?

【问题讨论】:

  • 你说的是物理内存还是虚拟内存?如果是虚拟内存——谁在乎?虚拟内存不是稀缺资源。
  • 您是否尝试进行内存转储?您可以使用 - java.sun.com/developer/technicalArticles/Programming/HPROF.html 查看您的内存利用率
  • 你确定它总共只使用了 9 MB,我觉得这很难相信?在具有更多内存的机器上,最大内存会增加。这意味着使用更多的虚拟内存而不是更多的常驻内存。 (这是你应该看的图)

标签: java linux memory debian


【解决方案1】:
  1. 您如何测量每种情况下的内存使用情况?不同的操作系统对什么是“内存使用”有不同的概念。

  2. 64 位系统需要比 32 位系统更多的内存,因为增加了指针(Java 中的引用)大小。您是否在台式计算机上使用 32 位操作系统和 JVM?

  3. 您是否使用不同的 JVM 选项?适度活跃的 Java 应用程序通常最终会使用 -Xmx 选项允许的所有内存,以最大限度地减少垃圾收集所花费的 CPU 时间。此外,默认的最大堆空间是根据可用的物理内存来确定的——如果服务器有更多的内存,Java 应用程序也必然会使用更多的内存。

  4. 服务器 JVM(请参阅 -server JVM 选项)具有不同的设置,并且有利于性能而不是内存使用。 -server 选项是 64 位系统的默认选项。

  5. 您确定两种情况下的应用程序负载相同吗?

【讨论】:

    【解决方案2】:

    应用程序分配大块虚拟内存以提高性能和效率是很常见的。没有人会费心去优化这些东西,因为它们没有效果。如果您实际上没有问题,则无需解决任何问题。

    虚拟内存不是稀缺资源。试图减少 vm 的消耗是浪费精力。

    【讨论】:

    • 这取决于您是否有足够的磁盘空间 - 如果您的服务器资源有限,可能值得减少一点。
    • @Chii:我完全不明白这种联系。从不映射到常驻页面的虚拟内存不会占用磁盘空间。
    • @Chii 不,真的,虚拟内存只是数字。有很多数字。服务器可能对其他资源有限制,但它可以拥有任意数量的资源。
    • @Chii:我认为在这种情况下我们的术语有歧义。根据上下文,“虚拟内存”可能意味着使用辅助存储以供操作系统内存管理器使用(交换)以及将磁盘文件映射到进程的地址空间。两者都使用相同的 CPU 设施这一事实也无济于事......
    • @thkala:使用术语“虚拟内存”来指代交换或分页,IMO 是对该术语的误用。事实上,有些系统有虚拟内存但没有交换,有些系统有交换但没有虚拟内存。
    【解决方案3】:

    您是如何衡量这些数字的?

    在 Linux 上比较 Windows 任务管理器和 ps(1) 的数量是徒劳的,因为它们的计算方式不同。例如,共享库和共享内存在两个平台上的属性不同。内存管理也完全不同。

    另一方面,如果您通过Runtime(或类似的)引用从您的应用程序中收集的数字,那么您必须查看 JVM 是如何使用哪些参数启动的。最重要的是参数-Xmx-Xms,但您可以在javajavaw 的文档中查找其他几个参数。

    与第1点相关:

    How to measure actual memory usage of an application or process?

    【讨论】:

      【解决方案4】:

      除非您已明确设置它(例如命令行参数,如 -Xmx128M),否则 JVM 的默认最大堆大小 depends on the amount of RAM available

      【讨论】: