内存碎片

堆和栈的区别

谁说胖子不能爱 提交于 2020-01-16 05:30:07
一、预备知识—程序的内存分配 一个由C/C++编译的程序占用的内存分为以下几个部分 1、栈区(stack) 由编译器自动分配释放,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。 2、堆区(heap) 一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表。 3、全局区(静态区)(static) 全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。程序结束后由系统释放。 4、文字常量区 常量字符串就是放在这里的。程序结束后由系统释放 5、程序代码区 存放函数体的二进制代码。 二、例子程序 这是一个前辈写的,非常详细 //main.cpp int a = 0; //全局初始化区 char *p1; //全局未初始化区 main() { int b; //栈 char s[] = "abc"; //栈 char *p2; //栈 char *p3 = "123456"; //123456\0在常量区,p3在栈上。 static int c =0; //全局(静态)初始化区 p1 = (char *)malloc(10); p2 = (char *)malloc(20); //分配得来得10和20字节的区域就在堆区。

堆和栈的区别

旧时模样 提交于 2020-01-16 05:29:37
先简短的总结一下,这几天知识点吧 时间复杂度上:一般1e8是内部算法或结构是线性的,1e6的内部可为nlogn的算法; 空间估计:主函数内的局部变量是用栈存储的,有栈顶及栈大小的规定极易溢出。一般申请1M空间,int型数组250000左右。而全局(静态)变量存储在堆中,可以申请很大的空间。 下面是专业介绍,讲的很好啊! 一、预备知识—程序的内存分配 一个由C/C++编译的程序占用的内存分为以下几个部分 1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其 操作方式类似于数据结构中的栈。 2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回 收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵。 3、全局区(静态区)(static)—,全局变量和静态变量的存储是放在一块的,初始化的 全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另 一块区域。 - 程序结束后由系统释放。 4、文字常量区 —常量字符串就是放在这里的。 程序结束后由系统释放 5、程序代码区—存放函数体的二进制代码。 二、例子程序 这是一个前辈写的,非常详细 //main.cpp int a = 0; 全局初始化区 char *p1; 全局未初始化区 main() { int b; 栈 char s[] =

C++堆和栈的区别和联系

匆匆过客 提交于 2020-01-16 05:28:17
参考博客地址:http://blog.csdn.net/hairetz/article/details/4141043 http://blog.csdn.net/handsomesunshineboy/archive/2010/07/14/5734922.aspx C++中,内存分为5个区:堆、栈、自由存储区、全局/静态存储区和常量存储区。 栈:是由编译器在需要时自动分配,不需要时自动清除的变量存储区。通常存放局部变量、函数参数等。 堆:是由new分配的内存块,由程序员释放(编译器不管),一般一个new与一个delete对应,一个new[]与一个delete[]对应。如果程序员没有释放掉, 资源将由操作系统在程序结束后自动回收。 自由存储区:是由malloc等分配的内存块,和堆十分相似,用free来释放。 全局/静态存储区:全局变量和静态变量被分配到同一块内存中(在C语言中,全局变量又分为初始化的和未初始化的,C++中没有这一区分)。 常量存储区:这是一块特殊存储区,里边存放常量,不允许修改。 (注意:堆和自由存储区其实不过是同一块区域,new底层实现代码中调用了malloc,new可以看成是malloc智能化的高级版本) 一. 堆与栈的讨论: 管理方式:堆中资源由程序员控制(容易产生memory leak), 栈资源由编译器自动管理,无需手工控制。 系统响应:对于堆

C++ 栈和堆的区别

房东的猫 提交于 2020-01-16 05:27:04
    C++中的存储区分为全局数据区、代码区、堆、栈。   全局数据区存放静态数据、全局变量、常量。   代码区存放所有类成员函数和非成员函数的代码。   栈区存放用于函数的返回地址、形参、局部变量、返回类型。   堆区存放余下的内存(new和delete)。   堆和栈的区别: 1、申请方式不同:栈是系统自动分配,堆是程序员申请。 2、系统响应不同:   栈:只要栈的剩余空间大于所申请的空间,系统就会为程序提供内存,否则栈溢出。     堆:系统收到申请空间的请求后,会遍历一个操作系统用于记录内存空闲地址的链表,当找到一个空间大于所申请空间的堆结点后,就会为该结点从记录内存空闲地址的链表中删除,并将该结点的内存分配给程序,然后在这块内存区域的首地址处记录分配的大小,这样我们在使用delete来释放内存的时候,delete才能正确地识别并删除该内存区域的所有变量。另外,我们申请的内存空间与堆结点的内存空间不一定相等,这是系统会自动将堆结点上多出来的那部分内存空间回收到空闲链表中。 3、空间大小不同:栈是一块连续的区域,大小一般是1~2M;堆是不连续的区域,空间很大,上限取决于有效的虚拟内存。 4、碎片问题:栈是后进先出的队列,内存是连续的,而堆则在多次的new和delete后会产生很多碎片。 5、生长方向:栈是向下,堆是向上。 6、分配方式:堆是动态分配,没有静态分配

