我有两个Java程序。在我的计算机上,其中一个使用9MB RAM,另一个使用77MB。但是当我将它们上传到服务器时,相同的程序使用382MB和186MB!有没有办法阻止这种情况发生?
答案 0 :(得分:3)
如何衡量每种情况下的内存使用情况?不同的操作系统对“内存使用”的构成有不同的概念。
64位系统需要比32位系统更多的内存,因为增加了指针(Java中的引用)大小。您是否在台式计算机上使用32位操作系统和JVM?
您使用的是不同的JVM选项吗?中等活动的Java应用程序通常最终使用-Xmx
选项允许的所有内存,以最大限度地减少在垃圾回收上花费的CPU时间。此外,默认的最大堆空间是根据可用的物理内存确定的 - 如果服务器有更多的内存,Java应用程序也必然会使用更多的内存。
服务器JVM(请参阅-server
JVM选项)具有不同的设置,并且优于内存使用情况。 -server
选项是64位系统上的默认选项。
您是否完全确定两种情况下的应用程序负载是否相同?
答案 1 :(得分:1)
应用程序通常在大块中分配虚拟内存以提高性能和效率。没有人愿意优化这些东西,因为它们没有任何效果。如果你实际上没有问题,那就无需修复。
虚拟内存不是稀缺资源。试图减少vm的消耗是浪费精力。
答案 2 :(得分:0)
你是如何衡量这些数字的?
在Linux上比较Windows任务管理器和ps(1)的数量是徒劳的,因为它们的计算方式不同。例如,共享库和共享内存在两个平台上的归属方式不同。内存管理也完全不同。
另一方面,如果您通过Runtime
(或类似)引用从应用程序中收集的数字,那么您必须查看JVM是如何使用哪些参数启动的。最重要的是参数-Xmx
和-Xms
,但您可以在java
或javaw
的文档中查找其他几个参数。
与第1点相关:
How to measure actual memory usage of an application or process?
答案 3 :(得分:0)
除非您明确设置它(例如-Xmx128M之类的命令行参数),否则JVM depends on the amount of RAM available的默认最大堆大小。