? ? ? ?考虑这么一段代码:
package test;
/**
* Test :
*
* @author xuejupo jpxue@travelsky.com create in 2016-1-27 下午6:46:39
*/
public class Test {
/**
* main:
*
* @param args
* void 返回类型
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Test t = new Test();
Test1 t1 = t.new Test1();
String s = "test";
t1.test1();
}
class Test1 {
private static final int i = 1;
private int i2 = 1;
private Test2 t = new Test2();
public void test1() {
this.test2();
}
public void test2() {
}
}
class Test2 {
}
}
? ? ? ?它在jvm内存模型中的位置是怎么样的?代码里的变量分别在堆,栈,方法区,常量池的什么位置?
?
? ? ??首先,jvm对栈的操作是以栈帜为单位的,栈帜保存的是方法数据,而且栈是不可共享的,对于类的成员变量来说,不可能在栈中。方法区用于保存已被虚拟机加载的类信息,常量,静态变量,即时编译器编译后的代码等数据(JIT),方法区物理上是堆的一部分,但逻辑上应该与堆区分开,看深入jvm上的解释,方法区保存的是类的信息,跟类的实例对象是没有关系的。
? ? ?所以,类的成员对象是保存在堆中的,如类Test1中的i2和Test2的引用t。
? ? ? ?对于方法区中的常量池,深入jvm是这么说的:存储编译期生成的各种字面量和符号引用。
? ? ? 比较绕的是这个符号引用。。。 以下是根据网上查询的结果和自己的理解总结的:
原文:http://709002341.iteye.com/blog/2274402