1、brk释放内存和sbrk分配内存 #include<unistd.h> int brk(void *end_data_segment); 成功返回0,否则为-1 将内存边界设置为参数所指定位置 void *sbrk(intptr_t increment); 成功返回之前的内存边界,失败返回(void*)-1 增加内存边界,返回为新分配内存的起始位置(sbrk(0)就是获得堆位置) 使用的例子 #include <iostream> #include <unistd.h> using namespace std; int main() { int* phead; // 指向首位置 int* pnow; // 指向当前指针位置 pnow = sbrk(0); // 先分配空闲区域 phead = pnow; // 固定首位置不变 for(int i=2; i<10000; i++) { 继续阅读 >>


陈文浩 18/08/13 15:41:54
一、运行时的数据区域 程序计数器 程序计数器(Program Counter Register)是一块较小的内存空间,可以看作是当前线程所执行的字节码的行号指示器。每个线程都有一个独立的程序计数器,彼此间计数器互不影响,独立存储,即是“线程私有”的内存。 在虚拟机的概念模型里,字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令,分支、跳转、循坏、异常处理、线程恢复等基础功能都需要依赖这个计数器来完成。 当线程正在执行的是一个Java方法,这个计数器记录的是正在执行的虚拟机字节码指令的地址;如果执行的是Native方法,这个计数器的值则为空,此内存区域是唯一一个在Java虚拟机规范中没有规定任何OutOfMemoryError情况的区域。 Native关键字说明其修饰的方法是一个原生态的方法,方法对应的实现不是在当前文件,而是在用其他语言(入C、C++等)实现的文件。Java语言本身不能对操作系统底层进行访问和操作,但可以通过JNI(Java Native In 继续阅读 >>


李猛 18/08/08 08:20:41
一起来学习JVM吧 我们在学习C++的时候知道,每一个new操作都要对应相应的delete操作,否则会出现内存泄漏的问题,同理C语言的malloc和free也是如此。那么对于Java这门语言,我们却无需这样做,这一切都归结于JVM的强大,在虚拟机自动内存管理机制的帮助下,我们一般只需创建对象(申请内存),而不需要关注或者主动的销毁对象。不过,也正是因为我们把内存控制的权力交给了JVM,一旦出现内存泄漏和溢出方面的问题,如果不了解JVM如何使用内存,那么排查起来会异常困难。所以这篇博客就让我们来看看Java的内存区域~ JVM在执行Java程序的过程中会把它所管理的内存划分为JVM将内存主要划分为五个区域:方法区、Java堆、虚拟机栈、本地方法栈、程序计数器。如下如所示: 我们一个一个来看这些区域都有什么用途~ 程序计数器(Program Counter Register) 这是一块较小的内存空间,是当前线程所执行的字节码的行号指示器。字节码解释器工作时就是通过改变这个计数器的值来选取下一条 继续阅读 >>


贺含悦 18/07/27 01:18:40
0 内存管理概述 包括内存管理和虚拟内存管理。 内存管理包括:内存管理概念、交换与覆盖、连续分配管理方式和非连续分配管理方式(分页管理方式、分段管理方式、段页式管理方式)。 虚拟内存管理包括:虚拟内存概念、请求分页管理方式、页面置换算法、页面分配策略、工作集和抖动。 内存管理的概念 操作系统对内存的划分和动态分配 内存管理的功能 内存空间的分配与回收:由操作系统完成主存储器空间的分配和管理,使程序员摆脱存储分配的麻烦,提高编程效率。 地址转换:在多道程序环境下,程序中的逻辑地址与内存中的物理地址不可能一致,因此存储管理必须提供地址变换功能,把逻辑地址转换成相应的物理地址。 内存空间的扩充:利用虚拟存储技术或自动覆盖技术,从逻辑上扩充内存。 存储保护:保证各道作业在各自的存储空间内运行,.互不干扰。 1 存储器的层次结构 CPU 寄存器 寄存器 主存 高速缓存 主存 磁盘缓存 辅存 磁盘 可移动存储介质 寄存器,高速缓存,主存,磁盘缓存属于 继续阅读 >>


刘生玺 18/07/02 23:14:35
继承与动态内存分配 在基类或派生类中含有指针时,要考虑内存分配情况(new与delete),还要考虑在进行对象间赋值时指针隐藏的问题(使用默认复制构造函数在析构时会造成原对象中的指针指向的内存空间被释放,为浅复制) 因此需要: 1. 重载运算符’=‘、’<<‘,实现深度复制; 2. 在构造函数中使用new进行动态内存分配,在析构函数中使用delete进行内存释放; 3. 将析构函数声明为虚函数 在以下代码中还有一个小技巧来简化代码,即代码重用,在后续代码中使用已定义过的代码,例如:在C的构造函数中使用已经定义过的A的构造函数,这样就可以只对C类新增的数据部分进行初始化。 #include <iostream> #include <string> #include <cstring> using namespace std; class A { private: char *label; //使用指针,需要动态分配内存 继续阅读 >>


王良 18/05/16 23:37:26
这个我是感觉在思路上没有那么复杂啦,参考书上的提示应该能够自己写出来,就直接上代码了 #include<iostream> #include<memory> #include<utility> #include<string> #include<algorithm> //Equivalent to " vector<string> " class StrVec{ public: StrVec():elements(nullptr),frist_free(nullptr),cap(nullptr){ } StrVec( const StrVec & ) ; StrVec( const std::initializer_list<std::string> & ) ; StrVec& operator=( const StrVec & ) ; 继续阅读 >>


刘生玺 18/04/19 19:17:33
翻译自Spark官网文档,版本:2.3.0 spark内存管理概览 Spark很大一部分内存用于storage和execution,即存储和执行任务。execution memory指的是在shuffle,join,sorts,aggregation操作中使用的内存,storage memory指的是用于整个集群缓存数据和传播中间数据的内存。 spark中storage和execution分享一个统一的区域(M),当没有execution memory被使用,storage可以占用全部可用内存,反之亦然。storage占用execution memory时且有必要时execution可以驱逐storage,直到storage memory使用量低于一个阈值(R)。也就是说R描述了一个小于M的缓存区域,绝不会被驱逐。execution占用storage memory时因为实现复杂所以storage不会驱逐execution。 spark有两个相关配置项: 1. saprk.memory.frac 继续阅读 >>


高朴 18/04/09 23:30:55
buddy system简介: buddy system内存管理,努力让内存分配与相邻内存合并能快速进行(对于普通算法来讲,合并内存相当困难),它利用的是计算机擅长处理2的幂运算。 我们创建一系列空闲块列表,每一种都是2的倍数。 举个例子,如果最小分配单元是8字节,整个内存空间有1M。我们创建8字节内存块链表,16字节内存块链表,32字节内存块链表,64,128,256,512,1k,2K, 4K, 8K, 16K, 32K, 64K, 128K, 256K, 512K 和一个1M内存块链表。 除了1M内存块链表有一个可用单元,其余链表初始为空。所有的内存分配都会向上取整到2的倍数—-70K会向上取整到128K,15K会向上取整到16K,等等。 什么是Buddy buddy system允许一个被分配块单元平均拆分成两个大小是原来一半的块单元,这两个块单元互为伙伴。块B的伙伴必须满足大小跟块B一样大,并且内存地址相邻(才可以合并)。 另一个伙伴性质是所有块单元在内存中的地址必须能被它自 继续阅读 >>


楚东方 18/03/03 22:58:13
1. JVM的内存结构 JVM的内存结构主要是指Java程序在运行时的数据区的划分. 它主要由虚拟机栈, 本地方法栈, Java堆, 方法区, 程序计数器这五部分组成. 这五部分, 虚拟机栈/本地方法栈/程序计数器是线程私有的, Java堆和方法区是线程共享的. 下面我们就来逐一介绍一下这五部分. (1) 虚拟机栈 虚拟机栈是线程私有的, 所以它的生命周期与线程相同. 在Java程序的执行过程中, 每调用一个方法, 就会创建一个栈帧. 栈帧是描述Java方法执行的内存模型, 它用于存储局部变量表, 操作数栈, 动态链接, 方法出口等信息. 而每一个方法的调用到结束, 都对应着一个在虚拟机栈中从入栈到出栈的过程. 在虚拟机栈中, 最重要的就是局部变量表. 局部变量表 局部变量表存放了编译器可知的八种基本数据类型, 对象引用(引用类型), returnAddress类型(指向了一条字节码指令的地址). double和long类型的数据会占用两个局部变量空间, 其余的数据类型只占1个. 局 继续阅读 >>


祝一迪 18/02/07 00:04:03
32 位的平台上,线性地址空间为固定的 4GB,并且由于采用了保护机制,Linux内核将这 4GB 分为两部分,线性地址较高的 1GB(0xC0000000 到 0xFFFFFFFF )为共享的内核空间;而较低的 3GB 为每个进程的用户空间。由于每个进程都不能直接访问内核空间,而是通过系统调用间接进入内核,因此所有的进程都共享内核空间。而每个进程都拥有各自的用户空间,各个进程之间不能互相访问彼此的用户空间。 一个进程的用户地址空间主要由两个数据结构来描述。一个是 mm_struct 结构,它对进程的整个用户空间进行描述,简称内存描述符;另一个是 vm_area_struct 结构,它对用户空间中各个区间( 代码区、数据区等 )进行描述。 进程用户空间的描述 内存描述符 每个进程只有一个 mm_struct 结构,在每个进程的 task_struct 结构中,有一个指向该结构的指针。 struct mm_struct { struct vm_area_struct *m 继续阅读 >>


杜肖孟 17/12/10 14:47:55