1,分析jvm内存模型:
分为两个区域,一个是共享区域。
分为方法区和堆,另外一个是私有区。私有区是每个线程私有的对象:程序计数器,虚拟机栈,本地方法栈。
下面介绍下详细的内容:
方法区:类信息,常量,静态变量,class对象。(这里有一个误区就是变量保存在栈里面,其实不然只有局部变量才会保存在栈里面。你也可以通过是否共享来反推这个结论是正确的。)
推:存放对象实例和数组。
程序计数器:线程执行的位置信息。
虚拟机栈:保存局部变量,操作栈,方法返回地址,动态链接地址(堆里面对象的引用链接地址),额外附件信息。
虚拟机栈:局部变量表,操作数栈,动态链接,出口。
1,局部变量表 (locals大小,编译期确定),一组变量存储空间, 容量以slot为最小单位。操作栈(stack大小,编译期确定),操作栈元素的数据类型必须与字节码指令序列严格匹配
2,动态连接, 指向运行时常量池中该栈帧所属方法的引用,为了 动态连接使用。
前面的解析过程其实是静态解析;
对于运行期转化为直接引用,称为动态解析。
3,方法返回地址,正常退出,执行引擎遇到方法返回的字节码,将返回值传递给调用者异常退出,遇到Exception,并且方法未捕捉异常,那么不会有任何返回值。
4,额外附加信息,虚拟机规范没有明确规定,由具体虚拟机实现。
下面介绍实例内容:
测试代码:
TestO t = new TestT();
t.tt();
t.ttt();
说明执行顺序是:执行顺序是父类的构造方法 ,子类的构造方法。静态方法执行还是父类的。非静态的方法是子类的。