JVM 工作原理和流程

一.JVM由运行时数据区+两种机制组成+本地方法接口

JVM 工作原理和流程

JVM 将内存区域划分为:

  1. Heap():存放所有new出来的对象(程序调优
  2.  Method Area(Non-Heap)(方法区):存放静态变量+常量+类信息(构造方法/接口定义)+运行时常量词
  3. Native Method Stack (本地方法栈):native(可以和操作系统直接交互的语言,即可以引用c,c++等实现的方法)
  4. ,Program Counter Register(程序计数器):
  5. VM Stack(虚拟机栈,也有翻译成JAVA 方法栈的,JAVA栈):
  • 存放基本类型的变量数据
  • 对象的引用(也可以叫实例),但对象本身不存放在栈中,而是存放在堆(new 出来的对象)或者常量池中(对象可能在常量池里)(字符串常量对象存放在常量池中。);

每个JVM都有两种机制:

      ①类装载子系统:装载具有适合名称的类或接口

     ②执行引擎:负责执行包含在已装载的类或接口中的指令

JVM 工作原理和流程

栈:

注:

通过javac 编译成class 文件

1.程序运行时,JVM运行会把类(class 文件)的信息加载到方法区,生成对应的字节码文件,main方法本身也放入方法区

2.执行引擎执行mian方法或者执行主线程

运行线程时,Java分配一个栈

栈调用资源(调用方法时,先分配main方法),给对应的资源分配一个空间即栈帧(栈的数据结构是先进后出)

栈帧主要包含JVM 工作原理和流程(根据jvm字节码可以读懂底层执行原理)

栈帧里面的操作一般为(调用方法):

把变量压到栈里面

在操作数栈里对局布变量表里的书进行操作    把结果存到局部变量表里

通过方法出口把结果返回到方法

操作数栈 与调用方法的栈帧全部销毁,

进入下一栈帧(创建对象

在局部变量表里压入一个变量(对象的引用/实列),指针指向堆里面的对象,指针指向方法区的类信息(反射现象

..........接下的同上.......

程序计数器会记下每一步操作

JVM 工作原理和流程

 

 

堆(heap):

JVM 工作原理和流程

新new对象往新生代放,先在eden区存放,满了之后先做一次小gc清理没有用的对象,多余的对象移动到from区存放,其间,小gc再回收没有引用的对象。(from区放满之后,to区位置互换,直接经过to区)。

to区满了之后,把15次没引用的对象放到老年代(次数可以设置的),然后继续往新生代开始放对象,

最终,老年代放满,大gc清理老年代对象(stop the world)