运行时数据区由四部分组成

1、
Eden区
  对象首先放在Eden区,如果Eden区满载之后,jvm(字节码执行引擎)会单独开启一个垃圾收集线程,执行minor gc垃圾收集(将非垃圾对象复制到空的Survivor区,并清空Eden区和另一个Survivor区)。
  经过15次gc操作还没有被销毁时,会被jvm移动到老年代里。
  当老年区满载之后,可能程序就要挂掉了.....

  GC ROOTs根节点:
    线程栈的本地变量,静态变量,本地方法栈的变量等。
  垃圾回收机制(可达性分析算法):
    将“GC ROOTs”对象作为起点,从这些节点开始向下搜索引用的对象(搜索不限于Eden区),找到的对象都标记为非垃圾对象,其余的对象都标记为垃圾对象(如果一个对象经过一次GC处理没有被销毁掉,那么它的分代年龄会加一)。
2、栈(线程):
  通过指针指向堆内存中对象的位置来调用相关对象。
3、本地方法栈
4、程序计数器:
  标记程序运行位置
5、方法区(元空间):
  常量+静态变量+类

其中:
  1、每一个线程都有自己单独的:栈,本地方法栈,程序计数器。
  2、堆,方法区所有线程共享。

图片说明
  栈帧(stack frame)是用于支持虚拟机进行方法调用和方法执行的数据结构,它是虚拟机运行时数据区中的虚拟机栈的栈元素。栈帧存储了方法的局部变量表、操作数栈、动态连接和方法返回地址等信息。

栈帧内存空间(每一个方法对应一个自己的栈帧空间)
  1、局部变量表:
    用于储存局部变量
  2、操作数栈:
    一个指令将操作数压入栈,另一个指令将操作数弹出栈进行相关操作,最后将结果压入栈,相关指令将相关结果弹出栈,最后将结果储存到相应位置。
  3、动态链接:

  4、方法出口:
    储存下一步方法执行位置。

javap:javap是jdk自带的反解析工具,使用javap 操作指令反解析字节码,生成更加可读的相关信息。