问题来了:4GB物理内存的机器上申请8G内存能成功吗?

在4GB物理内存的32位系统上,申请8GB内存会在虚拟内存阶段失败,而在64位系统上,虽能成功申请,但实际使用超出物理内存会导致OOM。申请内存主要涉及虚拟内存和物理内存的交互,以及操作系统的内存管理机制。
摘要由CSDN通过智能技术生成

一大早看见群里的人在讨论面试题

 

其中,第一个问题「在 4GB 物理内存的机器上,申请 8G 内存会怎么样?」存在比较大的争议,有人说会申请失败,有的人说可以申请成功。

这个问题在没有前置条件下,就说出答案就是耍流氓。因为在 32 位操作系统和 64 位操作系统场景下,答案是不同的。

另外,我们还要看申请完 8G 内存后会不会被使用,会被使用是一种情况,不会被使用又是另外一种情况了。

所以,我们要分场景讨论。

应用程序通过 malloc 函数申请内存的时候,实际上申请的是虚拟内存,此时并不会分配物理内存。

当应用程序读写了这块虚拟内存,CPU 就会去访问这个虚拟内存, 这时会发现这个虚拟内存没有映射到物理内存, CPU 就会产生缺页中断,进程会从用户态切换到内核态,并将缺页中断交给内核的 Page Fault Handler (缺页中断函数)处理。

缺页中断处理函数会看是否有空闲的物理内存:

  • 如果有,就直接分配物理内存,并建立虚拟内存与物理内存之间的映射关系。

  • 如果没有空闲的物理内存,那么内核就会开始进行回收内存的工作,如果回收内存工作结束后,空闲的物理内存仍然无法满足此次物理内存的申请,那么内核就会放最后的大招了触发 OOM (Out of Memory)机制。

32 位操作系统和 6

这个Java虚拟机(JVM)启动参数的组合(Xms4g -Xmx4g -XX:MaxDirectMemorySize=4g)在物理内存8GB的情况下,可能会遇到一些资源管理的问题。让我们逐个解释这些参数: - Xms4g: `-Xms` 是初始堆内存大小,设置为4GB。这意味着JVM将尝试分配至少4GB内存作为堆空间。 - Xmx4g: `-Xmx` 是最大堆内存限制,同样设置为4GB。这限制了JVM能够使用的最大堆内存,如果应用的内存需求超过这个值,JVM将抛出内存溢出异常。 - XX:MaxDirectMemorySize=4g: 这个选项设置了直接内存(Direct Memory)的最大值为4GB。Direct Memory通常用于处理大量不通过Java堆的性能关键型数据,如大数组或NIO缓冲区。 对于8GB物理内存,如果你的程序主要是基于堆内存的操作(例如使用大量的对象和数据结构),并且这些都分配在JVM堆中,那么将堆大小设置为4GB可能会导致以下情况: 1. 如果应用程序的需求超过了4GB,那么超过部分的内存将无法被堆分配,可能会导致OutOfMemoryError。 2. 堆内存占用过多,可能会减少可用的物理内存空间,影响其他非Java进程的运行。 3. 如果直接内存也设为了4GB,这可能会限制应用处理大数据的能力,尤其是那些不适合堆内存但需要直接内存的工作场景。 所以,这种设置可能不太合理,特别是在处理大数据或内存密集型任务时。一般来说,建议根据应用程序的实际需求动态调整堆内存大小,并留出一些物理内存给操作系统和其他系统服务。如果直接内存需求较大,可能需要重新评估是否需要减小堆内存,或者考虑使用外部存储(如磁盘)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值