java代码执行流程(复杂)hotspot虚拟机: java源码->编译(compile前端编译器)>字节码(class)->类加载器classloader加载类到内存(4种,加载分为5步骤)-→>jvm内存中(5部分)->执行引擎 execution engine(3部分interpreter解释器jitjust in time)即时compiler后端编译gc(garbagecollection)解释执行把字节码指令翻译为机器指令)->当前系统可识别指令->操作系统(os)
类的加载过程
loading 把class文件(二进制流)(类中的属性 方法 构造 等 )读到方法区中 (jdk7)永久代 (jdk8)元空间
linking(
verify 验证 :保证类的正确性,不会危害虚拟机自身的安全性。
四种验证: 文件格式验证 元数据验证 字节码验证 符号引用验证
prepared 准备: 类属性赋值初始值
resolvel 解析:常量引用 属性引用 解析成真正的引用。
)
initial:为静态变量赋值。 执行类的static属性 静态代码块 优先加载父类。
use:使用
gc(garbage collect):垃圾回收
bootstrap classLoader引导类加载器
c/c++语言编写,是jvm的一部分,加载核心类库,jre/lib库,没有父类加载器,是扩展加载器和应用加载器的父类
extension ClassLoader扩展加载器
java编写加载jre/lib/ext/ 的扩展包
application ClassLoader应用加载器 或者系统加载器
是程序中默认的类加载器java应用类都是由它加载完成java编写负责加载环境变量classpath或者系统属性java.class.path指定下的类库,
默认加载自己编写的java类
CustomClassLoader 还可以自定义编译器,继承
bootstrap classLoader
extension ClassLoader
概念:
当某个类加载器需要加载某个.class文件时,它首先把这个任务委托给他的上级类加载器,递归
这个操作,如果上级的类加载器没有加载,自己才会去加载这个类。
作用:
1、**防止重复加载同一个.class。**通过委托去向上面问一问,加载过了,就不用再加载一遍。保证
数据安全。
2、**保证核心.class不能被篡改。**通过委托方式,不会去篡改核心.clas,即使篡改也不会去加载,
即使加载也不会是同一个.class对象了。不同的加载器加载同一个.class也不是同一个Class对象。
这样保证了Class执行安全。
简介:
存储下一条指令存储地址,执行引擎会根据PC寄存器的编号取出指令执行,如果是native方法就为空
非常小,速度快
线程私有每个线程都有自己的程序计数器
没有内存溢出异常(OOM out of memory Error)没有GC
作用
执行多线程时,CPU要进行多个线程切换,切换后要知道原线程执行的位置
简介:
java虚拟机栈早期叫java栈,每个线程在创建时都会创建一个栈,内部保存了一个一个栈帧,一个
栈帧代表一个java方法,方法执行,就是一次次栈帧出栈和入栈的过程
访问速度仅次于程序计数器
没有GC回收有内存溢出异常(OOM)
方法入栈标识方法的开始,方法出站表示方法的结束
栈帧有大小,大小决定了栈可以存放多少栈帧
java vm栈的大小可以是固定的,也可以是动态的 (动态的 会内存溢出 )
StackOverflowError 栈溢出错误
原因:死循环
调优: 设置set 的 VM options参数设置大一些。
java vm栈有压栈和出栈,遵循先进后出(FILO)或者后进先出(LIFO)原则,正在执行的方法称为当前
栈帧,如果正在执行方法调用了其他方法,对应的新的栈帧就会被创建,
放在栈的顶端成为当前栈帧。
方法结束有正常结束return或者异常方式结束。
1.局部变量表是一个数组,是影响栈帧大小的主要因素是垃圾回收的重要依据
2.存储参数,
3.局部变量,
4.基本数据类型,
5.引用类型和返回值类型
**操作数栈﹐**方法执行过程中,根据字节码指令,向栈中写入和提取数据
动态链接 指向运行常量池的方法引用
DynamiclinkTest使用javap -v DynamiclinkTest.class来观察m1()方法调用
方法返回地址栈帧出站时,把返回值给下一个栈帧,如果异常不会有返回值
StackExecuteDemo使用javap -v观察返回值,异常和正常情况下返回值
一个native方法就是一个java调用非java代码码的接口
使用c或者c++编写的接口,可以通过java调用
融合不同编码语言为java所用
ctrl+n查看object中的getClass()等方法就是native方法
管理本地方法调用的 非Java写的方法
线程私有
可以设置固定大小,也可以动态设置大小
会有StackOverflowError和OutOfMemoryError
与本地方法接口交互
堆:一个jvm实例就是一个进程,一个进程中所有线程共享一个堆,是Java内存管理的核心区域。
JVM的运行时数据区有哪些?运行时数据区的定义:Java虚拟机在执行Java程序的过程中会把它所管理的内存划分
为若干个不同的数据区域。
根据JVM规范,标准的JVM运行时数据区包括以下部分:
程序计数器
·Java虚拟机栈
·本地方法栈
堆内存
·方法区
·运行时常量池



