001. 深入JVM学习—Java运行流程

1. Java运行流程图

001. 深入JVM学习—Java运行流程

2. Java运行时数据区

001. 深入JVM学习—Java运行流程

3. Java虚拟机栈

  1. 栈内存是线程私有的,其生命周期和线程相同;

  2. 虚拟机栈描述的是Java方法执行的内存模型:执行一个方法时会产生一个栈帧随后将其保存到栈(先进后出)的顶部,方法执行完毕后会自动将此栈帧进行出栈。顶部的栈帧就表示的是当前的方法;

    • 如果请求的栈的深度过大,虚拟机可能会抛出*Error异常,
    • 如果虚拟机的实现中允许虚拟机栈动态扩展,当内存不足以扩展栈的时候,会抛出OutOfMemoryError异常。
  3. 图介绍

    001. 深入JVM学习—Java运行流程

  4. 栈帧主要组成成分

    • 局部变量表(Local Variables):方法的局部变量或形参,其以变量曹槽(solt)为最小单位,只允许保存32位长度的变量,如果超过32位则会开辟两个连续的solt(64位长度,long和double);
    • 操作数栈(Operand Stack):表达式计算在栈中完成;
    • 指向当前方法所属的类的运行时常量池的引用(Reference to runtime constant pool):引用其他类的常量或者使用String池中的字符串;
    • 方法返回地址(Return Address):方法执行后需要返回调用此方法的位置,所以需要在栈帧中保存方法返回地址。

4. Java内存管理

  1. JVM中的运行时数据区包括:

    • 程序计数器(Program Counter Register)
    • Java栈(Stack)
    • 本地方法栈(Native Method Stack)
    • 方法区(Method Area)
    • 堆(Heap)
  2. 栈是运行时的单位,而堆是存储的单位。

    • 栈因为是运行单位,里面存储的信息都跟当前线程(或程序)相关的信息。包括局部变量、程序运行状态、方法返回值等等;
    • 堆只是保存对象信息。
  3. 图解

    001. 深入JVM学习—Java运行流程

5. 相关知识

  1. JVM:Java虚拟机,所有程序都要求运行在JVM上,考虑到了可移植性问题。

  2. Java程序中可以使用native关键字实现本地C函数的调用。但是这些都属于程序运行的辅助手段,而真正的程序都运行在“运行时数据区”之中。

  3. 运行时数据区分为以下几个内存空间:

    • 堆内存:保存所有引用数据类型的真实信息;
    • 栈内存:基本类型、运算、指向堆内存的指针;
    • 方法区:所有定义的方法的信息都保存在此区之中,此区属于共享区;
    • 程序计数器:是一个非常小的内存空间,小到可以忽略;
    • 本地方法栈:每一次执行递归的方法处理的时候实际上都会将上一个方法入栈
  4. Java之中存在对象池的概念,对象池是对整个常量的常量池的规则破坏,因为在JVM启动的时候,所有常量都已经分配好空间,但是String中的intern()方法却可以打破限制,动态的进行常量池的内容设置。

转载于:https://my.oschina.net/shadowolf/blog/1833970