堆内存

堆(heap)和栈(stack)的区别

帅比萌擦擦* 提交于 2019-11-28 23:31:35
转: 一、预备知识―程序的内存分配 一个由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字节的区域就在堆区。

Stack and Heap 堆和栈的区别

半城伤御伤魂 提交于 2019-11-28 23:31:04
在和计算机内存打交道时,我们一定会碰到堆和栈,这两个东西很容易搞混,那么现在就来梳理一下二者的关系。 栈是用来静态分配内存的而堆是动态分配内存的,它们都是存在于计算机内存之中。 栈的分配是在程序编译的时候完成的,直接存储在内存中,接触内存很快。栈是后进先出的顺序,最后被申请的块最先被释放,这样就很容易跟踪到栈,释放栈的过程简单到仅仅是移动下指针就能完成。 堆的分配是在程序运行时完成的,分配速度较为缓慢,但是堆的可用空间非常的大。堆中的元素相互之间没有关联,各自都可以被任何时候随机访问。我们可以任何时候申请和释放一块内存,这样会使得我们很难随时随地追踪到堆中某块位置被分配了还是被释放了。 当你知道在编译前需要分配多少数据时且数据量不是很大时可以使用栈。如果不知道在运行时需要多少数据那么就该使用堆。 在多线程的程序里,每个线程都有其自己独立的栈,它们都共享一个堆。栈是面向线程的而堆是面向进程的。 来源: http://www.cnblogs.com/grandyang/p/4933011.html

Java的内存机制

南笙酒味 提交于 2019-11-28 23:23:40
0.参考资料: http://www.j2megame.org/index.php/content/view/2246/125.html 1.Java的内存机制  Java 把内存划分成两种:一种是栈内存,另一种是堆内存。在函数中定义的一些 基本类型的变量 和 对象的引用变量都是在函数的栈内存中分配 ,当在一段代码块定义一个变量时,Java 就在栈中为这个变量分配内存空间,当超过变量的 作用域 后 ( 比如,在函数A中调用函数B,在函数B中定义变量a,变量a的作用域只是函数B,在函数B运行完以后,变量a会自动被销毁。分配给它的内存会被回收 ) ,Java 会自动释放掉为该变量分配的内存空间,该内存空间可以立即被另作它用。   堆内存用来存放由 new 创建的对象和数组 ,在堆中分配的内存,由 Java 虚拟机的自动垃圾回收器来管理。 在堆中产生了一个数组或者对象之后,还可以在栈中定义一个特殊的变量,让栈中的这个变量的取值等于数组或对象在堆内存中的首地址,栈中的这个变量就成了数组或对象的引用变量,以后就可以在程序中使用栈中的引用变量来访问堆中的数组或者对象,引用变量就相当于是为数组或者对象起的一个名称。 引用变量是普通的变量,定义时在栈中分配,引用变量在程序运行到其作用域之外后被释放。而数组和对象本身在堆中分配,即使程序运行到使用 new 产生数组或者对象的语句所在的代码块之外

JVM相关博文,jvm堆内存,堆外内存

无人久伴 提交于 2019-11-28 22:52:53
使用GC日志命令行选项为: -XX:+PrintGCTimeStamps -XX:+PrintGCDetails -Xloggc:<filename> JVM 【-server】 glassfish应用服务器 -server 启动 垃圾收集器默认组合方式为 新生代:Parallel Scavenge 并行回收GC 年老代和持久代:Parallel Old并行GC GC日志打印信息 : -XX:+PrintGCTimeStamps输出格式: 289.556: [GC [PSYoungGen: 314113K->15937K(300928K)] 405513K->107901K(407680K), 0.0178568 secs] [Times: user=0.06 sys=0.00, real=0.01 secs] 293.271: [GC [PSYoungGen: 300865K->6577K(310720K)] 392829K->108873K(417472K), 0.0176464 secs] [Times: user=0.06 sys=0.00, real=0.01 secs] 详解: 293.271是从jvm启动直到垃圾收集发生所经历的时间,GC表示这是一次Minor GC(新生代垃圾收集);[PSYoungGen: 300865K->6577K(310720K)]

「每日五分钟,玩转JVM」:线程共享区

