当JVM在运行时耗尽内存时会发生什么?

Shi*_*gon 19 java memory garbage-collection jvm memory-management

在思考了一个通用的方法来提出这个问题(并且没有找到一个)后,我只想问它是一个具体的例子:

假设我有一台具有1 Gb内存的Linux机器,它可以分配给进程(物理和交换总数为1 Gb).

我在计算机上安装了标准的Oracle Hotspot JVM版本7.如果在给定时刻,有足够的程序运行,只有400 Mb的1 Gb是空闲的,并且我在那时使用以下JVM标志启动Java程序:

java -Xms256m -Xmx512m -jar myJar.jar
Run Code Online (Sandbox Code Playgroud)

发生了什么?:

A. JVM是否无法立即启动,因为它会尝试分配所有512 Mb内存并失败(由于目前没有足够的可用内存)?

如果JVM启动:

如果在某些时候正在运行的Java进程需要超过400 Mb的内存(并且除了当前的Java进程已经使用的内存之外,仍然只有400 Mb的内存可用),会发生什么:

B. Java进程是否会因OutOfMemroyError而失败?

C.它会因某些其他(标准)错误而失败吗?

D.是不确定的行为?

Pol*_*ome 10

-Xmx只定义堆的最大大小.它不能保证有这么多的记忆.它只能确保堆永远不会比给定值大.也就是说,选项B.将会发生,将抛出outOfMemoryError.


Pet*_*rey 7

假设我有一台具有1 Gb内存的Linux机器,它可以分配给进程(物理和交换总数为1 Gb).

我的第一反应是,除非你在谈论手机,否则我会得到更多的记忆.您可以以低于100美元的价格购买16 GB(b =位,B =字节).

JVM是否无法立即启动,因为它将尝试分配所有512 Mb的内存并失败(由于目前没有足够的可用内存)?

如果您的系统没有512 MB(加上一些开销),因为它在启动时分配用于堆的连续虚拟内存,则会发生这种情况.

即使你有550 MB空闲,程序也可能无法启动,因为它需要加载的不仅仅是堆.

Java进程是否会因OutOfMemoryError而失败?

如果您的程序在运行时使用512 MB,则无论您的计算机具有多少内存,都会发生这种情况.只有在JVM启动后才会出现此错误.如果无法启动,您将不会收到此错误.

它会因一些其他(标准)错误而失败吗?

如果在程序启动后耗尽交换空间,则可以执行此操作.这是罕见的,只发生在严重超载的机器上.我所看到的是由于低级操作系统无法分配内存而导致JVM崩溃.

Java 6 Update 25 VM崩溃:内存不足