内存管理

转: qemu-kvm内存管理

心已入冬 提交于 2019-12-16 20:06:22
记得很早之前分析过KVM内部内存虚拟化的原理,仅仅知道KVM管理一个个slot并以此为基础转换GPA到HVA,却忽略了qemu端最初内存的申请,而今有时间借助于qemu源码分析下qemu在最初是如何申请并管理虚拟机内存的,坦白讲,还真挺复杂的。 一、概述 qemu-kvm 模型下的虚拟化引擎,内存虚拟化部分要说简单也挺简单,在虚拟机启动时,有qemu在qemu进程地址空间申请内存,即内存的申请是在用户空间完成的。通过kvm提供的API,把地址信息注册到KVM中,这样KVM中维护有虚拟机相关的slot,这些slot构成了一个完成的虚拟机物理地址空间。slot中记录了其对应的HVA,页面数、起始GPA等,利用它可以把一个GPA转化成HVA,想到这一点自然和硬件虚拟化下的地址转换机制EPT联系起来,不错,这正是KVM维护EPT的技术核心。整个内存虚拟化可以分为两部分:qemu部分和kvm部分。qemu完成内存的申请,kvm实现内存的管理。看起来简单,但是内部实现机制也并非那么简单。本文重点介绍qemu部分。 二、涉及数据结构 qemu中内存管理的数据结构主要涉及:MemoryRegion、AddressSpace、FlatView、FlatRange、MemoryRegionSection、RAMList、RAMBlock、KVMSlot、kvm_userspace_memory

内存管理(13)——(c#) 销毁资源和释放内存

☆樱花仙子☆ 提交于 2019-12-16 18:40:57
0. 什么是资源? .NET 框架中如何访问资源? 所谓的资源就是程序中可利用的数据,譬如:字符串、图片和任何二进制数据,包括任何类型的文件。 在面向对象的环境中,每一个类型都标识为某些程序所用的资源,要想使用这些资源,必须为相应的类型分配一定的内存空间。 访问一个资源需要如下几个步骤: 1)分配内存空间: 调用中间语言(IL)中的newobj指令(使用new操作符时,将产生newobj指令),为某个特定资源的类型分配一定的内存空间。 2) 初始化内存: 一个类型的实例构造器负责这样的初始化工作。 3)使用资源: 通过访问类型成员来使用资源。根据需要会有反复。 4)销毁资源: 执行清理工作。 5)释放内存: 托管堆上的内存由GC全权负责, 值引用的在栈上的内存会随着栈空间的消亡而自动消失。 1. 什么是托管资源,非托管资源? 托管资源是由CLR全权负责的资源,CLR不负责的资源位非托管资源。 对于托管资源通过GC自动回收。 对于非托管资源GC管理,通过代码调用手动进行清除。 2. 什么是垃圾, 什么是垃圾回收? Net类型分为两大类,一个就是值类型,另一个就是引用类型。前者是分配在栈上,并不需要GC回收;后者是分配在堆上,因此它的内存释放和回收需要通过GC来完成, 那么只有被称为垃圾的对象才能被GC回收。也就是说,一个引用类型对象所占用的内存需要被GC回收,需要先成为垃圾。 那么

80道最新java基础部分面试题(七)

