堆&栈
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来创 ...
随机推荐
- python-flask-wtforms
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- jq判断网页是在什么浏览器打开的
有的时候项目中有需要用户扫描二维码进行页面识别跳转操作的,(类似当前需要先判断是否为手机默认浏览器打开,尤其是微信打开会影响APP包的下载-微信内置的一个拦截,这对Android来说影响有点大),因此 ...
- C# 3.0 / C# 3.5 系统内置委托
内置委托的定义声明: System.Func,代表有返回类型的委托: public delegate TResult Func<out TResult>(); public delegat ...
- MySQL5.6复制技术(4)-MySQL主从复制过滤参数
复制的过滤主要有2种方式: 在主服务器在把事件从进二制日志中过滤掉,相关的参数是:binlog_do_db和binlog_ignore_db. 在从服务器上把事件从中继日志中过滤掉,相关的参数是re ...
- Spring注解之 @SuppressWarnings注解
简介:java.lang.SuppressWarnings是J2SE5.0中标准的Annotation之一.可以标注在类.字段.方法.参数.构造方法,以及局部变量上.作用:告诉编译器忽略指定的警告,不 ...
- iOS封装功能生成 .framework
前言 如果你想将你开发的控件与别人分享,一种方法是直接提供源代码文件.然而,这种方法并不是很优雅.它会暴露所有的实现细节,而这些实现你可能并不想开源出来.此外,开发者也可能并不想看到你的所有代码,因为 ...
- get url img
selenium 1● 了解selenium 这个是做 web页面测试,模拟用户测试 =====> pip install selenium 安装 2● django 用于接 ...
- learning hdmi edid protocol
referenc: https://en.wikipedia.org/wiki/Extended_Display_Identification_Data
- vue组件通信方式总结
对于vue来说,组件之间的消息传递是非常重要的,下面是我对组件之间消息传递的各种方式的总结,总共有8种方式. 1. props和$emit 父组件向子组件传递数据是通过prop传递的,子组件传递数据给 ...
- Resharper插件如何启用原VS的智能提示
第一步:vs2015选择工具—>选项—>文本编辑器—>C#—>常规—>语句结束,勾选自动列出成员,如下图: 第二步: 关闭Resharper智能提示,并设置为Visual ...