学习编程的时候,经常会看到stack这个词,它的中文名字叫做”栈”。

理解这个概念,对于理解程序的运行至关重要。容易混淆的是,这个词其实有三种含义,适用于不同的场合,必须加以区分。

含义一:数据结构

stack的第一种含义是一组数据的存放方式,特点为LIFO,即后进先出(Last in, first out)。

在这种数据结构中,数据像积木那样一层层堆起来,后面加入的数据就放在最上层。使用的时候,最上层的数据第一个被用掉,这就叫做”后进先出”。

与这种结构配套的,是一些特定的方法,主要为下面这些。

push:在最顶层加入数据。

pop:返回并移除最顶层的数据。

top:返回最顶层数据的值,但不移除它。

isempty:返回一个布尔值,表示当前stack是否为空栈。

含义二:代码运行方式

stack的第二种含义是“调用栈”(call stack),表示函数或子例程像堆积木一样存放,以实现层层调用。

下面以一段Java代码为例(来源)。

classStudent{

intage;

String name;

publicStudent(intAge, String Name)

{

this.age = Age;

setName(Name);

}

publicvoidsetName(String Name)

{

this.name = Name;

}

}

publicclassMain{

publicstaticvoidmain(String[] args) {

Student s;

s =newStudent(23,"Jonh");

}

}

上面这段代码运行的时候,首先调用main方法,里面需要生成一个Student的实例,于是又调用Student构造函数。在构造函数中,又调用到setName方法。

这三次调用像积木一样堆起来,就叫做”调用栈”。程序运行的时候,总是先完成最上层的调用,然后将它的值返回到下一层调用,直至完成整个调用栈,返回最后的结果。

含义三:内存区域

stack的第三种含义是存放数据的一种内存区域。程序运行的时候,需要内存空间存放数据。一般来说,系统会划分出两种不同的内存空间:一种叫做stack(栈),另一种叫做heap(堆)。

它们的主要区别是:stack是有结构的,每个区块按照一定次序存放,可以明确知道每个区块的大小;heap是没有结构的,数据可以任意存放。因此,stack的寻址速度要快于heap。

其他的区别还有,一般来说,每个线程分配一个stack,每个进程分配一个heap,也就是说,stack是线程独占的,heap是线程共用的。此外,stack创建的时候,大小是确定的,数据超过这个大小,就发生stack overflow错误,而heap的大小是不确定的,需要的话可以不断增加。

根据上面这些区别,数据存放的规则是:只要是局部的、占用空间确定的数据,一般都存放在stack里面,否则就放在heap里面。请看下面这段代码(来源)。

publicvoidMethod1()

{

inti=4;

inty=2;

class1 cls1 =newclass1();

}

上面代码的Method1方法,共包含了三个变量:i, y 和 cls1。其中,i和y的值是整数,内存占用空间是确定的,而且是局部变量,只用在Method1区块之内,不会用于区块之外。cls1也是局部变量,但是类型为指针变量,指向一个对象的实例。指针变量占用的大小是确定的,但是对象实例以目前的信息无法确知所占用的内存空间大小。

这三个变量和一个对象实例在内存中的存放方式如下。

从上图可以看到,i、y和cls1都存放在stack,因为它们占用内存空间都是确定的,而且本身也属于局部变量。但是,cls1指向的对象实例存放在heap,因为它的大小不确定。作为一条规则可以记住,所有的对象都存放在heap。

接下来的问题是,当Method1方法运行结束,会发生什么事?

回答是整个stack被清空,i、y和cls1这三个变量消失,因为它们是局部变量,区块一旦运行结束,就没必要再存在了。而heap之中的那个对象实例继续存在,直到系统的垃圾清理机制(garbage collector)将这块内存回收。因此,一般来说,内存泄漏都发生在heap,即某些内存空间不再被使用了,却因为种种原因,没有被系统回收。

(完)

