废话不说,直接上图,说明一切,然后我一个个的去分析。
java虚拟机栈
java中的每个方法在执行的时候都会产生一个栈帧,栈帧里面存放的就是局部变量表,操作数栈,动态链接,方法出去。话不多说,直接上图:
一个方法从调用到执行完成,就是一个栈帧从入栈到出栈的过程。
java方法区
方法区在jdk1.8之后,叫做元区间,存放的地方就是物理内存了。
存放的是类的信息(class信息),常量(运行时常量池),静态变量,编译后的代码。
举例如下:
String a ="abc";
String b ="abc";
Integer aa=100;
String c = new String("abc");
System.out.println(a==b);
System.out.println(a==c);
System.out.println(a==c.intern());
//结果是true,false,true.
分析如下:
可以看出,ab,指向的同一个方法区的的常量池,所以true
ac,a的值指向方法区的常量池,c的值指向了堆的地址,所以是false
a==c.intern(),intern()这个方法比较特殊,是将堆中的内容,转移到常量池中,是转移,不是复制。转移到常量池之后,本来就有,就会覆盖,所以最后都指向常量池的地址,所以是true.