物理内存

Linux内存简单汇总

我的未来我决定 提交于 2019-11-27 18:48:21
Linux内存主要用来存储系统和应用程序的指令,数据,缓存等 一,内存映射 1,内核给每个进程提供一个独立的虚拟机地址空间,并且这个地址空间是连续的 2,虚拟地址空间内部又被分为内核空间和用户空间 3,32位和64位系统的虚拟地址空间 32 位系统的内核空间占用 1G,位于最高处,剩下的 3G 是用户空间。而 64 位系统的内核空间和用户空间都是 128T,分别占据整个内存空间的最高和最低处,剩下的中间部分是未定义的 4,进程在用户态时,只能访问用户空间内存;只有进入内核态后,才可以访问内核空间内存 5,只有实际使用的虚拟内存才会被分配物理内存,通过内存映射来管理 6, 内存映射 ,就是将虚拟内存地址映射到物理内存地址。为了完成内存映射,内核为每个进程都维护了一张 表,记录虚拟地址与物理地址的映射关系 7, 页表 存储在内存管理单元 [MMU]( https://blog.csdn.net/u010442934/article/details/79900449 ) 中 8,进程访问虚拟地址在页表中查不到时,系统会产生一个 缺页异常 9,TLB(Translation Lookaside Buffer,转译后备缓冲器)会影响 CPU 的内存访问性能 ,TLB是MMU中页表的高速缓存,。于进程的虚拟地址空间是独立的,而 TLB 的访问速度又比 MMU 快得多,所以

/dev/mem

半腔热情 提交于 2019-11-27 10:27:36
linux 内核为用户提供了一个/dev/mem的驱动程序,使用户直接访问系统物理内存成为可能,利用mmap和/dev/mem可以建立起直接读写系统物理内存的渠道。 /dev/mem是linux下的一个字符设备,源文件是kernel/drivers/char/mem.c,这个设备文件是专门用来读写物理地址用的。里面的内容是所有物理内存的地址以及内容信息。通常只有root用户对其有读写权限。源引网络资源对/dev/mem是这么评价的“/dev/mem是个好玩的东西,你竟然可以直接访问物理内存,这在linux下简直太神奇了,就想一个小偷想偷银行,可是发现银行戒备森严,正在小偷苦无对策的时候,突然发现银行有个后门,而且这个后门直通银行的金库。” 来源: https://www.cnblogs.com/yangxingsha/p/11359539.html

linux应用问题分析命令

核能气质少年 提交于 2019-11-27 09:59:09
1. 描述 应用问题分析方式及命令有很多,一般都结合着使用,今天主要介绍下: (1)top命令,实时查看服务器资源使用情况,类似windows下的资源管理器; (2)tail命令,实时刷新查看日志命令。 2. top命令 top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况。 2.1 命令用法 top //默认每隔5秒,显示所有进程的资源占用情况 top -d 2 //每隔2秒,显示所有进程的资源占用情况 top -c //每隔5秒,显示所有进程的资源占用情况,-c重点是能看到命令行参数名称(比如java项目,不加-c的话只有java,增加-c的话,能看到具体执行参数,i'm 软件老王) 2.2 top显示信息说明 (1)第一行就不说了,没啥意思; (2)第二行, 显示的是进程汇总信息,其中: total 进程总数 running 正在运行的进程数 sleeping 睡眠的进程数 stopped 停止的进程数 zombie 僵尸进程数 (3)第三行,显示的是cpu使用情况,其中: 0.2% us 用户空间占用CPU百分比 0.2% sy 内核空间占用CPU百分比 0.0% ni 用户进程空间内改变过优先级的进程占用CPU百分比 99.6% id 空闲CPU百分比 0.0% wa 等待输入输出的CPU时间百分比 0.0%hi:硬件CPU中断占用百分比

Linux监控工具介绍系列——smem

强颜欢笑 提交于 2019-11-27 09:02:16
smem工具介绍 smem是Linux系统上的一款可以生成多种内存耗用报告的命令行工具。与现有工具不一样的是smem可以报告实际使用的物理内存(PSS),这是一种更有意义的指标。可以衡量虚拟内存系统的库和应用程序所占用的内存数量。 由于大部分的物理内存通常在多个应用程序之间共享,名为实际使用物理内存(RSS)的这个标准的内存耗用衡量指标会大大高估内存耗用情况。PSS这个参数而是衡量了每个应用程序在每个共享内存区中的“公平分配”,给出了一个切合实际的衡量指标。 smem有许多功能特性: 系统概况列表 按进程、映射和用户列表 按用户、映射或用户过滤 来自多个数据源的可配置列 可配置的输出单位和百分比 可配置的标题和总和 从/proc读取活动数据 从目录镜像或经过压缩的打包文件读取数据快照 面向嵌入式系统的轻型捕获工具 内置的图表生成功能 smem的系统要求 系统内核为2.6.27以上 Python版本必须为2.4或以上 依赖matplotlib库生成图表(可选的,自动检测)依赖matplotlib,是因为smem除了一般的文本信息报告外,smem 也可以生成条状或饼状图。 对应的英文原文如下: smem is a tool that can give numerous reports on memory usage on Linux systems. Unlike existing

linux下的缓存机制 buffer/cache/swap

匆匆过客 提交于 2019-11-27 08:53:18
一、缓存机制介绍 缓存用途:在Linux系统中,为了提高文件系统性能,内核利用一部分物理内存分配出缓冲区,用于缓存系统操作和数据文件,当内核收到读写的请求时,内核先去缓存区找是否有请求的数据,有就直接返回,如果没有则通过驱动程序直接操作磁盘。 缓存机制优点 :减少系统调用次数,降低CPU上下文切换和磁盘访问频率。 CPU上下文切换 :CPU给每个进程一定的服务时间,当时间片用完后,内核从正在运行的进程中收回处理器,同时把进程当前运行状态保存下来,然后加载下一个任务,这个过程叫做上下文切换。实质上就是被终止运行进程与待运行进程的进程切换。 Swap用途 :Swap意思是交换分区,通常我们说的虚拟内存,是从硬盘中划分出的一个分区。当物理内存不够用的时候,内核就会释放缓存区(buffers/cache)里一些长时间不用的程序,然后将这些程序临时放到Swap中,也就是说如果物理内存和缓存区内存不够用的时候,才会用到Swap。 swap清理:swapoff -a && swapon -a Swap清理命令有个前提条件,空闲的内存必须比已经使用的swap空间大。 二、查看缓存区及内存使用情况 可以用 free 命令查看缓存区与内存的使用情况,通过free后缀不同可以看到不同的单位,包括free -m以兆为单位,free -g以GB为单位, free -k则以Kb为单位。 Mem

java.lang.OutOfMemoryError:GC overhead limit exceeded

萝らか妹 提交于 2019-11-27 07:26:05
在调测程序时报 java.lang.OutOfMemoryError:GC overhead limit exceeded 错误 错误原因:在用程序进行数据切割时报了该错误。由于在本地执行数据切割测试的时候,数据量较小,并没有发生异常, 可以正常执行。由于在现网的数据库的数据量较大,在切割一张数据库表数据时,数据量有四千多万条,程序执行的逻辑是 先将其查询出来放入集合当中,然后批量插入,由于数据量太大,new了一个集合容纳不了,就会报内存溢出的错误。在网上 查了以后,列出一下的解决方案: 第一个方法:分批次查询,分批次入库,将集合的数据量固定在一万条左右,每次操作一万条数据,分批次操作 第二个方法:设置虚拟机内存大小,方法如下: 解决办法: 1、增加参数,-XX:-UseGCOverheadLimit 2、增加heap大小 在catalina.bat最前面加入set JAVA_OPTS=-Xms512m -Xmx1024m 解释一下各个参数: -Xms1024M:初始化堆内存大小(注意,不加M的话单位是KB) -Xmx1029M:最大堆内存大小 -XX:PermSize=256M:初始化类加载内存池大小 -XX:MaxPermSize=256M:最大类加载内存池大小 -XX:MaxNewSize=256M:tomcat对自身堆栈的新的最大的分配;当tomcat内存不足时,调用此分配

linux内存

两盒软妹~` 提交于 2019-11-27 05:27:25
1 内存寻址 1.1 物理地址、虚拟地址以及线性地址 物理地址: 物理内存的内存单元地址 虚拟地址: 程序员看到的内存空间定义未虚拟地址,intel X86 CPU寻址使用了段机制,最初的8086中有4个16位的段寄存器:CS、DS、SS、ES,分别用于存放可执行代码的代码段、数据段、堆栈段和其他段的基地址,解决了CPU数据总线16位寻址20位数据地址空间的问题。 虚拟地址一般用“段:偏移量”的形式来描述,比如在8086中A815:CF2D就代表段首地址为A815,段内偏移位为CF2D的虚地址。 线性地址: 是指一段连续的,不分段的,范围为0到4GB的地址空间,一个线性地址就是线性地址空间的一个绝对地址。 寻址模式有2种: 实模式: 是 段地址+偏移量 的方式,得到物理地址;如当程序执行“mov ax,[1024]”这样一条指令时,在8086的实模式下,把某一段寄存器(比如ds)左移4位,然后与16位的偏移量(1024)相加后被直接送到内存总线上,这个相加后的地址就是内存单元的物理地址,而程序中的地址(例如ds:1024)就叫虚拟地址 保护模式:不 允许通过段寄存器取值得到段的起始地址,而是把虚拟地址转进一个 MMU 的硬件,经过额外的转换和检查,进而得到一个物理地址,如下图所示: 保护模式下寻址 MMU是一种硬件电路,它包含两个部件,一个是分段部件,一个是分页部件

Android底层内存回收机制介绍

大兔子大兔子 提交于 2019-11-27 02:41:21
Android底层基于Linux内核开发.随着Android版本不断更新,内存回收机制也在不断变化.本文简要介绍下不同版本下的内存回收原理. Linux OOM机制 OOM(out of memory)是linux中内存管理机制的一种,在系统可用内存较少的情况下,内核为了保证系统还能够继续运行下去,会选择杀掉一些进程释放掉一些内存.通常oom_killer的触发流程是: 进程A想要分配物理内存->粗发缺页异常-> 内核去分配物理内存-> 物理内存不足-> OOM. 当OOM发生时,可以有两种选择: kernelpanic(死机) 启动oom_killer,遍历当前所有进程,根据进程的内存使用情况进行打分,然后从中选择一个分数最高进程杀掉,从而回收内存 主要处理流程 调用oom_killer前,系统会对oom_control做一个填充: pagefault_out_of_memory(void) { struct oom_control oc = { .zonelist = NULL, .nodemask = NULL, .memcg = NULL, .gfp_mask = 0, .order = 0, }; ... out_of_memory(&oc); } oom_killer的处理主要集中在 mm/oom_kill.c 核心函数为 out_of_memory bool out

Android内存管理、监测剖析

喜欢而已 提交于 2019-11-27 02:03:58
Android内存管理机制 Android内存管理主要有:LowMemory Killer机制,Ashmem,PMEM/ION及Native内存和Dalvik内存管理管理和JVM垃圾回收机制。 LowMemory Killer机制 源码位置drivers/staging/Android/lowmemorykiller.c Android是一个多任务系统,也就是说可以同时运行多个程序,这个大家应该很熟悉。一般来说,启动运行一个程序是有一定的时间开销的,因此为了 加快运行速度,当你退出一个程序时,Android并不会立即杀掉它,这样下次再运行该程序时,可以很快的启动。随着系统中保留的程序越来越多,内存肯定 会出现不足,low memory killer就是在系统内存低于某值时,清除相关的程序,保障系统保持拥有一定数量的空闲内存。 Low memorykiller根据两个原则,进程的重要性和释放这个进程可获取的空闲内存数量,来决定释放的进程。 进程的重要性,由task_struct->signal_struct->oom_adj决定, Android将程序的重要性分成以下几类,按照重要性依次降低的顺序,每个程序都会有一个oom_adj值,这个值越小,程序越重要,被杀的可能性越低: 除了上述程序重要性分类之外,Android系统还维护着另外一张表minfree用于维护内存警戒值

虚拟内存

爷,独闯天下 提交于 2019-11-27 01:13:16
1、虚拟内存解决什么问题? 2、程序必须运行在物理内存上。每个程序运行需要一些内存,在32位机上,程序可以使用的内存为4G,实际需要的内存没有这么多。在32位机上,可使用的物理内存为4G,操作系统使用1个多G,留给应用程序的只有2G多。要运行很多应用程序,显然不够。怎么办? 3、操作系统提供一层封装,当然CPU也要支持。也就是说,让应用程序觉得,它有一块可以使用的物理内存(最多可使用4G),而且这些物理内存是连续的。而实际情况呢? 4、实际上,这块内存对应的是 一些物理内存碎片,和一些磁盘(保存临时数据,需要的时候,数据交换到物理内存)。因此,才叫虚拟内存。 转载于:https://www.cnblogs.com/nzbbody/p/4391678.html 来源: https://blog.csdn.net/weixin_30856725/article/details/99234784