我有一个正在运行的Java进程正在执行某些任务,几个小时后,系统上打开了多个其他应用程序,导致系统上的可用物理内存非常低。
因此,如果系统没有物理内存/剩余的内存很少,我的java进程将如何应对这种情况?它会抛出“内存不足”异常吗?
答案 0 :(得分:6)
当RAM用尽时,OS通常会使用swap or pagefile来提供virtual memory:
RAM是有限的资源,而对于大多数实际目的,虚拟内存是无限的。可以有许多进程,每个进程都有自己的2 GB专用虚拟地址空间。当所有现有进程所使用的内存超过可用的RAM时,操作系统会将一个或多个虚拟地址空间的页面(4 KB件)移到计算机的硬盘上。这样可以释放该RAM帧用于其他用途。在Windows系统中,这些“页面调出”页面存储在分区根目录中的一个或多个文件(Pagefile.sys文件)中。
Paging通常会导致严重的性能下降,因为即使是现代的SSD存储也不如RAM快。如果内存不足继续,则系统可能会启动thrashing。
假设JVM不需要更多的内存,例如它已经受-Xmx
约束并分配了所有允许的内存,它将继续运行。通常,当内存耗尽时,操作系统将不允许启动新进程,例如尝试启动新的JVM进程将导致以下错误:
Error occurred during initialization of VM
Could not reserve enough space for object heap
Could not create the Java virtual machine.
最终,这取决于操作系统配置。通常情况下,您不需要花时间进行调查,因为RAM比开发人员的时间便宜得多。