内存堆和栈的区别

本小妞迷上赌 提交于 2020-01-16 05:19:17
在计算机领域,堆栈是一个不容忽视的概念,我们编写的C语言程序基本上都要用到。但对于很多的初学着来说,堆栈是一个很模糊的概念。 堆栈:一种数据结构、一个在程序运行时用于存放的地方,这可能是很多初学者的认识,因为我曾经就是这么想的和汇编语言中的堆栈一词混为一谈。我身边的一些编程的朋友以及在网上看帖遇到的朋友中有好多也说不清堆栈,所以我想有必要给大家分享一下我对堆栈的看法,有说的不对的地方请朋友们不吝赐教,这对于大家学习会有很大帮助。 数据结构的栈和堆 首先在数据结构上要知道堆栈,尽管我们这么称呼它,但实际上堆栈是两种数据结构:堆和栈。 堆和栈都是一种数据项按序排列的数据结构。 栈就像装数据的桶或箱子 我们先从大家比较熟悉的栈说起吧,它是一种具有 后进先出 性质的数据结构,也就是说后存放的先取,先存放的后取。 这就如同我们要取出放在箱子里面底下的东西(放入的比较早的物体),我们首先要移开压在它上面的物体(放入的比较晚的物体)。 堆像一棵倒过来的树 而堆就不同了,堆是一种 经过排序的树形数据结构 ,每个结点都有一个值。 通常我们所说的堆的数据结构,是指二叉堆。 堆的特点是根结点的值最小(或最大),且根结点的两个子树也是一个堆。 由于堆的这个特性,常用来实现优先队列,堆的存取是随意,这就如同我们在图书馆的书架上取书,虽然书的摆放是有顺序的,但是我们想取任意一本时不必像栈一样

Linux服务器性能评估

别等时光非礼了梦想. 提交于 2020-01-14 09:52:32
导语 总结有关服务器的各项性能指标,以及如何判断服务器的性能状况出现问题,性能指标代表的含义。同时也总结Linux服务器上有关工具的各项参数含义,以及日常需要注意的参数信息。 CPU使用率和负载 首先需要分清楚 CPU使用率和机器负载 不是相同的概念,如果 CPU使用率 ,但是不一定代表机器负载同样也高。所以关于 CPU使用率和负载 的区别: CPU使用率:显示的是程序在运行期间占用的CPU百分比; CPU负载:显示的是一段时间内正在使用和等待使用的CPU平均任务数; 查看CPU使用率和负载 对于查看负载可以使用uptime,w命令,同时top,vmstat工具也可以同时观察CPU使用率和负载情况。 查看CPU核数: grep "model name" /proc/cpuinfo | wc -l uptime命令: 命令返回信息中的load average就是关于系统的平均负载,里面的三个数字分别代表着1分钟、5分钟、15分钟内的系统平均负载。 top工具 (如果是多核CPU,1查看各个CPU详细信息) top工具的第一行后面的三个值,分别也是代表之前的 1、5、15 分钟内的平均负载; 第三行关于CPU使用率各项参数的含义: (us)user:CPU在低nice值(高优先级)用户态所占用的时间;(大部分CPU时间都在执行此类程序) (sy)sytem:CPU处于内核所占用的时间

C/C++程序内存的分配

梦想的初衷 提交于 2020-01-13 23:15:52
转自: https://blog.csdn.net/cherrydreamsover/article/details/81627855 转载出处: 学习笔记 一、一个C/C++编译的程序占用内存分为以下几个部分: 栈区(stack):由编译器自动分配与释放,存放为运行时函数分配的局部变量、函数参数、返回数据、返回地址等。其操作类似于数据结构中的栈。 堆区(heap):一般由程序员自动分配,如果程序员没有释放,程序结束时可能有OS回收。其分配类似于链表。 全局区(静态区static):存放全局变量、静态数据、常量。程序结束后由系统释放。全局区分为已初始化全局区(data)和未初始化全局区(bss)。 常量区(文字常量区):存放常量字符串,程序结束后有系统释放。 代码区:存放函数体(类成员函数和全局区)的二进制代码。 二、三种内存分配方式 从静态存储区分配 内存在程序编译的时候已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量,static变量。 在栈上创建 在执行函数时,函数内局部变量的存储单元可以在栈上创建,函数执行结束时,这些内存单元会自动被释放。 栈内存分配运算内置于处理器的指令集,效率高,但是分配的内存容量有限。 从堆上分配 亦称为动态内存分配。 程序在运行的时候使用malloc或者new申请任意多少的内存,程序员自己负责在何时用free或delete释放内存。