时间秒杀一切 提交于 2019-11-28 21:43:56
前言 上一篇中,我们了解了JVM中的线程独占区,这节课我们就来了解一下JVM中的线程共享区,JVM中的线程共享区是跟随JVM启动时一起创建的,包括堆(Heap)和方法区()两部分,而线程独占区的程序计数器,虚拟机栈,本地方法栈的生命周期都是跟随线程的,随线程的创建而诞生,随线程的销毁而销毁。 堆(Heap) 堆内存作为JVM管理的内存中最大的一块,用于存放我们的 对象实例 ,我们经常会把JVM的内存简单的分为堆内存和栈内存,这样说虽然有些片面,但是也有这么说的道理,这两块儿一个作为执行程序的,一个作为存放对象的,是JVM中最为重要的两块儿内存。所以,我们的垃圾收集一般是针对的用于存放对象的 堆内存 ,所以堆内存有时候也会被称为GC堆。 从内存分配的角度上来说,堆内存中包含了新生代内存和老年代内存,而年轻代又分为Eden和Survivor区。Survivor区由From Survivor和To Survivor组成。Eden区占大容量,Survivor两个区占小容量,默认比例是8:1:1,而且JVM 每次只会使用 Eden 和其中的一块 Survivor 区域来为对象服务,所以无论什么时候,总是有一块 Survivor 区域是空闲着的。 这样设计的原因是为了更方便的进行垃圾收集,我们会在后面垃圾收集的章节中去详细的讲解。 TLAB TLAB的全称是Thread Local

堆、栈概念

旧巷老猫 提交于 2019-11-28 19:21:52
堆: ①堆通常是一个可以被看做一棵树的数组对象。堆总是满足下列性质: ·堆中某个节点的值总是不大于或不小于其父节点的值; ·堆总是一棵完全二叉树。将根节点最大的堆叫做最大堆或大根堆,根节点最小的堆叫做最小堆或小根堆。常见的堆有二叉堆、斐波那契堆等。 ②堆是在程序运行时,而不是在程序编译时,申请某个大小的内存空间。即动态分配内存,对其访问和对一般内存的访问没有区别。 ③堆是应用程序在运行的时候请求操作系统分配给自己内存,一般是申请/给予的过程。 ④堆是指程序运行时申请的动态内存,而栈只是指一种使用堆的方法(即先进后出)。 栈: ① 栈(stack)又名堆栈 ,一个数据集合,可以理解为只能在一端进行插入或删除操作的列表。其限制是仅允许在表的一端进行插入和删除运算。这一端被称为 栈顶 ,相对地,把另一端称为 栈底 。 ②栈就是一个桶,后放进去的先拿出来,它下面本来有的东西要等它出来之后才能出来(先进后出) ③栈(Stack)是操作系统在建立某个进程时或者线程(在支持多线程的操作系统中是线程)为这个线程建立的存储区域,该区域具有FIFO的特性,在编译的时候可以指定需要的Stack的大小。 栈的基本操作:   进栈(压栈):push   出栈:pop   取栈顶:gettop 来源: https://my.oschina.net/u/4177395/blog/3098559

[转载] 栈内存和堆内存

此生再无相见时 提交于 2019-11-28 10:29:17
堆(内存) 堆表示程序可用的内存区,也叫动态内存区。堆内存的分配与释放次序是随机的,这就是说,如果你按次序分配三块内存,那么到时并不按分配时的次序释放内存。 堆管理器会负责所有操作,你只需简单地使用GetMem 函数请求新内存或调用constructor 建立对象, Delphi 会返回一个新的内存块(随意重用已经丢弃的内存块)。 堆是应用程序可用的三种内存区之一, 其它两种分别是全局内存区(存放全程变量) 和栈。与堆相反,全程变量内存在程序启动时就分配,然后一直保留到程序终止才释放;栈的内容请详见术语表。 Delphi 使用堆为对象、字符串、动态数组及特殊的动态内存请求(GetMem)内存分配。 Windows 应用程序的地址空间最大允许有 2 GigaByte, 其中大部分能被堆使用。 栈(内存) 栈表示程序可用的内存区,栈内存动态分配,并按特定次序分配、释放。栈内存按后进先出次序(LIFO)分配,这表示最后分配的内存区先被释放。栈内存一般在例程中使用(过程、函数及方法调用)。 当你调用例程时,例程参数及返回值是放在栈中的(除非使用Delphi缺省调用方式,对调用过程进行优化)。此外,例程中声明的变量(在begin语句前的 var 块中)也存放在栈中,所以当例程终止时,这些变量会被自动清除(在返回调用点之前以LIFO次序释放)。 栈是应用程序可用的三种内存区之一

