虚拟内存

【译】让垃圾回收器高效工作(四)

六月ゝ 毕业季﹏ 提交于 2020-02-26 01:27:51
这篇文章我们来谈谈垃圾回收器和程序的虚拟内存、物理内存之间的关系。再谈谈怎样判断你的托管堆是否是健康的;为什么在机器还有大量内存的情况下程序会抛出OutofMemoryException。 垃圾回收和物理内存虚拟内存之间的关系: 如果你对这个话题已经了如指掌,请跳过这一段。 GC需要分配段,有关段的解释请参考《 让垃圾回收器高效工作(一) 》。GC调用VirtualAlloc来分配段空间。这意味着如果你的进程中没有足够的连续空间,分配就失败了。这是一种GC抛出OutOfMemeoryException的合法的情况(精确的说,GC没有抛出异常,抛出异常是执行引擎干的,GC只是在分配失败时返回了NULL)。 经常有人问我这样的问题:“为什么我程序的托管堆只使用了X MB的内存,运行时抛出了OutofMemoryException呢?” 其中XMB比2GB小得多。 记住在.Net程序中有一些内存不是GC消耗的。GC和其他一些东西一样是在竞争虚拟内存的空间。比如:你进程中载入的模块需要占用虚拟内存;有些模块直接调用本机代码分配内存也会消耗虚拟内存(VirtualAlloc,HeapAlloc,C++的new等等)。CLR本身也会有些不通过GC分配消耗的内存,比如jitted代码,一些CLR需要的数据结构等等。通常CLR需要的内存是相当小的。你可以通过SOS的

虚拟内存(摘自百度百科)

喜你入骨 提交于 2020-02-25 07:06:11
虚拟内存是计算机系统 内存管理 的一种技术。它使得 应用程序 认为它拥有连续的可用的 内存 (一个连续完整的 地址空间 ), 而实际上,它通常是被分隔成多个 物理内存 碎片,还有部分暂时存储在外部 磁盘存储器 上,在需要时进行 数据交换 。 简介 别称虚拟存储器(Virtual Memory)。电脑中所运行的程序均需经由 内存 执行,若执行的程序占用内存很大或很多,则会导致内存消耗殆尽。为解决该问题, Windows 中运用了虚拟内存 [1] 技术,即匀出一部分硬盘空间来充当内存使用。当内存耗尽时,电脑就会自动调用硬盘来充当内存,以缓解内存的紧张。若计算机运行程序或操作所需的 随机存储器 ( RAM )不足时,则 Windows 会用虚拟存储器进行补偿。它将计算机的RAM和 硬盘 上的临时空间组合。当RAM运行速率缓慢时,它便将数据从RAM移动到称为“ 分页 文件”的空间中。将数据移入分页文件可释放RAM,以便完成工作。 一般而言,计算机的RAM容量越大,程序运行得越快。若计算机的速率由于RAM可用空间匮乏而减缓,则可尝试通过增加虚拟内存来进行补偿。但是,计算机从RAM读取数据的速率要比从硬盘读取数据的速率快,因而扩增RAM容量(可加内存条)是最佳选择。    虚拟内存不足的成因   【1】、 感染病毒 :有些病毒发作时会占用大量内存空间,导致系统出现 内存不足 问题。   【2】

Linux命令行工具之free命令