試著忘記壹切 提交于 2019-12-16 11:38:58
自己整理的面试题,希望可以帮到大家,需要更多资料的可以私信我哦,大家一起学习进步! 70、TreeSet里面放对象,如果同时放入了父类和子类的实例对象,那比较时使用的是父类的compareTo方法,还是使用的子类的compareTo方法,还是抛异常! (应该是没有针对问题的确切的答案,当前的add方法放入的是哪个对象,就调用哪个对象的compareTo方法,至于这个compareTo方法怎么做,就看当前这个对象的类中是如何编写这个方法的) 实验代码: public class Parent implements Comparable { private int age = 0; public Parent(int age){ this.age = age; } public int compareTo(Object o) { // TODO Auto-generated method stub System.out.println("method of parent"); Parent o1 = (Parent)o; return age>o1.age?1:age<o1.age?-1:0; } } public class Child extends Parent { public Child(){ super(3); } public int compareTo(Object o

第69课.技巧:自定义内存管理

落爺英雄遲暮 提交于 2019-12-16 10:19:21
1.统计对象中某个成员变量的访问次数 注意:对象(普通对象,只读对象) eg: #include <iostream> #include <string> using namespace std; class Test { int m_value; int * const m_pCount; public: Test(int value = 0) : m_pCount(new int(0)) { m_value = value; } int getValue() const { *m_pCount = *m_pCount + 1; return m_value; } void setValue(int value) { *m_pCount = *m_pCount + 1; m_value = value; } int getCount() const { return *m_pCount; } ~Test() { delete m_pCount; } }; int main() { // 普通对象 Test t; t.setValue(100); cout << "t.m_value = " << t.getValue() << endl; cout << "t.m_count = " << t.getCount() << endl; // 只读对象 const Test ct

操作系统-----第三章 内存管理

不问归期 提交于 2019-12-16 07:43:30
第三章 内存管理 文章目录 第三章 内存管理 @[toc] 1. 基础知识 (1). 逻辑地址和物理地址 2. 内存管理的概念 (1). 内存管理的内容 (2). 覆盖与交换 1). 覆盖技术 2). 交换技术 3. 连续分配管理方式 (1). 单一连续分配 (2). 固定分区分配 (3). 动态分区分配 4. 动态分区分配算法 (1). 首次适应算法 (2). 最佳适应算法 (3). 最坏适应算法 (4). 邻近适应算法 5. 基本分页存储管理 (1). 概念 (2). 实现地址的转换 (3). 快表 (4). 多级页表 6. 基本分段存储管理 (1). 概念 (2). 地址转换 (3). 和分页存储的对比 7. 段页式管理方式 (1). 概念 8. 虚拟内存 (1). 概念 (2). 页面置换算法 1). 最佳置换算法 2). 先进先出置换算法 3). 最近最久未使用置换算法 4). 时钟置换算法 5). 改进的时钟置换算法 1. 基础知识 (1). 逻辑地址和物理地址 ​ 物理地址是当前数据在整个计算机内存中的绝对位置,逻辑地址是指当前数据在本进程之内的偏移量地址. ​ 逻辑地址+进程首地址=物理地址 2. 内存管理的概念 (1). 内存管理的内容 内存空间的分配与回收 使用虚拟技术对内存空间进行扩充 将逻辑地址与物理地址进行转换 内存保护功能

Java内存管理-JVM内存模型以及JDK7和JDK8内存模型对比总结(三)

随声附和 提交于 2019-12-14 17:37:47
转载:https://www.jianshu.com/p/5b3717ff06ce 知识地图: 一、概述 Java的内存管理采用[自动内存管理]机制,因为这个自动管理机制,Java程序员就不需要去写释放内存的代码,而且不容易出现内存泄漏问题(比C/C++程序员少一些烦恼)。但是由于内存的申请和释放都交给了Java虚拟机,一旦出现内存泄漏和溢出问题时,在不了解Java虚拟机内存结构和自动管理机制的情况下,就很难排查问题的所在。所以如果想要成为一个优秀的程序员或者进阶为一个牛逼的架构师,掌握Java虚拟机的自动内存管理机制那是必须的。 二、JVM运行时数据区域 根据《Java虚拟机规范(Java SE 7版)》的规定,Java虚拟机所管理的内存将会包括以下几个运行时的数据区域:程序计数器(Program Counter Register)、Java栈(VM Stack)、本地方法栈(Native Method Stack)、方法区(Method Area)、堆(Heap)。 如图所示: 注:上图的虚拟机运行时数据区是Java虚拟机规范所规定的区域,不同的虚拟机有不同的实现。 上面图片有线程共享和线程隔离的区域,下面在通过一张图片来进行简单说明,让你更加清晰的理解什么是线程共享和什么是线程隔离。 通过上面的两个图,大概对JVM的内存模型有个初步的认识

【Linux】十问 Linux 虚拟内存管理

自闭症网瘾萝莉.ら 提交于 2019-12-14 01:16:39
Linux 的虚拟内存管理有几个关键概念: 每个进程有独立的虚拟地址空间,进程访问的虚拟地址并不是真正的物理地址 虚拟地址可通过每个进程上页表与物理地址进行映射,获得真正物理地址 如果虚拟地址对应物理地址不在物理内存中,则产生缺页中断,真正分配物理地址,同时更新进程的页表;如果此时物理内存已耗尽,则根据内存替换算法淘汰部分页面至物理磁盘中。 基于以上认识,这篇文章通过本人以前对虚拟内存管理的疑惑由浅入深整理了以下十个问题,并通过例子和系统命令尝试进行解答。 Linux 虚拟地址空间如何分布? 32 位和 64 位有何不同? malloc 是如何分配内存的? malloc 分配多大的内存,就占用多大的物理内存空间吗? 如何查看进程虚拟地址空间的使用情况? free 的内存真的释放了吗(还给 OS ) ? 程序代码中 malloc 的内存都有相应的 free ,就不会出现内存泄露了吗? 既然堆内内存不能直接释放,为什么不全部使用 mmap 来分配? 如何查看进程的缺页中断信息? 如何查看堆内内存的碎片情况? 除了 glibc 的 malloc/free ,还有其他第三方实现吗? 一.Linux 虚拟地址空间如何分布? 32 位和 64 位有何不同? Linux 使用虚拟地址空间,大大增加了进程的寻址空间,由低地址到高地址分别为: 只读段:该部分空间只能读,不可写,包括代码段、

