工作中偶然遇到一个问题,让我想重温一下这个神秘的的领域Java 堆和栈

What is Heap Memory?

     对于大多数引用来说,Java堆(Java Heap)是Java虚拟机管理内存中最大的一块。Java堆是被所有线程共享的一块内存区域在虚拟机启动时创建,此内存区域唯一目的就是存放对象实例,几乎所有对象实例都在这里分配内存。这一点在java虚拟机规范中的描述是:所有的对象实例以及数组都要在堆上分配。

                                                                                                                                       --- 引自深入理解java虚拟机

    是不是只是实例对象和数组呢,有没有引用变量存在我们的堆中呢还且继续往下看。

What is Stack Memory?

    栈大家应该多少有些了解它有几个特征如下:

    1.是线程私有的,其生命周期也与线程相同

    2.主要用来存储 局部变量,引用变量,方法信息等

    3.last in first out

下面先举例说明先什么是局部变量和实例变量

Java Stack and Heap

从上图我们可以 看出实例变量和局部变量的区别

    1.实例变量在方法外面不在方法里面

    2.局部变量在方面里面不在方法外面

下面再举一个例子来更好的理解上面所说,

比如我们在main方法中调用我们的first方法

Java Stack and Heap

它会做些什么呢?

1.首先他会先在栈中创建如下

Java Stack and Heap

2.当然我们的变量firstVariable也会在栈中创建

Java Stack and Heap

继续往下走我们让我们的first方法再进行调用我们的second

Java Stack and Heap

这个时候我们的内存会是怎样的变化呢

1.首先在栈的上方会压入我们的第二个方法

Java Stack and Heap

2.紧接着是变量也会加到我们的栈中

Java Stack and Heap

继续向下看,使用第二方法调用下面的方法会有什么的结果,

Java Stack and Heap

Java Stack and Heap

看下图展示:

Java Stack and Heap

1.首先我们在Heap上创建我们的对象实例还有实例变量

2.在栈的顶部压入我们的第三个方法,并把引用变量加入栈中

3.栈用引用执行我们在堆中生成的实例对象

当我们的第三个方法调用结束

Java Stack and Heap

这是将不会有任何有任何引用指向我们刚才在堆上生成的实例,这是整个实例会被GC回收,

在栈中根据栈的last in first out 原则,在第三个方法调用结束的时候内存也随之释放,

最后第二个方法和第一个方法也随着调用结束从栈中弹出,总的方法在调用处结束这里也就是我们的main方法

以上就是一个简单例子在堆栈中的分配

个人公众号欢迎共同成长交流

Java Stack and Heap





相关文章: