虚拟内存

关于Mach-O类型文件那点事

白昼怎懂夜的黑 提交于 2020-01-12 22:14:12
Mach-O文件简介 Mach-O是一种文件格式,是Mach Object文件格式的缩写。 它通常应用于可执行文件,目标代码,动态库,内核转储等中。 Mach-O作为大部分基于Mach核心的操作系统所使用。 如:NeXTSTEP,Darwin和Mac OS X等系统使用这种格式作为其原生可执行文件,库和目标代码的格式。 在NeXTSTEP和Mac OS X中,可以将多个Mach-O文件组合进一个多重架构二进制文件中,以用一个单独的二进制文件支持多种架构的指令集。这种称为胖二进制文件(即:Fat binary文件)。 Mach-O文件类型众多,常见的一些Mach-O文件类型如下: MH_OBJECT 目标文件,平时.o结尾的文件 MH_EXECUTE 可执行文件,我们平时编译后的包中的执行文件 MH_DYLIB 一些动态库,该文件夹下很多/usr/lib/xxx.dylib MH_DSYM 符号文件,编译成功后XXX.app.dSYM Mach-O文件结构布局 Mach-O主要有三部分组成: Header 部分主要描述当前Mach-O文件什么架构,是否Fat二进制文件,CUP类型等等; Load commands 部分主要描述: 1.Mach-O文件中在虚拟内存中空间是如何分配的,从哪个内存地址开始到哪个内存地址结束。 2.不同段在Mach-O文件中的位置,大小分布。 Data

[转帖]OutOfMemoryError系列(6): Out of swap space?

谁说我不能喝 提交于 2020-01-10 09:42:32
OutOfMemoryError系列(6): Out of swap space? https://blog.csdn.net/renfufei/article/details/78136638 翻译 铁锚 发布于2017-09-29 19:15:56 阅读数 2030 收藏 展开 这是本系列的第六篇文章, 相关文章列表: OutOfMemoryError系列(1): Java heap space OutOfMemoryError系列(2): GC overhead limit exceeded OutOfMemoryError系列(3): Permgen space OutOfMemoryError系列(4): Metaspace OutOfMemoryError系列(5): Unable to create new native thread JVM启动参数指定了最大内存限制。如 -Xmx 以及相关的其他启动参数. 假若JVM使用的内存总量超过可用的物理内存, 操作系统就会用到虚拟内存。 错误信息 java.lang.OutOfMemoryError: Out of swap space? 表明, 交换空间(swap space,虚拟内存) 不足,是由于物理内存和交换空间都不足所以导致内存分配失败。 原因分析 如果 native heap 内存耗尽, 内存分配时, JVM

Linux 虚拟内存和物理内存的理解