蹲街弑〆低调 提交于 2020-02-21 07:24:35
原创转载请注明出处: https://www.cnblogs.com/agilestyle/p/11524691.html 使用 free 查看整个系统的内存使用情况 Note:不同版本的free输出可能会有所不同 第一列,total 是总内存大小; 第二列,used 是已使用内存的大小,包含了共享内存; 第三列,free 是未使用内存的大小; 第四列,shared 是共享内存的大小; 第五列,buffers是缓冲区的大小 第六列,cached是缓存的大小 使用 top 查看进程的内存使用情况 top 输出界面的顶端,也显示了系统整体的内存使用情况,这些数据跟 free 类似。接着看下面的内容,跟内存相关的几列数据,比如 VIRT、RES、SHR 以及 %MEM 等。 这些数据,包含了进程最重要的几个内存使用情况。 VIRT 是进程虚拟内存的大小,只要是进程申请过的内存,即便还没有真正分配物理内存,也会计算在内。 RES 是常驻内存的大小,也就是进程实际使用的物理内存大小,但不包括 swap 和共享内存。 SHR 是共享内存的大小,比如与其他进程共同使用的共享内存、加载的动态链接库以及程序的代码段等。 %MEM 是进程使用物理内存占系统总内存的百分比。 除了要认识这些基本信息,在查看 top 输出时,还要注意两点。 第一,虚拟内存通常并不会全部分配物理内存。从上面的输出

Linux线程栈内存总结

落爺英雄遲暮 提交于 2020-02-20 17:57:42
何为线程栈空间泄露? 何为anon内存? 虚拟内存、物理内存、anon内存的联系 anon与线程的联系 glibc源码库线程创建与销毁anon关系 使用pmap分析虚拟地址空间以及anon内存 何为线程栈空间泄露? 【栈空间泄露】:简单了说就是,创建了线程,系统分配了内存,但是由于异常操作,没有把之前申请的内存还给操作系统,缓存在进程中,导致这块的内存被占用,系统无法分配内存给其他进程。 从用户角度,线程创建后,未设置线程为detach属性,pthread_detach()、pthread_join()销毁函数。 从内存映射角度,在进程中缓存一些无法利用的anon内存。 从系统栈空间分配角度,这些运行结束但是未销毁的线程,既不放在stack_used队列里,也不放在stack_cache,从而线程栈空间不会被调度到。 何为anon内存? 仅个人观点,在操作系统上运行进程,其实是经过两次映射。一次是用户程序到系统配置器分配的虚拟内存申请,一次是虚拟地址空间到物理空间地址的映射,如果是第二次映射建立前,在申请物理空间,未填充物理页内容,建立映射后,仅仅代表已经分配了内存anon,ps:物理空间最小管理单元是“页”。 虚拟内存 操作系统给用户程序的假象地址,与物理内存建立映射关系。 物理内存 类似物理存储器DRAM anon内存 1.调用malloc、brk

物理内存和虚拟内存

十年热恋 提交于 2020-02-16 19:22:56
1.物理内存和虚拟内存 直接从物理内存读取数据比从硬盘读写数据要快得多,因此,我们希望所有的数据的读写在内存中完成,但是内存是有限的,这样就引出了物理内存与虚拟内存的概念。 物理内存是系统硬件提供的内存大小,是真正的内存。虚拟内存是为了满足物理内存不足而提出的策略,利用磁盘空间虚拟出一块逻辑内存,用作虚拟内存的磁盘空间称为交换空间。 作为物理内存的扩展,Linux未在物理内存不足时,使用交换分区的虚拟内存(内核将暂时不用的内存块信息写到交换空间,物理内存得到释放并能用于其他地方,当需要用到原始内容时,这些信息会被重新从交换空间读入物理内存)。 Linux的内存管理采取的是分页存取机制。为了保证物理内存能得到充分利用,内核在适当时候将物理内存中不经常使用的数据块自动交换到虚拟内存中,经常使用的信息保留到物理内存中。 2.深入了解Linux内存运行机制: 首先,Linux系统会不时地进行页面交换操作,以保持尽可能多的空闲物理内存。即使并没什么事情需要内存,Linux也会交换出暂时不用的内存页面,可以避免等待交换所需的时间。 Linux 进行页面交换时不是多有的页面在不用时都交换到虚拟内存中。Linux内核根据“最近经常使用”算法,仅仅将一些不经常使用的页面文件交换到虚拟内存中。有时我们会看到这么一个现象:Linux物理内存还有很多,但是交换空间也使用了很多

