内存碎片

堆内存和栈内存区别

僤鯓⒐⒋嵵緔 提交于 2020-03-17 07:54:34
原帖地址:http://hi.baidu.com/passionlh/blog/item/bb3a8181d18819debd3e1e6a.html (1) 堆栈。驻留于常规RAM(随机访问存储器)区域,但可通过它的“堆栈指针”获得处理的直接支持。堆栈指针若向下移,会创建新的内存;若向上移,则会释放那些内存。这是一种特别快、特别有效的数据保存方式,仅次于寄存器。创建程序时,Java编译器必须准确地知道堆栈内保存的所有数据的“长度”以及“存在时间”。这是由于它必须生成相应的代码,以便向上和向下移动指针。这一限制无疑影响了程序的灵活性,所以尽管有些Java数据要保存在堆栈里——特别是对象句柄,但Java对象并不放到其中。 (2) 堆。一种常规用途的内存池(也在RAM区域),其中保存了Java对象。和堆栈不同,“内存堆”或“堆”(Heap)最吸引人的地方在于编译器不必知道要从堆里分配多少存储空间,也不必知道存储的数据要在堆里停留多长的时间。因此,用堆保存数据时会得到更大的灵活性。要求创建一个对象时,只需用new命令编制相关的代码即可。执行这些代码时,会在堆里自动进行数据的保存。当然,为达到这种灵活性,必然会付出一定的代价:在堆里分配存储空间时会花掉更长的时间! (3) 静态存储。这儿的“静态”(Static)是指“位于固定位置”(尽管也在RAM里)。程序运行期间

堆内存和栈内存区别

瘦欲@ 提交于 2020-03-17 07:44:23
(1) 堆栈。驻留于常规RAM(随机访问存储器)区域,但可通过它的“堆栈指针”获得处理的直接支持。堆栈指针若向下移,会创建新的内存;若向上移,则会释放那些内存。这是一种特别快、特别有效的数据保存方式,仅次于寄存器。创建程序时,Java编译器必须准确地知道堆栈内保存的所有数据的“长度”以及“存在时间”。这是由于它必须生成相应的代码,以便向上和向下移动指针。这一限制无疑影响了程序的灵活性,所以尽管有些Java数据要保存在堆栈里——特别是对象句柄,但Java对象并不放到其中。 (2) 堆。一种常规用途的内存池(也在RAM区域),其中保存了Java对象。和堆栈不同,“内存堆”或“堆”(Heap)最吸引人的地方在于编译器不必知道要从堆里分配多少存储空间,也不必知道存储的数据要在堆里停留多长的时间。因此,用堆保存数据时会得到更大的灵活性。要求创建一个对象时,只需用new命令编制相关的代码即可。执行这些代码时,会在堆里自动进行数据的保存。当然,为达到这种灵活性,必然会付出一定的代价:在堆里分配存储空间时会花掉更长的时间! (3) 静态存储。这儿的“静态”(Static)是指“位于固定位置”(尽管也在RAM里)。程序运行期间,静态存储的数据将随时等候调用。可用static关键字指出一个对象的特定元素是静态的。但Java对象本身永远都不会置入静态存储空间。 堆:顺序随意 栈:先进后出 堆和栈的区别

[Mark] KVM 虚拟化基本原理

混江龙づ霸主 提交于 2020-03-17 06:06:53
X86 操作系统是设计在直接运行在裸硬件设备上的,因此它们自动认为它们完全占有计算机硬件。x86 架构提供四个特权级别给操作系统和应用程序来访问硬件。 Ring 是指 CPU 的运行级别,Ring 0是最高级别,Ring1次之,Ring2更次之…… 就 Linux+x86 来说, 操作系统(内核)需要直接访问硬件和内存,因此它的代码需要运行在最高运行级别 Ring0上,这样它可以使用特权指令,控制中断、修改页表、访问设备等等。 应用程序的代码运行在最低运行级别上ring3上,不能做受控操作。如果要做,比如要访问磁盘,写文件,那就要通过执行系统调用(函数),执行系统调用的时候,CPU的运行级别会发生从ring3到ring0的切换,并跳转到系统调用对应的内核代码位置执行,这样内核就为你完成了设备访问,完成之后再从ring0返回ring3。这个过程也称作用户态和内核态的切换。 那么,虚拟化在这里就遇到了一个难题,因为宿主操作系统是工作在 ring0 的,客户操作系统就不能也在 ring0 了,但是它不知道这一点,以前执行什么指令,现在还是执行什么指令,但是没有执行权限是会出错的。所以这时候虚拟机管理程序(VMM)需要避免这件事情发生。 虚机怎么通过 VMM 实现 Guest CPU 对硬件的访问,根据其原理不同有三种实现技术: 1. 全虚拟化 2. 半虚拟化 3. 硬件辅助的虚拟化 1

