java内存解析-------stack(栈)和heap(堆)的理解

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

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

含义一:数据结构 数据结构

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

bg2013112901

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

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

  • push:在最顶层加入数据。
  • pop:返回并移除最顶层的数据。
  • top:返回最顶层数据的值,但不移除它。
  • isempty:返回一个布尔值,表示当前stack是否为空栈。

含义二:代码运行方式 spa

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方法。 code

bg2013112902

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

含义三:内存区域

stack的第三种含义是存放数据的一种内存区域。程序运行的时候,须要内存空间存放数据。通常来讲,系统会划分出两种不一样的内存空间:一种叫作stack(栈),另外一种叫作heap(堆)。

bg2013112903

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

bg2013112904

其余的区别还有,通常来讲,每一个线程分配一个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也是局部变量,可是类型为指针变量,指向一个对象的实例。指针变量占用的大小是肯定的,可是对象实例以目前的信息没法确知所占用的内存空间大小。

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

bg2013112905

从上图能够看到,i、y和cls1都存放在stack,由于它们占用内存空间都是肯定的,并且自己也属于局部变量。可是,cls1指向的对象实例存放在heap,由于它的大小不肯定。做为一条规则能够记住,全部的对象都存放在heap。

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

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

(完)

相关文章
相关标签/搜索