堆&栈
Java内存分为两种:堆内存和栈内存。
一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配。当超过变量的作用域后,java会自动释放掉为该变量分配的内存空间。堆内存用于存放由new创建的对象和数组。在堆中分配的内存,由java虚拟机自动垃圾回收器来管理。在堆中产生一个数组或对象后,还可以在栈中定义一个特殊的变量。这个变量的取值等于数组活对象在堆内存中的首地址。在堆中,这个特殊的变量就变成了数组活对象的引用变量,以便在程序中可以使用栈内存中的引用变量来访问堆中的数组或对象。
Java中的堆是一个运行时数据区,不需要程序代码来显式的释放。堆的优势是可以动态地分配内存大小。Java的垃圾回收机制回收不再使用的数却,缺点是由于在运行时动态分配内存,存取速度较慢。栈的优势是存取速度比堆快。仅次于寄存器。栈数据可以共享,缺点是栈中的数据大小与生存周期必须是确定的。缺点是缺乏是灵活性。栈中主要存放一些基本类型变量和对象句柄。存储在栈中的数据可以共享
内存分配的原则:静态,栈式,堆式
静态存储分配是指在编译时就能确定每个数据目标在运行时刻的存储空间需求,因而在编译时就可以给他们分配固定的内存空间。静态存储分配需求在编译时能知道所有变量的存储要求。
栈式存储分配是由一个类似于堆栈的运行栈来实现的,也称动态存储分配。和静态存储分配相反,在栈式存储方案中,程序对数据区的需求在编译时是完全未知的,只有到运行时才知道。但规定在运行中进入一个程序模块时,必须知道该模块所需的数据区大小才能为其分配内存。栈式存储分配按照先进后出的原则进行分配。栈式存储分配要求在过程的入口处必须知道所有的存储要求。
堆式存储分配负责在编译时或运行时模块入口处都无法确定存储要求的数据结构。
JVM是基于堆和栈的虚拟机。JVM为每个新创建的线程都分配一个堆栈。堆栈以帧为单位保存线程的状态。JVM堆堆栈只进行了两种操作,以帧为单位压栈和出栈工作。
某个线程正在执行的方法称为此线程的当前方法。当前方法使用的帧称为当前帧。当线程激活了一个方法,JVM会在线程的Java堆栈里新压入一个帧,这个帧成为了当前帧,在此方法的执行期间,这个帧将用来保存参数,局部变量中间计算过程和其他数据。
每个Java应用都唯一对应一个JVM实例。每一个实例对应一个堆。应用程序在运行中所创建的所有类实例或数组都放在这个堆中,并由所有的线程共享。Java中分配堆内存是自动初始化的。Java中所有对象的存储空间都是在堆中分配的,但这个对象的引用确实在堆栈中分配的。
堆&栈的更多相关文章
- java数据结构之(堆)栈
(堆)栈概述栈是一种特殊的线性表,是操作受限的线性表栈的定义和特点•定义:限定仅在表尾进行插入或删除操作的线性表,表尾—栈顶,表头—栈底,不含元素的空表称空栈•特点:先进后出(FILO)或后进先出(L ...
- 堆”,"栈","堆栈","队列"以及它们的区别
如果你学过数据结构,就一定会遇到“堆”,"栈","堆栈","队列",而最关键的是这些到底是什么意思?最关键的是即使你去面试,这些都还会问到, ...
- 堆,栈,内存管理, 拓展补充-Geekband
8, 堆,栈,内存管理 栈: local objects 在离开作用域之后就会被消除. 堆: new MyClass 一直会存在 静态对象: static local object 作用域在 ...
- 转:C/C++内存管理详解 堆 栈
http://chenqx.github.io/2014/09/25/Cpp-Memory-Management/ 内存管理是C++最令人切齿痛恨的问题,也是C++最有争议的问题,C++高手从中获得了 ...
- 堆/栈的比较 以及 malloc/new动态内存的开辟
堆与栈的比较:1.申请方式(1)栈(satck):由系统自动分配.(2)堆(heap):需程序员自己申请(c:调用malloc,realloc,calloc申请 free 来释放),并指明大小,并由程 ...
- java 堆 栈 常量池
java 堆中保存new 出来的对象(每个对象都包含一个与之对应的class的信息,[class信息存放在方法区]),堆中分配的内存,有虚拟机的自动垃圾回收器管理,栈内存只对其所属线程可见. java ...
- java基础学习之"堆" "栈" "静态存储区" "方法区"
引用部分 java中堆栈(stack)和堆(heap)(还在问静态变量放哪里,局部变量放哪里,静态区在哪里.....进来) Java堆.栈和常量池以及相关String的讲解 等我看完"深入理 ...
- 堆&栈的理解(转)
(摘自:http://www.cnblogs.com/likwo/archive/2010/12/20/1911026.html) C++中堆和栈的理解 内存分配方面: 堆: 操作系统有一个记录空闲内 ...
- java 堆 栈 方法区的简单分析
Java里的堆(heap)栈(stack)和方法区(method) 基础数据类型直接在栈空间分配, 方法的形式参数,直接在栈空间分配,当方法调用完成后从栈空间回收. 引用数据类型,需要用new来创 ...
随机推荐
- hdu-4738-tarjin/割边
http://acm.hdu.edu.cn/showproblem.php?pid=4738 求得是边权最小的割边,和求割点类似用tarjin,但要注意的是不能走从父亲过来的那一条边,在割点里那样理解 ...
- Leetcode 1029. 可被 5 整除的二进制前缀
1029. 可被 5 整除的二进制前缀 显示英文描述 我的提交返回竞赛 用户通过次数467 用户尝试次数662 通过次数477 提交次数1964 题目难度Easy 给定由若干 0 和 1 组成的 ...
- flask-前台布局页面搭建3
4.前台布局的搭建 由于前端知识有限,我在网上下载的人家的前台源码,附上链接 https://link.jianshu.com/?t=https://github.com/mtianyan/movie ...
- 使用AdminLTE 在content区,打开相应网页
参考:https://bbs.csdn.net/topics/391846671 问: 比如打开starter.html,然后点击其左边栏的链接(如user.html)的时候,怎么实现在右边的cont ...
- Python函数式编程,map/reduce,filter和sorted
什么是函数式编程? 与面向对象编程(Object-oriented programming)和过程式编程(Procedural programming)并列的编程范式. 最主要的特征是,函数是第一等公 ...
- 【LeetCode】Anagram
Anagram 指由颠倒字母顺序而构成的单词. e.g. 给出 ["eat", "tea", "tan", "ate", ...
- MySQL查询性能调优化
一.索引的概念 索引:类似于字典的目录,设置索引可以 加速数据查找,对数据进行约束: 二.索引类型: 主键索引:保证数据唯一性,不能重复+不能为空 普通索引:加速数据查找 唯一索引:加速查找+不能重复 ...
- 牛客网 PAT 算法历年真题 1001 : A+B和C (15)
1001 : A+B和C (15) 时间限制 1000 ms 内存限制 32768 KB 代码长度限制 100 KB 判断程序 Standard 题目描述 给定区间[-2的31次方, 2的31次方]内 ...
- char和varchar、浮点数和定点数
cmd连接mysql数据库:找到mysql目录,进入到bin目录,然后在命令行中输入 mysql -hlocalhost -uroot -ppass ,连接mysql数据库成功. 1.char和var ...
- javascript 多个onclick function 取对应值
方法1: 直接获取值 <button onclick="aa(1)">执行</button> <button onclick="aa(2)& ...