【Linux】malloc 与共享内存原理区别

戏子无情 提交于 2019-12-14 01:15:06
本文主要分析内存以及I/O相关的系统调用和库函数的实现原理,根据原理给出在使用过程中需要注意的问题和优化的侧重点,本文涉及到的系统调用包括readahead,pread/pwrite,read/write,mmap,readv/writev,sendfile,fsync/fdatasync/msync,shmget,malloc。 本文先简单介绍应用程序对内存的使用以及I/O系统对内存的使用的基本原理,这对理解上述系统调用和库函数的实现有很大帮助。 1 内存管理基础 Linux对物理内存的管理是以页为单位的,通常页大小为4KB,Linux在初始化时为所有物理内存也分配了管理数据结构,管理所有物理页面。 每一个应用程序有独立的地址空间,当然这个地址是虚拟的,通过应用程序的页表可以把虚拟地址转化为实际的物理地址进行操作,虽然系统可以实现从虚拟地址到物理地址的转换,但并非应用程序的每一块虚拟内存都对应一块物理内存。Linux使用一种按需分配的策略为应用程序分配物理内存,这种按需分配是使用缺页异常实现的。比如一个应用程序动态分配了10MB的内存,这些内存在分配时只是在应用程序的虚拟内存区域管理结构中表示这一区间的地址已经被占用,内核此时并没有为之分配物理内存,而是在应用程序使用(读写)该内存区时,发现该内存地址对应得物理内存并不存在,此时产生缺页异常

Java多线程进阶—— J.U.C之atomic框架:Unsafe类

青春壹個敷衍的年華 提交于 2019-12-12 20:52:27
一、Unsafe简介 在正式的开讲 juc-atomic框架系列之前,有必要先来了解下Java中的Unsafe类。 Unsafe类,来源于 sun.misc 包。该类封装了许多类似指针操作,可以直接进行内存管理、操纵对象、阻塞/唤醒线程等操作。 Java本身不直接支持指针的操作,所以这也是该类命名为Unsafe的原因之一 。 J.U.C中的许多CAS方法,内部其实都是Unsafe类在操作 。 比如 AtomicBoolean 的 compareAndSet 方法: unsafe.compareAndSwapInt 方法是个native方法。(如果对象中的字段值与期望值相等,则将字段值修改为x,然后返回true;否则返回false): 入参的含义如下: 参数名称 含义 o 需要修改的对象 offset 需要修改的字段到对象头的偏移量(通过偏移量,可以快速定位修改的是哪个字段) expected 期望值 x 要设置的值 Unsafe类中CAS方法都是native方法,需要通过CAS原子指令完成 。在讲AQS时,里面有许多涉及CLH队列的操作,其实就是通过Unsafe类完成的指针操作。 二、Unsafe对象的创建 Unsafe是一个 final类 ,不能被继承,也没有公共的构造器,只能通过 工厂方法 getUnsafe 获得Unsafe的 单例 。 但是 getUnsafe

如何解决MemoryError

泪湿孤枕 提交于 2019-12-12 11:07:14
先解释一下:memory error的意思是内存超出,这里大家应该会疑惑,现在PC动辄就是8GB,16GB内存,怎么会超出呢,那是因为程序调用的东西太多,超过了最大使用内存,而不是程序本身。 下面说一下解决方法,网上有各种天花乱坠的技术帖,用什么块分法,numpy记忆提取什么的,对于新手而言难度极大,今天我就来说说最简单的一种:虚拟内存 虚拟内存大家肯定听说过,那么如何设置呢? 先打开控制面板 点击系统 点击高级系统 点击设置 点击高级 点击更改 取消自动管理 修改完成后即可 感谢https://blog.csdn.net/qq_43558971/article/details/90728473 来源: CSDN 作者: ?Junkai 链接: https://blog.csdn.net/Louise_Trender/article/details/103503804