Java虚拟机(jvm)为我们的java程序提供了内存用于存放不同的数据,其中包含堆、栈、方法区。
那么java的储存机制是怎样的呢,只有理解了储存机制,我们才能更了解java程序的编写。
栈:
每个线程都有一个栈区,里面存放的是局部变量中基本数据类型的值以及对象和基本数据的引用,以及操作栈(进行一些方法操作)。
每个栈间的数据是不可以共享的,所以我们可以称其为局部变量。
分为三部分:基本数据类型变量区、执行环境上下文、操作指令区
堆:
堆里面存放的都是对象,而每个对象都包含有与之对应的class信息(用于从栈中得到操作指令)
值得注意的是,jvm只有一个堆区被所有线程所共享。
方法区:
用来存放static静态的变量,方法。还有所有的class类。
方法区中存放的是整个程序中永远唯一的数据。
总结:
看到一个简单的面试题,基本数据类型一定存放在栈中吗?为什么?
在上面的解释中,可能很多人会觉得是正确的。
但是我们应该这么解释,当基本数据类型属于局部变量时,那么他就被存放在栈中了,在方法执行完成之后,他就会被释放掉
但是如果它成为全局变量的时候,也就是成为一个类中的成员变量的时候,我们在创建对象的时候,它就会成为对象的一个属性,也就是成为对象的一部分,这时候,对象是存储在堆中的。
这就可以说明,基本数据类型也是可以存放在堆中的。
例子
String str = “abc”;
str.equal(“abc”);
首先我们的栈会生成一个str的引用数据,然后我们在方法区中查看是否存在这样的常量对象,没有就在堆中创建出来,而str就指向堆中的这个位置,方法区中加载一个String类的class数据。
到了第二步,我们就通过堆中的str对象在方法区中的String.calss找到equal方法,把equal方法加载到栈中进行执行,执行完成以后就出栈。