Java堆回收策略

随声附和 提交于 2019-11-28 08:38:27
一、起源 1960年Lisp语言: 第一门真正使用内存动态分配和垃圾回收的语言。 二、概要 线程相关:程序计数器、虚拟机栈、本地方法栈,不需要考虑垃圾回收 Java堆、方法区:需要考虑垃圾回收 三、垃圾回收算法 1 引用计数算法 2 可达性分析算法 垃圾收集算法 1 标记-清除算法 Mark-Sweep 最基础的垃圾收集算法 不足 效率问题:标记和清除的过程效率不太高 空间问题:标记清除之后产生大量的碎片,再分配较大的对象时,由于空间不足不得不再进行另一次GC操作。 2 复制算法 Copying 半个区的内存回收后挪到另外半个区 只需要移动堆顶指针,按顺序分配内存。 不足 每次都只能使用半个区的内存。 重点 现在的商业虚拟机都采用复制算法回收新生代。 新生代98%的对象都是朝生夕死的,所以不需要1:1比例划分内存空间。 分为一个Eden区,两个survivor区 HotSpot默认内存 8:1 比例,只有10%内存被浪费。 Survivor区不够用老年代。 3 标记-整理算法 Mark-Compact 原理 如果复制算法不想浪费50%的内存空间,就要有额外的空间担保Survivor区。用来应对所有对象都存活的情况。 所以老年代不能用复制算法。 流程 先标记,然后不直接清理,而是所有存活对象向一端移动。清理掉端边界以外的内存。 四、分代收集算法 Generational

链表的底层原理和实现

爷,独闯天下 提交于 2019-11-28 07:11:31
一、简介   本文从链表的简介开始,介绍了链表的存储结构,并根据其存储结构分析了其存储结构所带来的优缺点,进一步我们通过代码实现了一个输入我们的单向链表。然后通过对递归过程和内存分配的详细讲解让大家对链表的引用和链表反转有一个深入的了解。单向链表实现了两个版本,分别使用循环和递归实现了两个版本的链表,相信大家仔细阅读本文后会对链表和递归有一个深刻的理解。再也不怕面试官让手写链表或者反转链表了。   后面会持续更新数据结构相关的博文。   数据结构专栏: https://www.cnblogs.com/hello-shf/category/1519192.html   git传送门: https://github.com/hello-shf/data-structure.git 二、链表 2.1、链表简介   链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。   使用链表结构可以克服数组链表需要预先知道数据大小的缺点,链表结构可以充分利用计算机内存空间,实现灵活的内存动态管理。但是链表失去了数组随机读取的优点,同时链表由于增加了结点的指针域,空间开销比较大。   

Java中栈(stack)和堆(heap)的区别

最后都变了- 提交于 2019-11-27 16:24:22
java中堆和栈的区别自然是面试中的常见问题,下面几点就是其具体的区别 1,各司其职 最主要的区别就是栈内存用来存储局部变量和方法调用。 而堆内存用来存储Java中的对象。无论是成员变量,局部变量,还是类变量,它们指向的对象都存储在堆内存中。 2,独有还是共享 栈内存归属于单个线程,每个线程都会有一个栈内存,其存储的变量只能在其所属线程中可见,即栈内存可以理解成线程的私有内存。 而堆内存中的对象对所有线程可见。堆内存中的对象可以被所有线程访问。 3,异常错误 如果栈内存没有可用的空间存储方法调用和局部变量,JVM会抛出java.lang.StackOverFlowError。 而如果是堆内存没有可用的空间存储生成的对象,JVM会抛出java.lang.OutOfMemoryError。 4,空间大小 栈的内存要远远小于堆内存,如果你使用递归的话,那么你的栈很快就会充满。如果递归没有及时跳出,很可能发生StackOverFlowError问题。 你可以通过-Xss选项设置栈内存的大小。-Xms选项可以设置堆的开始时的大小,-Xmx选项可以设置堆的最大值。 这就是Java中堆和栈的区别。理解好这个问题的话,可以对你解决开发中的问题,分析堆内存和栈内存使用,甚至性能调优都有帮助。 来源: https://www.cnblogs.com/noperx/p/11370105.html