想象一下,我有一台 64位计算机,内存总量(物理+虚拟)等于 6 GB 。现在,当我同时使用-Xmx2048m
运行5个应用程序时会发生什么?因为这是64位操作系统,所以它们在启动时不会失败但是当他们都需要使用我为他们设置的2GB内存时会发生什么?
问题:是否可能会出现内存泄漏或其他问题?会发生什么?这样做有什么可能的后果?
我已经阅读了这些问题:this和this,但他们实际上并没有回答我的问题,因为我想要运行多个不具备此功能的应用程序超出了内存的限制,但它们一起完成。
答案 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受可用物理撞锤的限制。