血红的双手。 提交于 2020-01-07 12:11:15
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 首先,让我们看下虚拟内存: 第一层理解 1. 每个进程都有自己独立的4G内存空间,各个进程的内存空间具有类似的结构 2. 一个新进程建立的时候,将会建立起自己的内存空间,此进程的数据,代码等从磁盘拷贝到自己的进程空间,哪些数据在哪里,都由进程控制表中的task_struct记录,task_struct中记录中一条链表,记录中内存空间的分配情况,哪些地址有数据,哪些地址无数据,哪些可读,哪些可写,都可以通过这个链表记录 3. 每个进程已经分配的内存空间,都与对应的磁盘空间映射 Linux 使用虚拟地址空间,大大增加了进程的寻址空间, 由低地址到高地址分别为 : 只读段: 该部分空间 只能读,不可写 ;(包括: 代码段、rodata 段(C常量字符串和#define定义的常量) ) 数据段: 保存 全局变量、静态变量 的空间; 堆 : 就是平时所说的动态内存, malloc/new 大部分都来源于此。其中堆顶的位置可通过函数 brk 和 sbrk 进行动态调整。 文件映射区域 : 如 动态库、共享内存 等映射物理空间的内存,一般是 mmap 函数所分配的虚拟地址空间 。 栈: 用于维护函数调用的上下文空间,一般为 8M ,可通过 ulimit –s 查看。 内核虚拟空间: 用户代码不可见的内存区域,由内核管理

1g云主机升级centos8不满足centos 8 至少2g内存要求,linux虚拟内存来凑

人盡茶涼 提交于 2020-01-07 00:53:50
centos8 官方说,至少2g内存,推荐4g内存,像我的个人博客,zhoulujun.cn ,这种个人博客有不赚钱,丢个5美金一个月的1g内存,1核cpu,就够了。 强制升级到centos8,nginx 和php还好,其它程序,像mysql,经常崩溃。只有增加虚拟内存来凑数了 1g内存,虚拟内存的话,也就是物理内存的2倍左右,也就是设置2g的虚拟内存,一起3g内存。 free -m 查看内存,根据情况设置内存, dd if=/dev/zero of=/opt/swap bs=1024 count=2048000 chmod 600 /opt/swap mkswap /opt/swap swapon /opt/swap 最后查看内存设置情况 free -m 推荐文章: https://blog.csdn.net/herobacking/article/details/80371242%20%202048000 来源: https://www.cnblogs.com/zhoulujun/p/12159159.html

redis的内存陷阱

廉价感情. 提交于 2020-01-02 01:22:42
redis是个对内存依赖性很强的NoSql数据库,在内存足够的情况下性能出色 如果只有一台机子去部署redis,一定要特别小心。 比如我有台24G的服务器,理所当然我会将大量内存分配给redis。 比如20G的内存, 问题来了, 当你对redis插入数据后,redis会异步将数据dump到硬盘中 想起来很完美,问题是它会fork一个进程,并占去同样大小的内存,你需要的内存瞬间便为 20G+20G =40G 这时内存超过了物理内存的限制,马上会启动虚拟内存,我的机子上是8G虚拟内存,重点是这个是linux的虚拟内存,并不是redis自己的虚拟内存。 linux的虚拟内存 page很大,IO剧增,dump速度会非常慢,整个服务器的性能降到冰点,服务请求都会堵塞。最严重到机子坏掉。 对于单台机子最好是降低redis虚拟内存设置,page可以根据配置修改,这个虚拟内存比linux的虚拟内存好很多,因为page小很多。 如果你的redis既有读又有写,那么最好不要让redis占去大半的内存。 可以设置它的虚拟内存到8G,这还要根据你的key值大小的衡量,因为key是必须在内存中的,这样一来就算启用了虚拟内存,redis占去的实际内存也会超出设想。 天哪, 就是说必须给redis留出他本身需要一倍以上的内存,平时在不插入数据的时候,内存空着不用,浪费。 此外官方文档中建议对key小

LINUX虚拟地址空间总结

冷暖自知 提交于 2019-12-30 23:11:29
目录 1.虚拟内存空间解决了什么问题? 2.LINUX虚拟内存空间结构 3.页表 1.虚拟内存空间解决了什么问题? 闲谈:在研究虚拟地址空间,看到了一篇博客,说:在看到一项技术时,如果直接去看他的概念、用法、而忽视了他对比以前的技术有什么提升,解决了了以前技术中的哪些问题,这样是很不负责的。 正题:在计算机技术发展的早期,通常程序是直接访问物理地址的,只要程序需要的内存大小不超过物理内存空间大小就不会出错,我们就不用考虑内存管理这个麻烦的事。但现在我们能看到,我们周围的大多数计算机都是多进程运行。这时候问题就来了,假设现在物理内存有128M,1号进程需要10M进程,2号进程需要100M进程,3号进程需要20M进程,这时候我们可同时运行1,2号进程,1号进程占用0-10M内存地址,2号进程占用11-100的内存地址。这时候,如果还想运行3号进程,如果直接在物理内存上运行时,就不能实现了。于是乎,为了解决这个问题,产生了虚拟内存技术。暂时将不用的数据存储在硬盘中了。但这个方法也有一些缺点 物理内存不隔离:所有程序直接访问物理内存,如果有一些恶意代码,会非常容易干扰正常运行的其他代码。 内存使用效率低下:如果我们要像让程序1、2、3、同时运行,那么唯一的方法就是使用虚拟内存技术将一些程序暂时不用的数据写到磁盘上,在需要的时候再从磁盘读回内存。这里程序3要运行

操作系统第三章总结(2)/

早过忘川 提交于 2019-12-28 21:24:06
第三章 内存管理——虚拟内存 局部性原理:时间局部性(如果程序的某条指令/数据一旦执行,不久以后该指令/数据可能再次执行),空间局部性(访问了某一存储单元,不久之后附近的存储单元也会被访问) 时间局部性是通过近来使用的指令和数据保存到高速缓存存储器中,并使用高速缓存的层次结构实现。 空间局部性通常是使用较大的高速缓存,并预取机制集成到高速缓存控制逻辑中实现。 引入虚拟存储技术:提高系统的内存利用率和系统的吞吐量。 虚拟存储器:基于局部性原理,在程序装入时,可以将程序的一部分存入内存,其余留在外存,就可以启动程序执行,执行中,当访问信息不在内存时,系统调用调入内存,另一方面将暂不使用的内容换出外存,腾出空间,这样系统好像为用户提供了一个比实际内存大的多的存储器。 系统提供部分装入,请求调入和置换功能,虚拟存储器的大小由计算机的地址机构决定,并非是内存外存相加 虚拟存储器特性:离散性,多次性。对换性,虚拟性。 虚拟内存的实现需要建立离散分配的内存管理方式上。 虚拟内存的实现有三种方式,请求分页存储管理,请求分段存储管理,请求段页式存储管理。 虚拟内存需要硬件支持:一定的内存外存,页表机制或段表机制(主要的数据结构),中断机构(系统调用时候),地址变换机构(逻辑地址到物理地址) 请求分页的页表机制:页号,物理块号,状态位(是否调入内存),访问字段A(供置换算法换出页面参考),修改位M

Linux中Swap与Memory内存简单介绍

感情迁移 提交于 2019-12-28 19:48:18
1.背景介绍 这篇文章介绍一下Linux中swap与memory。对于memory没什么可说的就是机器的物理内存,读写速度低于cpu一个量级,但是高于磁盘不止一个量级。所以,程序和数据如果在内存的话,会有非常快的读写速度。但是,内存的造价是要高于磁盘的,虽然相对来说价格一直在降低。除此之外,内存的断电丢失数据也是一个原因说不能把所有数据和程序都保存在内存中。既然不能全部使用内存,那数据还有程序肯定不可能一直霸占在内存中。当内存没有可用的,就必须要把内存中不经常运行的程序给踢出去。但是踢到哪里去,这时候swap就出现了。 swap全称为swap place,即交换区 ,当内存不够的时候,被踢出的进程被暂时存储到交换区。当需要这条被踢出的进程的时候,就从交换区重新加载到内存,否则它不会主动交换到真实内存中。 2.swap介绍 在详细介绍swap之前,我们需要知道的是计算机对内存分为物理内存与虚拟内存(注意虚拟内存和虚拟地址空间的区别)。物理内存就是计算机的实际内存大小,由RAM芯片组成的。虚拟内存则是虚拟出来的、使用磁盘代替内存。虚拟内存的出现,让机器内存不够的情况得到部分解决。当程序运行起来由操作系统做具体虚拟内存到物理内存的替换和加载(相应的页与段的虚拟内存管理)。 这里的虚拟内存即所谓的swap 。 当用户提交程序,然后产生进程,在机器上运行

操作系统知识系列之基础篇

為{幸葍}努か 提交于 2019-12-26 08:34:34
一、操作系统概述 特性 1. 并发: 同一时间间隔内支持执行多个任务, 对于一个核则是交替执行; 2. 共享: 硬件资源或数据资源支持多个进程共享; 3. 异步: 并发情况下, 一个程序会陆陆续续被执行,完成时间不可预知; 4. 虚拟: 物理实体转化为逻辑实体,如虚拟内存。 基本功能 CPU管理:对处理器的管理和调度最终归结为对进程和线程的管理和调度,包括进程控制和管理,线程控制和管理,确定处理器调度策略,设计处理器调度算法,做好处理器分配和回收。 存储管理:存储管理的主要任务是管理内存资源,为多道程序运行提供有力支撑,提高存储空间利用率,具体来说有内存分配与回收,地址转换与存储保护,内存共享与存储扩充等。 设备管理:设备管理的除妖任务是管理各种外部设备,完成用户提出的I/O请求;加快数据传输速度,发挥设备的并行性,提高设备的利用率;提供设备驱动程序和中断处理请求。 文件管理:文件库案例的主要任务有提供文件逻辑组织方法,提供文件物理组织方法,提供文件存取和使用方法,实现文件目录管理,实现文件共享和安全性控制,实现文件存储空间管理等。 体系结构 大内核:将操作系统作为一个整体放在内核当中。 微内核:将操作系统的功能进行详细划分,只有微内核在内核态中存在,其他的在用户态。由于存在用户态和内核态的切换所以会影响系统整体性能。 补充 用户栈: 进程在用户空间时创建的栈

一篇文章讲清楚内存模型

删除回忆录丶 提交于 2019-12-20 21:18:26
https://sylvanassun.github.io/2017/10/29/2017-10-29-virtual_memory/ 概述 我们都知道一个进程是与其他进程共享CPU和内存资源的。正因如此,操作系统需要有一套完善的内存管理机制才能防止进程之间内存泄漏的问题。 为了更加有效地管理内存并减少出错,现代操作系统提供了一种对主存的抽象概念,即是虚拟内存(Virtual Memory)。 虚拟内存为每个进程提供了一个一致的、私有的地址空间,它让每个进程产生了一种自己在独享主存的错觉(每个进程拥有一片连续完整的内存空间) 。 理解不深刻的人会认为虚拟内存只是“使用硬盘空间来扩展内存“的技术,这是不对的。 虚拟内存的重要意义是它定义了一个连续的虚拟地址空间 ,使得程序的编写难度降低。并且, 把内存扩展到硬盘空间只是使用虚拟内存的必然结果,虚拟内存空间会存在硬盘中,并且会被内存缓存(按需),有的操作系统还会在内存不够的情况下,将某一进程的内存全部放入硬盘空间中,并在切换到该进程时再从硬盘读取 (这也是为什么Windows会经常假死的原因…)。 虚拟内存主要提供了如下三个重要的能力: 它把主存看作为一个存储在硬盘上的虚拟地址空间的高速缓存,并且只在主存中缓存活动区域(按需缓存)。 它为每个进程提供了一个一致的地址空间,从而降低了程序员对内存管理的复杂性。