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

时间:2011-11-03 22:22:01

标签: java linux memory debian

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

4 个答案:

答案 0 :(得分:3)

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

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

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

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

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

答案 1 :(得分:1)

应用程序通常在大块中分配虚拟内存以提高性能和效率。没有人愿意优化这些东西,因为它们没有任何效果。如果你实际上没有问题,那就无需修复。

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

答案 2 :(得分:0)

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

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

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

与第1点相关:

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

答案 3 :(得分:0)

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