java内存stack heap_java内存解析-------stack(栈)和heap(堆)的理解相关推荐

  1. [Java]Stack栈和Heap堆的区别(终结篇)[转]

    首先分清楚Stack,Heap的中文翻译:Stack-栈,Heap-堆. 在中文里,Stack可以翻译为"堆栈",所以我直接查找了计算机术语里面堆和栈开头的词语: 堆存储: hea ...

  2. JAVA Stack栈和Heap堆的区别(转)

          首先分清楚Stack,Heap的中文翻译:Stack-栈,Heap-堆. 在中文里,Stack可以翻译为"堆栈",所以我直接查找了计算机术语里面堆和栈开头的词语:  堆 ...

  3. 如何给女朋友讲明白:Java中Stack(栈)与Heap(堆)

    背景 Java中Stack(栈)与Heap(堆)是面试中被经常问到的一个话题. 有没有对Java中Stack(栈)与Heap(堆)烂熟于心的童鞋,请举手!!!(怎么没人举手-) 这个时候蜗牛哥的对象弱 ...

  4. js stack栈与heap堆的区别与含义

    作为前端了解栈与堆是非常必要的,如果不能充分理解那么js的深拷贝.浅拷贝就没办法正确使用. 当然如果你是大学计算机专业相信你因该了解很透彻了,如果文章有不足之处请多多指教 一.栈与堆概念 栈(stac ...

  5. java帧结构_Java虚拟机运行时栈帧结构--《深入理解Java虚拟机》学习笔记及个人理解(二)...

    Java虚拟机运行时栈帧结构(周志明书上P237页) 栈帧是什么? 栈帧是一种数据结构,用于虚拟机进行方法的调用和执行. 栈帧是虚拟机栈的栈元素,也就是入栈和出栈的一个单元. 2018.1.2更新(在 ...

  6. java中stack heap_java虚拟机中的堆(heap)、栈(stack)、方法区(method area)

    1.堆区 存储的全部是对象,每个对象都包含一个与之对应的class的信息.(class的目的是得到操作指令) jvm只有一个heap区,被所有线程共享,不存放基本类型和对象引用,只存放对象本身 堆的优 ...

  7. Java的多线程以及内存模型的知识点梳理,有想到过这些吗?

    JMM大致描述: JMM描述了线程如何与内存进行交互.Java虚拟机规范视图定义一种Java内存模型,来屏蔽掉各种操作系统内存访问的差异,以实现Java程序在各种平台下都能达到一致的访问效果. JMM ...

  8. JAVA方法调用中的解析与分派

    JAVA方法调用中的解析与分派 本文算是<深入理解JVM>的读书笔记,参考书中的相关代码示例,从字节码指令角度看看解析与分派的区别. 方法调用,其实就是要回答一个问题:JVM在执行一个方法 ...

  9. eclipse failed to create the java virtual machine 问题图文解析

    eclipse failed to create  the java virtual  machine 解决方法: 1.问题现象 2.java虚拟机初始化失败!寻找eclipse解压路径 3.寻找ec ...

最新文章

  1. 从摩尔定律到人工智能,指数定律释放人类潜能
  2. Selenium Web 自动化 - Selenium常用API
  3. 在程序中设置最小化、最大化、关闭按钮
  4. 模型和控制器-起步阶段
  5. android viewpage预加载和懒加载问题
  6. poj 3071 Football
  7. oracle导出超链接,Oracle Report中加入下载超链接操作方法
  8. flex与JavaScript的数据交互
  9. Linux软件安装的几种方法 (一)—— apt-get
  10. IT行业里有这么多聪明人,他们之间的区别在哪里?
  11. 数据仓库流程和代码说明
  12. java与数据库的数据交互,Java与数据库初步交互(后续需要进行优化)
  13. Linux内核剖析之回收页框
  14. php openssl 处理pkcs8,openssl生成RSA格式,并转为pkcs8格式
  15. 本地怎么传文件到服务器,本地传输文件到服务器
  16. Linux磁盘管理(添加磁盘,分区、删除分区、格式化、挂载、卸载)
  17. 系统维护模式修改/etc/fstab
  18. android开启软键盘,Android肿么弹出软键盘,和开启软键盘
  19. SEO初学者如何快速做好 SEO 优化?seo数据查询
  20. Swagger3.0快速开发及空指针异常的解决

热门文章

  1. 快速傅立叶变换(FFT)的海面模拟
  2. 品质和创新成为 GDC 2017 “State of Unreal” 的焦点
  3. UE4 在C++ 动态生成几何、BSP体、BRUSH ---- MESH_GENERATION
  4. Mono for Android 优势与劣势
  5. 《GPUPro》笔记
  6. 深入分析String类型(一)
  7. 关于插件管理器Alcatraz的一些问题
  8. 【Hibernate一】概述及入门
  9. 使用webpack打包ThinkPHP的资源文件
  10. 数据库名,全局数据库名,SID区别及有感