堆和栈的区别(转过无数次的文章)

你。 提交于 2020-03-16 21:25:02
一、预备知识—程序的内存分配 一个由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字节的区域就在堆区。

memcache

ε祈祈猫儿з 提交于 2020-03-16 12:30:16
目录 基础概念 mem架构 mem内存管理 删除机制 分布式机制 memcache来存储session的特点 监控 常用命令 session server memcache与php memcache与tomcat ======================================================================= 张贺,多年互联网行业工作经验,担任过网络工程师、系统集成工程师、LINUX系统运维工程师 笔者微信:zhanghe15069028807,现居济南历下区 ======================================================================= # 基础概念 基础概念 memcached是什么?有什么作用?   memcached是一个工作在内存的nosql的数据库,通常有两个作用,第一个作用是部署在real server集群的后端后做session server,存储用户的session信息,这样无论客户端调度到哪一台real server,都能够保持与客户端之前的会话。第二个作用是部署在关系型数据库的前端,做关系型数据库的缓存,其目的提升数据库的访问性能,加速网站集群动态应用服务的能力。 memcached服务在企业集群架构中应用场景 1.作为数据库的前端缓存应用 (1

Android GC 那点事

拈花ヽ惹草 提交于 2020-03-15 22:07:03
版权声明:本文由陈昱全原创文章,转载请注明出处: 文章原文链接: https://www.qcloud.com/community/article/170 来源:腾云阁 https://www.qcloud.com/community 想写一篇关于Android GC的想法来源于追查一个魅族手机图片滑动卡顿问题,由于不断的GC导致的丢帧卡顿的问题让我们想了很多方案去解决,所以就打算详细的看看内存分配和GC的原理,为什么会不断的GC, GC ALLOC和GC COCURRENT有什么区别,能不能想办法扩大堆内存减少GC的频次等等。 1. JVM内存回收机制 1.1. 回收算法 标记回收算法(Mark and Sweep GC) 从"GC Roots"集合开始,将内存整个遍历一次,保留所有可以被GC Roots直接或间接引用到的对象,而剩下的对象都当作垃圾对待并回收,这个算法需要中断进程内其它组件的执行并且可能产生内存碎片。 复制算法 (Copying) 将现有的内存空间分为两快,每次只使用其中一块,在垃圾回收时将正在使用的内存中的存活对象复制到未被使用的内存块中,之后,清除正在使用的内存块中的所有对象,交换两个内存的角色,完成垃圾回收。 标记-压缩算法 (Mark-Compact) 先需要从根节点开始对所有可达对象做一次标记,但之后,它并不简单地清理未标记的对象

JVM二

不打扰是莪最后的温柔 提交于 2020-03-14 20:21:54
12.GC详解 垃圾回收: 分代收集算法 不同的区域使用不同的回收算法 Young代:GC频繁区域 Old代:GC次数较少 Perm代:不会产生GC! 一个对象的历程: JVM在进行GC时,并非每次都对三个区域进行扫描的。大部分的时候都是指的新生代。 普通GC:只针对新生代【GC】 Full GC:主要是针对老年代,偶尔伴随新生代【Full GC】 1.JVM内存模型,每个区中存放什么? 2.堆中的分区:Eden,S from to,老年代,说说他们的特点。 3.GC的三种收集算法:标记清除,标记整理,复制算法,请你谈谈他的特点? 13.GC四大算法 引用计数法: 特点:每个对象都有一个引用计数器,每当对象被引用一次,计数器+1,如果引用失效,则计数器-1,如果为0,则GC可以清理。 缺点: 计数器维护麻烦 循环引用无法处理 JVM一般不采用这种方式(JVM一般采用可达性算法。) 复制算法 年轻代就是用的复制算法 1、一般普通GC之后,差不多Eden几乎都是空的了 2、每次存活的对象,都会被从from区和Eden区活着的对象复制到to区,这时from和to会发生一次交换:谁空谁是to,每当幸存一次,就会导致这个对象的年龄+1;如果这个年龄值大于15(默认值),就会进入养老区。 优点:没有标记和清楚的过程,效率高,没有内存碎片 缺点:to区永远是空的,需要 浪费双倍的空间 Eden区

