1 栈
1.1 什么是栈?
它是在运行java程序时,java虚拟机从计算机内存中申请的一块空间,这块空间的结构就好像一种特殊的队列,遵循着后进先出的原则。你可以将它想象成一个放置乒乓球的圆柱形球筒。当你往里面放置乒乓球,装满之后在往外取,最后放进去的球,通常被最先取出来。这就叫后进先出。
1.2 什么东西放在栈里?
局部变量,方法调用
1.3 放在栈里的东西是如何被消费的?
举个例子:当某段程序调用doStuff方法使得doStuff方法被放在最上方的栈块中,doStuff方法又调用了go方法,go就又被放在栈顶,go又调用了crazy方法,使得现在crazy被推至栈顶,当crazy执行完之后,它的栈块被释放掉,执行又回到go,以此类推,直到doStuff方法被执行完后,栈才被完全清空。
1.4 什么是局部变量?
声明在方法中变量,方法的参数。它们是暂时的,生命周期仅限于方法被放在栈上的这段时间。有一种特殊的局部变量,在方法中引用的实例对象,变量只保存对象的引用地址,真正对象生存在堆中。
2 堆
2.1 什么是堆?
与栈同样是java虚拟机在内存中取得的一块空间,这块空间的结构好像一颗树,与栈不同的是堆(heap)是用来存放对象的。
2.2 什么东西放在堆中?
实例对象,实例变量,因为实例对象包含实例变量,所以实例变量也等同于存在堆中。如果对对象在堆中如何分布感兴趣请看这篇
2.3 什么是实例对象?
实例对象是系统中用来描述客观事物的一个实体,它是构成系统的一个基本单位。一个对象由一组属性和对这组属性进行操作的一组服务组成。从更抽象的角度来说,对象是问题域或实现域中某些事物的一个抽象,它反映该事物在系统中需要保存的信息和发挥的作用;通俗的来讲,对象就是使用程序对现实存在的事物一种抽象的描述。例如:现实中有一条叫小花的狗,程序中的描述就是使用一个变量来引用这个被实例化出来的对象,这个对象的名字叫小花,年龄5岁,这就是小花这个对象的属性也叫实例变量。这个小花还有有跑,跳,吃,睡等行为,这就叫做对象的方法。