JVM 工作原理和流程
一.JVM由运行时数据区+两种机制组成+本地方法接口
JVM 将内存区域划分为:
- Heap(堆):存放所有new出来的对象(程序调优)
- Method Area(Non-Heap)(方法区):存放静态变量+常量+类信息(构造方法/接口定义)+运行时常量词
- Native Method Stack (本地方法栈):native(可以和操作系统直接交互的语言,即可以引用c,c++等实现的方法)
- ,Program Counter Register(程序计数器):
- VM Stack(虚拟机栈,也有翻译成JAVA 方法栈的,JAVA栈):
- 存放基本类型的变量数据
- 对象的引用(也可以叫实例),但对象本身不存放在栈中,而是存放在堆(new 出来的对象)或者常量池中(对象可能在常量池里)(字符串常量对象存放在常量池中。);
每个JVM都有两种机制:
①类装载子系统:装载具有适合名称的类或接口
②执行引擎:负责执行包含在已装载的类或接口中的指令
栈:
注:
通过javac 编译成class 文件
1.程序运行时,JVM运行会把类(class 文件)的信息加载到方法区,生成对应的字节码文件,main方法本身也放入方法区
2.执行引擎执行mian方法或者执行主线程
运行线程时,Java分配一个栈
栈调用资源(调用方法时,先分配main方法),给对应的资源分配一个空间即栈帧(栈的数据结构是先进后出)
栈帧主要包含:(根据jvm字节码可以读懂底层执行原理)
栈帧里面的操作一般为(调用方法):
把变量压到栈里面
在操作数栈里对局布变量表里的书进行操作 把结果存到局部变量表里
通过方法出口把结果返回到方法
操作数栈 与调用方法的栈帧全部销毁,
进入下一栈帧(创建对象)
在局部变量表里压入一个变量(对象的引用/实列),指针指向堆里面的对象,指针指向方法区的类信息(反射现象)
..........接下的同上.......
程序计数器会记下每一步操作
堆(heap):
新new对象往新生代放,先在eden区存放,满了之后先做一次小gc清理没有用的对象,多余的对象移动到from区存放,其间,小gc再回收没有引用的对象。(from区放满之后,to区位置互换,直接经过to区)。
to区满了之后,把15次没引用的对象放到老年代(次数可以设置的),然后继续往新生代开始放对象,
最终,老年代放满,大gc清理老年代对象(stop the world)