志在指尖
用双手敲打未来

Java 中 Stack(栈) 与 Heap(堆)

布景
Java中Stack(栈)与Heap(堆)是面试中被常常问到的一个话题。
有没有对Java中Stack(栈)与Heap(堆)纯熟于心的童鞋,请举手!!!(怎么没人举手…)
这个时分蜗牛哥的目标弱弱的举起了小手(这个目标不是new出来的哈)
女朋友:牛哥,谁要怼咱呀?我要不要先打个摇摇灵?
蜗牛哥:Heap(堆)与Stack(栈)是两种内存区域,不是要干架(没文化真可怕…)
蜗牛哥:今日就来给你讲讲Java中Stack(栈)与Heap(堆)到底是什么?
女朋友:好呀,好呀,搞明白了堆与栈,我是不是便是Java高级工程师了?
蜗牛哥:有牛哥在,你还怕搞不明白???
女朋友:嘻嘻,我已经拿好我的小本本准备好记笔记了java
蜗牛哥:好的,那咱们这就开讲
什么是Stack(栈)内存?
Java中的Stack(栈)是内存的一部分,包括办法、局部变量和引证变量。Stack(栈)内存一直以后进先出次序引证。在Stack(栈)内存中创立局部变量。
什么是Heap(堆)内存?
Heap(堆)是包括目标的内存部分,也或许包括引证变量。实例变量在Heap(堆)内存中创立。
Java中的内存分配
JVM将内存划分为以下部分。
Heap(堆)
Stack(栈)
Code(代码)
Static(静态)
这种内存划分是有效办理内存所必需的。
Code(代码)内存包括所有您的字节码。
Stack(栈)内存包括所有办法、局部变量和引证变量。
Heap(堆)内存包括目标(也可以含有引证变量)。
Static(静态)内存包括静态数据/办法。
本地和实例变量之间的区别
变量实例被声明在类中,但不包括办法内变量
classStudent{intnum;//num为实例变量publicvoidshowData{}
局部变量被界说在办法内部,包括办法参数。
publicvoidsum(inta){intx=inta+3;//a,x是局部变量;}
栈和堆之间的区别
让咱们举个例子来更好地了解这一点。
考虑一下你的main办法调用办法m1
publicvoidm1{intx=20}
在java栈中,将创立一个frame(栈帧)在办法m1中。
m1中的变量X也将在栈中为m1的frame(栈帧)中创立(见下图)。
办法m1调用办法m2。在java栈中,在m1的frame(栈帧)顶部为m2创立一个新栈帧。
变量b和c也将在栈中的栈帧m2中创立。
publicvoidm2(intb){booleanc;
}
同样的办法m2是调用办法m3。同样在栈顶部创立一个栈帧m3(见下图)。
现在假定咱们的办法m3正在为类“Account”创立一个目标,它有两个实例变量intp和intq。
Account{Intp;Intq;
}
这是办法m3的代码
publicvoidm3(){
Accountref=newAccount();//morecode}
语句newAccount()将在堆中创立一个Account目标。
引证变量“ref”将在java堆中创立。
赋值“=”运算符将使引证变量指向堆中的目标。
一旦办法履行完,操控流程将回来调用办法。在里的状况,便是回来到办法m2。
办法m3的栈将被改写
由于引证变量ref将不再指向堆中的目标,因而它将契合垃圾回收的条件。
办法m2完结履行后。它将从仓库弹出,其所有变量将被改写,不再可用。
同样关于办法m1。
最终,操控流程将回来程序的起始点。一般,便是“main”办法。
如果目标有一个引证作为其实例变量怎么办?
publicstaticvoidmain(Stringargs[]){
Aparent=newA();//morecode}classA{
Bchild=newB();inte;//morecode}classB{intc;intd;//morecode}
在这种状况下,引证变量“child”将在堆中创立,而堆又将指向其目标,如下图所示。
总结一下:
调用办法时,会在栈顶部创立一个栈帧。
一旦办法完结履行,操控流将回来到调用办法,并改写其相应的栈帧。
在栈中创立局部变量
实例变量在堆中创立并且是它们所属目标的一部分。
在栈中创立引证变量。

未经允许不得转载:IT技术网站 » Java 中 Stack(栈) 与 Heap(堆)
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!

 

志在指尖 用双手敲打未来

登录/注册IT技术大全

热门IT技术

C#基础入门   SQL server数据库   系统SEO学习教程   WordPress小技巧   WordPress插件   脚本与源码下载