浅谈Windows虚拟内存

橙三吉。 提交于 2020-02-15 10:54:16
  本人电脑2G内存,写程序打开很多窗口电脑都能正常使用,就是一般看个2、3个小时的电影,电脑才会出现内存不足的情况,以前在学校也帮老师装过SqlServer2008,我老师的C盘不是盖的,可不是一般的小,他的是winXP系统,装sql时总报内存不足,我上网查了下资料,将其虚拟内存temp文件夹移到了D盘才勉强装上Sql,今天针对我的电脑Win7系统,从网上找了些资料,发现问题还挺大的,特地与大家分享....    1、何为虚拟内存?   内存在计算机中的作用很大,电脑中所有运行的程序都需要经过内存来执行,如果执行的程序很大或很多,就会导致内存消耗殆尽。为了解决这个问题,Windows运用了虚拟内存技术,即拿出一部分硬盘空间来充当内存使用,这部分空间即称为虚拟内存,虚拟内存在硬盘上的存在形式就是 PAGEFILE.SYS 这个页面文件。   虚拟内存只是真实内存不足的补充,所以不要加以神化,虚拟内存的读写性能(即硬盘的读写)只有真正内存性能的几十分之一,而且对硬盘损伤很大!能不用则不用,能少用则少用!原则是够用+留少量余量即可。    2、虚拟内存设置的误区   其一:虚拟内存越大越好?   答案:错。虚拟内存过大,既浪费了磁盘空间,又增加了磁头定位的时间,降低了系统执行效率,没有任何好处。正确设置可节省256MB-4G左右空间(视内存大小)   其二:虚拟内存不应该设在系统盘C盘

进程的相关概念

∥☆過路亽.° 提交于 2020-02-13 21:02:58
进程:程序的一个执行实例。担当分配系统资源的实体。 1. 进程的创造 当一个程序执行时,首先操作系统会创建一个 PCB ,将 所要执行的数据和代码和PCB一起构成进程 。还会为这个进程创造虚拟地址空间(虚拟内存),并创建与物理内存(真实内存)有映射关系的页表。当有多个进程时,会按照双向链表的方式连接起来。 值哪个 数据转移到物理内存中 首先所要执行的代码和数据经过PCB分配到虚拟地址空间的各个区域, 然后通过页表的映射规则将虚拟地址空间的数据和代码映射到物理内存上。 虚拟内存的相关知识: linux下的虚拟内存,页表,虚拟内存和物理内存的转换 2. 进程的执行 如果进程要执行,操作系统会将执行的进程另取出来作为队列中的一个,并将进程设置为 R (运行)状态,然后根据优先级和时间片来让队列中的每一个进程都放到CPU上执行,并将运算数据加载到CPU的寄存器上,如果一个进程的时间片到了,操作系统会将CPU的寄存器里的数据放到PCB中,同时PCB中还会保存CPU的PC指针所指向的地址,下次再执行该进程时,操作系统会将在PCB保存的数据再恢复到CPU的寄存器和PC指针,进而保证从上次结束的地方继续运行。 3. 进程的结束 进程执行完,操作系统会将进程设置为 Z (僵尸)状态并采集进程的相关信息, 采集完毕后,进程被设为 X (死亡)状态,继而进程结束。 来源: CSDN 作者: 森抛 链接:

安装苹果cms时提示不支持fileinfo解决方法

