java内存区域--运行时数据区域

来源:互联网 发布:知乎的神回答 编辑:程序博客网 时间:2024/04/28 01:46

这里写图片描述

方法区:存储类信息(类的名称、类的全限命名、类的类型),类变量(静态变量),编译之后的字节码指令(方法)。

堆:存储对象实例。

虚拟机栈:包含局部变量表(方法参数、局部变量),操作数栈,动态链接,方法返回地址。

本地方法栈:为虚拟机使用的native方法服务。

程序计数器:记录虚拟机字节码指令地址(当前线程所执行的字节码的行号指示器)。

案例一:方法调用执行过程

    public static void main(String[] args) {        getSize(10);    }    private static int getSize(int tt) {        CreditCardStore store = new CreditCardStore();        int size = store.getTransInfoList().size();        return tt + size;    }
main方法执行getSize(10)方法时,虚拟机栈中:第一步,方法参数tt=10放入局部变量表中。第二步,程序计数器执行从方法区获取的第一条字节码指令(new一个实例对象),将实例对象存放在堆中,将引用存放在动态链接中。第三步,程序计数器执行第二条字节码指令getTransInfoList()方法。第四步,程序计数器执行size()方法。第五步,将size的值放入局部变量表中。第六步,程序计数器从局部变量表中获取的size和参数tt执行字节码指令,压入操作数栈。第七步,执行字节码指令相加操作。第八步,执行字节码返回指令,返回到上一个方法执行状态。

案例二:类的说明

/** * @note 类的加载时:类加载到方法区 */class Ba {    /**     * @note 类的准备时:类变量加载到方法区添加默认值     */    public static String NEW_YEAR_BEGIN = "2016-02-03 23:59:59";    /**     * @note new实例时:实例变量跟随实例加载到堆,     * @note 实例变量之前存储在方法区的运行时常量池(存放编译期生成的各种字面量和符号引用)     */    public int years = 1;    private int yearsTwo;    /**     * @note 类的加载时:普通方法、静态方法分配到方法区     * @note 方法指令     *     aload_0 :将第一个引用类型本地变量推入栈顶     *     getfield :获取实例的属性值     *     iconst_1 :将int=1推至栈顶     *     iadd :将int类型+1     *     ireturn :将int类型返回     */    public int test1() {        return yearsTwo + 1;    }}
0 0