我贴出了这个问题的答案,我意识到我有些困惑。我问了几个熟悉 java 的同事,我们都有点困惑。
在这种情况下会发生什么:
启动jvm,启动大小为512mb,最大大小为2gb。
您的底层操作系统还有1gb的内存,因此允许启动jvm。
你的程序使用超过1gb的内存。
此时,您已经使用了所有可用的jvm内存,但还没有突破启动时设置的jvm内存限制。操作系统限制了您获取更多资源的能力,而不是jvm本身。
我本以为这会导致 OutOfMemoryError
,如果超出2gb jvm大小限制,您将得到。不过,我不得不承认,在实践中,当我们在服务器上运行太多进程时,我往往会看到速度减慢,而且没有内存异常。
请注意,我知道分页,在linux中,当内存耗尽时,进程会被终止。我很想知道在jvm级别是否有任何额外的机制可以导致更多的阻塞效应,因为这是另一个问题中的人在他的评论中提出的问题。我意识到答案可能只是“不,没有其他机制。”
后续问题/评论
这是因为除非达到实际的jvm内存限制,否则不会抛出内存异常吗?如果是这样的话,当操作系统不能给jvm更多的内存,而jvm还没有达到它的极限时,会发生什么呢?在操作系统内存可用之前,是否存在某种阻塞或类似的机制?
1条答案
按热度按时间pxy2qtax1#
所有现代操作系统都使用页缓存,即在内存和磁盘之间交换数据。虽然这有点过于简单,但每个进程都受到可用地址数(通常是232或264)的限制,而不是物理内存量的限制。
服务器在负载下运行缓慢的原因之一是它必须更频繁地交换数据,这涉及到相对较慢的磁盘读取。
来自javadoc的
OutOfMemoryError
:当java虚拟机由于内存不足而无法分配对象,并且垃圾收集器无法提供更多内存时抛出。
从操作系统的Angular 来看,如果进程超出内存限制,会发生什么,这是特定于某个操作系统的,但通常进程会终止。