zoukankan      html  css  js  c++  java
  • 虚拟内存

     

    虚拟内存这个概念,大家都不会陌生。有人会说虚拟内存还不简单,不就是在内存不够的时候,就把外存当内存来使用,这种说法有一定的道理,但显然不准确。在最开始内存只有128M或者256M时,内存显然是不够的,在这种情况下说内存不够的话,拿外存来顶替,这种说法还过得去。但现在8g内存,16g内存,甚至32g内存都很普遍,现在的内存显然是足够用的,但我们仍然需要虚拟内存,上面那种说法显然站不住脚。

    下面开一个游戏,本人电脑内存8G。

    可以看到RAM一栏中,3853MB是指内存的消耗,而后面的5408MB则是虚拟内存消耗(更准确的是分页文件),这里内存显然没有超过8G,那为什么还需要虚拟内存呢?

    为了解释虚拟内存,我们首先要弄清楚虚拟地址和真实的物理地址

    虚拟地址也叫逻辑地址:

    上图的程序输出了指针b指向的地址0x6afef8,这是用16进制表示的,但这个并不是真实的地址,只是逻辑上的地址。

    作为计算机用户,我们并不能接触真实的物理地址,只能接触到逻辑地址,而逻辑地址到物理地址的映射,是由操作系统完成的,准确来说是通过分页和分段的技术完成的。逻辑地址的大小是人为确定的,一般会比物理地址大很多,当程序要访问的资源找不到时,可以将其调入到内存中,没有用的资源调入到外存。这也就是常说的页面置换,这个常被调入和调出的文件叫做分页文件,这样就好像我们有很大的’内存‘空间一样。这里我们就可以解释为什么内存明明还很充裕的情况下,依然会存在分页文件。

    计算机用户只能接触到逻辑地址,而逻辑地址往往比真实的物理地址大很多,当操作系统通过逻辑地址映射到物理地址的时候,可能会出现找不到所需要的资源,也就是缺页,这个时候就需要从外存调入资源了,这也就是为什么明明内存足够,却依然存在分页文件。

     

    有人就会说,既然现在的内存已经这么大了,能不能不使用虚拟内存这种内存管理技术?

    如果没有虚拟内存的话,那么我们在开发程序时,就需要考虑物理地址的对齐,内存碎片等一系列问题,使得程序开发变得极为困难,并且当程序需要的内存超过系统内存大小时,程序是无法启动过的。

     

    通过这种内存管理技术它使得应用程序认为它拥有连续的可用的内存(一个连续完整的地址空间),而实际上,它通常是被分隔成多个物理内存碎片,还有部分暂时存储在外部磁盘存储器上,在需要时进行数据交换。通过这种方式可以加快程序的运行速度,同时又做到了内存容量变大的效果。目前,大多数操作系统都使用了虚拟内存,如Windows家族的“虚拟内存”;Linux的“交换空间”等。当然资源频繁的调入和调出,势必会降低运行速度,让系统变得特别卡,这个时候就可以考虑加内存条了。

     

    总结:虚拟内存就是逻辑上的内存,它是一种内存管理技术,它管理逻辑地址到物理地址的映射,通过资源的调入和调出,达到了内存变大的效果,这是由操作系统来完成的。

               

  • 相关阅读:
    1-13Object类之toString方法
    jvm源码解读--16 锁_开头
    jvm源码解读--16 cas 用法解析
    jvm源码解读--15 oop对象详解
    jvm源码解读--14 defNewGeneration.cpp gc标记复制之后,进行空间清理
    jvm源码解读--13 gc_root中的栈中oop的mark 和copy 过程分析
    Error: Could not find or load main class ***
    使用javah 给.class类编译jni_helloworld.h文件头
    jvm源码解读--12 invokspecial指令的解读
    jvm源码解读--11 ldc指令的解读
  • 原文地址:https://www.cnblogs.com/mlgjb/p/8034447.html
Copyright © 2011-2022 走看看