工作中偶然遇到一个问题,让我想重温一下这个神秘的的领域Java 堆和栈
What is Heap Memory?
对于大多数引用来说,Java堆(Java Heap)是Java虚拟机管理内存中最大的一块。Java堆是被所有线程共享的一块内存区域在虚拟机启动时创建,此内存区域唯一目的就是存放对象实例,几乎所有对象实例都在这里分配内存。这一点在java虚拟机规范中的描述是:所有的对象实例以及数组都要在堆上分配。
--- 引自深入理解java虚拟机
是不是只是实例对象和数组呢,有没有引用变量存在我们的堆中呢还且继续往下看。
What is Stack Memory?
栈大家应该多少有些了解它有几个特征如下:
1.是线程私有的,其生命周期也与线程相同
2.主要用来存储 局部变量,引用变量,方法信息等
3.last in first out
下面先举例说明先什么是局部变量和实例变量
从上图我们可以 看出实例变量和局部变量的区别
1.实例变量在方法外面不在方法里面
2.局部变量在方面里面不在方法外面
下面再举一个例子来更好的理解上面所说,
比如我们在main方法中调用我们的first方法
它会做些什么呢?
1.首先他会先在栈中创建如下
2.当然我们的变量firstVariable也会在栈中创建
继续往下走我们让我们的first方法再进行调用我们的second
这个时候我们的内存会是怎样的变化呢
1.首先在栈的上方会压入我们的第二个方法
2.紧接着是变量也会加到我们的栈中
继续向下看,使用第二方法调用下面的方法会有什么的结果,
看下图展示:
1.首先我们在Heap上创建我们的对象实例还有实例变量
2.在栈的顶部压入我们的第三个方法,并把引用变量加入栈中
3.栈用引用执行我们在堆中生成的实例对象
当我们的第三个方法调用结束
这是将不会有任何有任何引用指向我们刚才在堆上生成的实例,这是整个实例会被GC回收,
在栈中根据栈的last in first out 原则,在第三个方法调用结束的时候内存也随之释放,
最后第二个方法和第一个方法也随着调用结束从栈中弹出,总的方法在调用处结束这里也就是我们的main方法
以上就是一个简单例子在堆栈中的分配
个人公众号欢迎共同成长交流