运行一些Java应用程序,其总堆大小内存设置为超过phisycal内存

时间:2017-09-08 06:50:16

标签: java memory-management

想象一下,我有一台 64位计算机,内存总量(物理+虚拟)等于 6 GB 。现在,当我同时使用-Xmx2048m运行5个应用程序时会发生什么?因为这是64位操作系统,所以它们在启动时不会失败但是当他们都需要使用我为他们设置的2GB内存时会发生什么?

问题:是否可能会出现内存泄漏或其他问题?会发生什么?这样做有什么可能的后果?

我已经阅读了这些问题:thisthis,但他们实际上并没有回答我的问题,因为我想要运行多个不具备此功能的应用程序超出了内存的限制,但它们一起完成。

2 个答案:

答案 0 :(得分:2)

您将体验到的是在主要垃圾收集期间交换量的增加,从而增加了GC暂停时间。

当使用的内存超过物理内存时(实际上甚至在此之前),现代操作系统会将一些较少使用的内存写入磁盘。使用JVM,这很可能是堆的终生代的某些部分。当主要GC发生时,它将不得不触及所有堆,因此它必须在它卸载到磁盘的所有页面中交换回来,从而导致大量的IO活动和增加的CPU负载。

由于一个JVM的堆很少适合物理内存,但是一个JVM的堆超过物理内存或同时主要,因此有多个主要GC的JVM可能会稍微增加暂停时间。来自多个JVM的GC可能导致大量内存页面的交换("颠簸")和GC可能需要非常慢的时间(最多几分钟)。

答案 1 :(得分:1)

Xmx仅保留虚拟地址空间。它是虚拟的而不是物理的。

此设置的响应取决于操作系统:

Windows:限制由swap + physical定义。例外是大页面(需要使用组策略设置启用),这将通过物理ram限制它(XMS是不可能的)。

Linux行为更复杂。 (它取决于vm.overcommit_memory和相关的sysctls以及mmap系统调用中的各种标志)可以(但不是全部)由JVM配置标志控制。行为可以是: - Xms可以超过总ram + swap - Xmx受可用物理撞锤的限制。