HelloCoder HelloCoder
首页
《Java小白求职之路》
《小白学Java》
计算机毕设
  • 一些免费计算机资源
  • 脚手架工具
  • 《从0到1学习Java多线程》
  • 《从0到1搭建服务器》
随笔
关于作者
首页
《Java小白求职之路》
《小白学Java》
计算机毕设
  • 一些免费计算机资源
  • 脚手架工具
  • 《从0到1学习Java多线程》
  • 《从0到1搭建服务器》
随笔
关于作者
  • 技术

    • 4G的机器上申请8G的内存
    • CPU和内存交互
    • GraalVM看法
    • Gradle项目导入
    • Linux-awk使用案例
    • Linuxmint安装
    • Ubuntu安装
    • VMware安装虚拟机
    • springboot异步编程
    • win+Ubuntu双系统安装
    • 企业级监控prometheus
    • 单核CPU是否支持多线程
    • 虚拟机软件
  • 所思所悟

  • 其他

  • 读书笔记

  • ChatGpt
  • 随笔
  • 技术
#G #机器上申请 #内存
码农阿雨
2023-02-16
目录

4G的机器上申请8G的内存

先说结论:

  • 在 32 位操作系统,因为进程最大只能申请 3 GB 大小的虚拟内存,所以直接申请 8G 内存,会申请失败。
  • 在 64 位操作系统,因为进程最大只能申请 128 TB 大小的虚拟内存,即使物理内存只有 4GB,申请 8G 内存也是没问题,因为申请的内存是虚拟内存。

首先要知道前提条件:

  • 操作系统是32位还是64位
  • 申请后的8G内存是否真的被使用
  • 操作系统是否开启了 Swap机制

32位 寻址的范围是2^32也就是4G

64位的话则有 128T

还需要明白一体下面几个概念。

# 物理内存

物理内存可以理解为电脑的内存条,是真正的内存。

# 虚拟内存

虚拟内存的出现,就是为了解决直接使用物理内存的问题。

虚拟内存是为了满足物理内存不足时而提出的策略,他是利用磁盘空间虚拟出的逻辑内存,用作虚拟内存的磁盘空间被称为交换空间(swap space)

进程要访问地址空间上的某一个地址,都需要把地址翻译为实际物理内存地址,这又 涉及到内存管理单元(MMU)和地址映射。

程序在申请内存的时候,都是直接和 虚拟内存 打交道的。

# 申请内存

是否允许申请跟 Linux 中的 overcommit_memory 参数有关,可以使用 cat /proc/sys/vm/overcommit_memory 来查看这个参数,这个参数接受三个值:

  • 如果值为 0(默认值),代表:Heuristic overcommit handling,它允许overcommit,但过于明目张胆的 overcommit 会被拒绝,比如malloc一次性申请的内存大小就超过了系统总内存。Heuristic的意思是“试探式的”,内核利用某种算法猜测你的内存申请是否合理,大概可以理解为单次申请不能超过free memory + free swap + pagecache的大小 + SLAB中可回收的部分 ,超过了就会拒绝overcommit。
  • 如果值为 1,代表:Always overcommit. 允许overcommit,对内存申请来者不拒。
  • 如果值为 2,代表:Don’t overcommit. 禁止overcommit。

还有一种情况

即使 malloc 申请的是虚拟内存,只要不去访问就不会映射到物理内存,但是申请虚拟内存的过程中,还是使用到了物理内存(比如内核保存虚拟内存的数据结构,也是占用物理内存的),如果你的主机是只有 2GB 的物理内存的话,大概率会触发 OOM。

阅读全文
×

(为防止恶意爬虫)
扫码或搜索:HelloCoder
发送:290992
即可永久解锁本站全部文章

解锁
#G#机器上申请#内存
上次更新: 2025-02-21 06:04:57
最近更新
01
《LeetCode 101》
02-21
02
IDEA、Golang、Pycharm破解安装
02-21
03
《LeetCode CookBook》
02-21
更多文章>
Theme by Vdoing | Copyright © 2020-2025 码农阿雨
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式