江枫思渺然 提交于 2020-02-10 14:03:05
苹果CMS安装时提示缺少fileinfo插件解决方法 一,我用的是宝塔软件 我们就以宝塔为例 1.打开宝塔面板找到-软件管理一项 2.选择你安装的PHP版本,打开设置我用的是7.2版本 你要看下自己的php版本 3.选择安装扩展,将缺少的插件安装一下就可以了 4,小于1G以下内存的服务器可以使用swap/虚拟内存,方法安装fileinfo扩展 swap是Linux下的虚拟内存,设置适当的swap可增加服务器稳定性 建议swap容量在真实内存容量的1.5倍左右,若您的服务器内存大于4GB,可设1-2GB的固定值 swap文件默认保存在/www/swap,设置前请确保磁盘空间够用 若您不需要swap,请将容量设为0 OVZ虚拟架构机器不可用此功能 宝塔面板操作步骤如下:软件商店----系统工具---linux工具箱设置 swap/虚拟内存 填写15000MB 即可。 二,直接修改php配置教程 1.打开配置文件,php-ini 查找到可以使用快捷键 ctrl+F 找到;extension=php_fileinfo.dll去掉前面分号保存重启即可 三,测试升级php版本至7.0+以上即可以解决插件不支持的问题。 声明:除特殊声明外本站文档均由作者原创,转载请注明出处,原文地址: 安装苹果cms时提示不支持fileinfo解决方法 来源: CSDN 作者: mytheme.cn 链接:

Linux增加虚拟内存方法

六眼飞鱼酱① 提交于 2020-02-07 19:22:43
在linux中,当物理内存mem不足时,就会使用虚拟内存(swap分区) 例如增加2G虚拟内存,操作如下: 1.查看内存大小 [root@gamedb ~]# free -m 2.创建要作为swap分区的文件:增加1GB大小的交换分区,则命令写法如下,其中的count等于想要的块的数量(bs*count=文件大小) [root@gamedb tmp]# dd if=/dev/zero of=/tmp/big_swap bs=1M count=1024 3.目录空间大小 [root@gamedb tmp]# du -sh /tmp/big_swap 4.格式化为交换分区文件 [root@gamedb tmp]# mkswap /tmp/big_swap #建立swap的文件系统 5.启用交换分区文件: [root@gamedb tmp]# swapon /tmp/big_swap #启用swap文件 6.查看下扩充后的内存 [root@gamedb tmp]# free –h 7.使系统开机时自启用,在文件/etc/fstab中添加一行: /root/swapfile swap swap defaults 0 0 8.关闭某个分区 来源: https://www.cnblogs.com/link01/p/12273943.html

【操作系统】第五章虚存技术

匆匆过客 提交于 2020-02-07 05:02:34
5.1虚拟内存的起因 理想中的存储器: 更大,更快,更便宜的非易性存储器 硬盘的速度远远的慢于内存的执行。 磁带比硬盘的存储容量更加的庞大。 现有的物理内存掉电之后数据还是会丢失的。 以上设计了三种技术: 1)手动覆盖技术:只把指令和数据保存在内存中 2)自动交换技术:将程序导出内存到硬盘上 3)虚拟内存技术(前两种是虚拟内存还没出现的情况下诞生的):以更小的力度把数据导出导入到内存中来,充分的利用了内存空间的手段 5.2覆盖技术 一、覆盖技术的基础 目标: 是在较小的可用内存中运行较大(相对而言的)的程序。常用与多道程序系统,与分区存储管理配合使用。 原理: 把程序按照其自身的逻辑结构,划分为若干个功能上相对独立的程序模块,那些不会同时执行的模块共享同一块内存区域,按时间先后来运行。 必要部分(常用功能)的代码和数据常驻内存; 可选部分(不常用内存)在其他程序模块中实现,平时存放在外存中,在需要用到时才装入内存; 不存在调用关系的模块不必同时装入到内存,从而可以相互覆盖,既这些模块共有一个分区。 二、应用例子 例子一: 1)bc是对等的,相互之间不会调用,所以分在一个区;A调用b的时候,c是不会执行的,所以只需要将b放在内存中即可。 2)def也是对等的,相互之间也不会调用,所以也分在一个区;当C调用e的时候,df通用是不会被调用的,所以也只需要将e放在内存中即可。 例子二: