我是服务器和管理方面的新手,我正在尝试了解 RAM 和 JVM 之间的关系。假设我有一台具有 16 GB 物理内存 (RAM) 的服务器。我有一个在 Websphere 中运行的应用程序。Websphere 中有 4 个应用程序服务器,每个服务器都运行相同的应用程序。我们在 4 个应用程序服务器中分别分配了 2 GB JVM。我假设,应用程序将 8 GB RAM 作为 JVM 消耗,其余 8 GB 是空闲的。在这种情况下,空闲的 8 GB 是否用于其他目的?现在是否可以添加 5 个新的应用程序服务器,每个服务器分配 2 B JVM。换句话说,RAM 和 JVM 之间的关系是什么。添加的 JVM 总数可以超过 RAM 吗?
PS 我是新手,如果我的问题没有意义,请原谅。我想了解应用程序如何利用服务器内存(分配为 JVM)。
答案1
在这种情况下,免费的 8 GB 是否用于其他用途?
如果可能的话,是的。释放 RAM 对操作系统来说纯粹是成本问题 —— 它必须再次使用 RAM 才能使用它。除非操作系统别无选择,否则它会将 RAM 用于其他用途。最常见的用途是最近从磁盘读取或写入磁盘的数据。通过将其保存在内存中,操作系统避免了必须释放 RAM 才能再次使用的麻烦,如果需要相同的数据,它可以节省磁盘读取操作。
现在是否可以添加 5 个新的应用服务器,每个服务器分配 2B JVM。换句话说,RAM 和 JVM 之间的关系是什么。添加的 JVM 总和可以超过 RAM 吗?
当然。JVM 分配的是虚拟内存,而不是物理内存。操作系统会根据需要和效率将物理内存分配给虚拟内存。现代操作系统可以允许虚拟内存消耗大大超过物理内存。这可能会或可能不会导致性能不佳,具体取决于工作集大小——大致是实际访问了多少虚拟内存。
答案2
我们在 4 个应用服务器中分别分配了 2 GB 的 JVM。
我假设您在每个应用服务器中将最大堆大小设置为 2 GB?在这种情况下,您的 Java 进程的大小实际上会更大,因为 Java 进程将由堆大小 2 GB + Java 进程所需的本机内存量组成。Java 进程所需的 RAM 和本机内存量取决于应用程序,不幸的是,无法真正调整。因此,当您的应用程序达到 2 GB 的最大堆时,您的 Java 进程的大小可能在 2.5 到 3.5 GB 之间,甚至可能更高。
因此,如果您必须在 AIX 机器上分配额外的 JVM,请记住这一点,以便它不会耗尽物理内存并开始分页。