jvm性能调优

99封情书 提交于 2020-01-13 07:46:51
一、JVM内部结构 ​ 程序计数器 类似于PC寄存器,是一块较小的内存区域,通过程序计数器中的值寻找要执行的指令的字节码,由于多线程间切换时要恢复每一个线程的当前执行位置,所以每个线程都有自己的程序计算器。这一个区域不会有OutOfMemeryError。当执行Java方法时,这里存储的执行的指令的地址,如果执行的是本地方法,这里的值是Undefined。 栈 虚拟机栈也是线程私有的,每创建一个线程,虚拟机就会为这个线程创建一个虚拟机栈,虚拟机栈表示Java方法执行的内存模型,每调用一个方法,就会生成一个栈帧(Stack Frame)用于存储方法的本地变量表、操作栈、方法出口等信息,当这个方法执行完后,就会弹出相应的栈帧。 如果请求的栈的深度过大,虚拟机可能会抛出StackOverflowError异常,如果虚拟机的实现中允许虚拟机栈动态扩展,当内存不足以扩展栈的时候,会抛出OutOfMemoryError异常。 堆 如果垃圾收集算法采用按代收集(目前大都是这样),这部分还可以细分为新生代和老年代。 新生代又可能分为Eden区,From Survivor区和To Survivor区,主要是为了垃圾回收。所有的线程共享Java堆,在这里还可以划分线程私有的缓冲区(Thread Local Allocation Buffer,TLAB)。Java堆只要求逻辑上是连续的

HBase环境搭建随记

别等时光非礼了梦想. 提交于 2020-01-12 06:41:28
====软件版本==== jdk:jdk-8u77-linux-x64.tar.gz zookeeper:zookeeper-3.4.6.tar.gz hadoop:hadoop-2.7.4.tar.gz hbase:hbase-1.3.1-bin.tar.gz ====前提准备==== 3台vmware虚拟机(已配置无秘钥访问) 其中,/etc/hosts文件内容如下: ====安装jdk==== 上传安装包,解压缩,然后配置环境变量即可。 正常配置之后,在服务器任意路径执行java -version可以显示java版本。如下所示。 ====安装zookeeper==== 这里也不在过多描述,简单罗列一下配置文件。 配置文件:zoo.cfg 需要分别在3个节点的,dataDir路径下生成节点的myid。 启动并验证zookeeper是否正常 启动命令:/home/hadmin/zookeeper-3.4.6/bin/zkServer.sh start 查看状态:/home/hadmin/zookeeper-3.4.6/bin/zkServer.sh status 启动之后,3个节点的状态分别如下: ====安装hadoop==== 因为HBase的底层是基于Hadoop的hdfs的,所以在安装HBase之前,必须要安装Hadoop,并确保hdfs正常。

jvm的那些设置参数你都知道吗

北慕城南 提交于 2020-01-12 05:11:52
前言 大家都知道,jvm在启动的时候,会执行默认的一些参数。一般情况下,这些设置的默认参数应对一些平常的项目也够用了。但是如果项目特别大了,需要增加一下堆内存的大小、或者是系统老是莫明的挂掉,想查看下gc日志来排查一下错误的原因,都需要咱们手动设置这些参数。 各个参数介绍 1.verbose:gc 表示,启动jvm的时候,输出jvm里面的gc信息。格式如下: [Full GC 178K->99K(1984K), 0.0253877 secs] 解读 :Full GC 就表示执行了一次Full GC的操作,178K 和99K 就表示执行GC前内存容量和执行GC后的内存容量。1984K就表示内存总容量。后面那个是执行本次GC所消耗的时间,单位是秒。 2.-XX:+printGC 这个打印的GC信息跟上个一样,就不做介绍了。 3.-XX:+PrintGCDetails 打印GC的详细信息。格式如下: –Heap – def new generation total 13824K, used 11223K [0x27e80000, 0x28d80000, 0x28d80000) – eden space 12288K, 91% used [0x27e80000, 0x28975f20, 0x28a80000) – from space 1536K, 0% used [0x28a80000,