为什么Java在我的Linux服务器上使用更多内存?

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

  1. 如何衡量每种情况下的内存使用情况? 不同的操作系统对于“内存使用情况”有不同的概念。

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

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

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

  5. 你是否完全确定这两种情况下的应用程序负载是相同的?

应用程序以大块分配虚拟内存以提高性能和效率是相当普遍的。 没有人会因为没有任何效果而苦恼去优化这些东西。 如果你实际上没有问题,没有什么可以解决的。

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

你是如何衡量这个数字的?

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

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

相关点1:

如何测量应用程序或进程的实际内存使用情况?

除非你明确地设置了它(例如-Xmx128M这样的命令行参数),否则JVM的默认最大堆大小取决于可用的RAM数量 。