参考书籍:《深入理解Java虚拟机》
JVM内存模型分为5个运行时数据区域:
image.png1. 程序计数器:
当前线程所执行的字节码的行号指示器,线程私有。
2. 本地方法栈:
执行native
方法,线程私有。
3. Java虚拟机栈:
执行Java方法,线程私有。先进后出原则。
执行方法时,都会先创建一个栈帧,并在Java虚拟机栈中入栈,方法执行完,栈帧出栈。
比如:初学者都会遇到方法内部改了传进来的变量值,而方法执行完后,变量的值却不变的题目,这就涉及到栈的原理了。
示例代码:
public class Test {
public static void main(String[] args) throws InterruptedException {
int i = 20;
test(i);
System.out.println(i);// 20
}
public static void test(int i) {
i = 10;
}
}
i 的值依旧为20。
- 用文字来解释:Java方法传基本类型的值传的是值的拷贝(PS:传对象引用也是传的引用拷贝,但是最终指向堆中的同一个对象),既然是值的拷贝,当然不影响原来的值。
- 用流程图来解释执行过程:
4. 堆:
new
的对象都存储在堆内存中,线程共享。
5. 方法区:
存储Class字节码信息、final常量、静态变量等,线程共享,运行时常量池是方法区的一部分,主要用来存储编译器生成的字面常量,比如字符串。
比较典型的是String类的intern()
方法,如果常量池中已存在就直接返回,反之,创建新字符串存放到常量池再返回该字符串。
示例代码:
String var = new String("233");
String intern = var.intern();
System.out.println(var == intern);//false
简图.png
变量var
指向堆,intern
指向方法区的常量池,两者分配的内存地址不同,==
比较结果当然是false。
上述5个运行时数据区域,主要需要清楚Java虚拟机栈、堆、方法区这3个。
网友评论