在我的工作环境中,我们有许多在 Windows Server 2008 硬件上运行的企业 Java 应用程序。一位外部顾问一直在审查我们的 Java 应用程序的性能,并建议我们将初始内存值和最大内存值更改为相同。
所以,目前,我们正在运行一个初始内存为 1GB,最大内存为 2GB 的应用程序。他们的建议是将初始内存和最大内存都更改为 2GB。
他们的推理是2倍的......
- 通过将初始和最大值分配为 2GB,当 Java 应用程序启动时,它将直接获取 2GB 内存块。这可以防止任何其他应用程序访问此内存块,因此 Java 应用程序将始终可以使用此内存。这与目前的情况相反,它只会获得 1GB 的初始块,这意味着其他应用程序可能会消耗服务器上剩余的可用内存,而企业 Java 应用程序将无法增长到 2GB 内存最大。
- 每次 Java 需要在初始大小和最大大小之间分配内存时,都会对性能造成很小的影响。这是因为它需要转到 Windows,分配所需大小的新块,然后使用它。每次在初始大小和最大大小之间需要内存时,都会发生这种性能损失。因此,将它们都设置为相同的值意味着消除了这种性能影响。
我认为他们的第一点从安全角度来看是有效的,因为这意味着无论其他应用程序在服务器上做什么,Java 应用程序都将始终可以访问最大内存。但是,我也认为这可能是一个负面因素,因为这意味着有一大块内存不能被其他应用程序使用,如果他们需要它,这可能会导致一般的服务器性能问题。
我认为他们在第 2 点中讨论的性能影响可能微不足道,因此不值得担心。如果他们关心性能,他们最好调整诸如 Java 的垃圾收集方面的东西,而不是担心分配内存块对性能的微小影响。
谁能告诉我他们将初始内存和最大内存分配给相同值的请求是否有真正的好处。是否有任何一般性建议?