python 对象

情到浓时终转凉″ 提交于 2020-03-14 00:47:39
python 对象 在python中,对象就是为C中的结构体在堆上申请的一块内存,一般来说,对象是不能被静态初始化的,并且不能再栈空间上生存。本文主要对Python的基本数据类型做简单的介绍。 PyObject 在python中,所有东西都是对象,而所欲的对象都拥有一些共性(object.h/PyObject)。 PyObject是整个python对象机制的核心。 typedef struct _object { PyObject_HEAD } PyObject; 在release模式下编译python时,PyObject如下: typedef struct _object { int ob_refcnt; //引用计数 struct _typeobject *ob_type; //类型 } PyObject; 其中,ob_refcnt为int整型,实现了基于引用计数的垃圾收集机制。对于某一对象A,当有一个新的PyObject 引用该对象时,A的引用计数应该增加;而当这个PyObject 被删除时,A的引用计数应该减少;当A的引用计数减少到0时,A就可以从堆上被删除,以释放出内存供别的对象使用。 引用计数 PyObject中的ob_refcnt是一个32位的整形变量,这实际蕴含着Python所有的一个假设,既对一个对象的引用不会超过一个整形变量的最大值。 整数对象 小整数对象

JVM系列三:JVM参数设置、分析

只谈情不闲聊 提交于 2020-03-13 13:33:00
不管是YGC还是Full GC,GC过程中都会对导致程序运行中中断,正确的选择 不同的GC策略 ,调整JVM、GC的参数,可以极大的减少由于GC工作,而导致的程序运行中断方面的问题,进而适当的提高Java程序的工作效率。但是调整GC是以个极为复杂的过程,由于各个程序具备不同的特点,如:web和GUI程序就有很大区别(Web可以适当的停顿,但GUI停顿是客户无法接受的),而且由于跑在各个机器上的配置不同(主要cup个数,内存不同),所以使用的GC种类也会不同(如何选择见 GC种类及如何选择 )。本文将注重介绍JVM、GC的一些重要参数的设置来提高系统的性能。 JVM内存组成及GC相关内容请见之前的文章: JVM内存组成 GC策略&内存申请 。 JVM参数的含义 实例见 实例分析 参数名称 含义 默认值 -Xms 初始堆大小 物理内存的1/64(<1GB) 默认(MinHeapFreeRatio参数可以调整)空余堆内存小于40%时,JVM就会增大堆直到-Xmx的最大限制. -Xmx 最大堆大小 物理内存的1/4(<1GB) 默认(MaxHeapFreeRatio参数可以调整)空余堆内存大于70%时,JVM会减少堆直到 -Xms的最小限制 -Xmn 年轻代大小(1.4or lator) 注意 :此处的大小是(eden+ 2 survivor space).与jmap

JVM学习(4):垃圾回收

余生颓废 提交于 2020-03-13 13:18:27
进行垃圾回收的区域 :堆,方法区 运行时数据区的【堆】和【方法区】在所有线程间是共享的,进行回收 【栈】是线程私有的,所有不进行回收 什么情况下进行回收: 开发中经常有这样的写法 List<String> list = new ArrayList<>(); list.add(); list.add(); list.add(); //业务逻辑代码 return ; 这样是不合理的,list是一个局部变量,使用完毕之后应该赋值为null 这段代码,然后使用参数-XX:+PrintGCDetails -XX:+UseSerialGC public class ReferenceCountingGC { private static final int MB = 1024 * 1024; Object instance = null; private byte[] size = new byte[2 * MB]; public static void main(String[] args) { ReferenceCountingGC o1 = new ReferenceCountingGC(); ReferenceCountingGC o2 = new ReferenceCountingGC(); o1.instance = o2; o2.instance = o1; o1 = null;