java Virtual Machine ==>> java 虚拟机
一、JDKJREJVM概念
由上图可以看出
JDK包含JRE包含JVM
简单来说
三者联系:JVM不能单独搞定class的执行,解释class的时候JVM需要调用解释所需要的类库lib。在JDK下面的的jre目录里面有两个文件夹bin和lib,在这里可以认为bin里的就是jvm,lib中则是jvm工作所需要的类库,而jvm和 lib和起来就称为jre。
JVM+Lib=JRE。
总体来说就是,我们利用JDK(调用JAVA API)开发了属于我们自己的JAVA程序后,通过JDK中的编译程序(javac)将我们的文本java文件编译成JAVA字节码,在JRE上运行这些JAVA字节码,JVM解析这些字节码,映射到CPU指令集或OS的系统调用。
JVM流程
类装载器ClassLoader
负责加载class文件,class文件在文件开头有特定的文件标示,
并且ClassLoader只负责class文件的加载,至于它是否可以运行,则由
Execution Engine决定
类装载器ClassLoader2
虚拟机自带的加载器
• 启动类加载器(Bootstrap)C++
• 扩展类加载器(Extension)Java
• 应用程序类加载器(AppClassLoader)
Java
也叫系统类加载器,加载当前应用的
classpath的所有类
• 用户自定义加载器
Java.lang.ClassLoader的子类,用户
可以定制类的加载方式
Execution Engine
执行引擎负责解释命令,提交操作系统执行
pc Register:寄存器:当多个线程时,记录下当前线程执行的位置,下次再回来的时候继续执行
• 程序计数器是一块较小的内存空间,是当前线程所执行的字节码的行号指示器
• 程序计算器处于线程独占区
• 如果线程执行的是java方法,记录的是正在执行的虚拟机字节 码指令的地址,如果是native方法,这个计数器值为undefined
栈区 :
Stack 栈是什么
栈也叫栈内存,主管Java程序的运行,是在线程创建时
创建,它的生命期是跟随线程的生命期,线程结束栈内存也就释
放, 对于栈来说不存在垃圾回收问题,只要线程一结束该栈就
Over,生命周期和线程一致,是线程私有的。8种基本类型的变
量+对象的引用变量+实例方法都是在函数的栈内存中分配。
栈存储什么?
• 局部变量表:输入参数和输出参数以及方法内的变量类型;局部变量表在编译期间完成分配,当进入一个方法时,这个方法在帧中分配多少内存是固定的
• 栈操作(Operand Stack):记录出栈、入栈的操作;
• 动态链接
• 方法出口
栈溢出
StackOverflowError,OutOfMemory
堆:JVM内部最大的部分, 不安全的,共享的 超出 outofmemeryerror
方法区:共享
字节码指令
独享:PC 寄存器,本地方法区、虚拟机栈
主内存:线程所独有的,线程安全
工作内存:共享的内存,线程不安全的
方法的执行其实是压栈和出栈
栈帧其实可以代表方法的执行,栈可以动态去调整大小,超出以后就会出现
1、编译 将java文件编译成class文件
编译后的class其实是二进制代码,有规则的二进制代码 以cafe babe开头
(2)类加载机制
JVM的类加载是通过ClassLoader及其子类来完成的,类的层次关系和加载顺序可以由下图来描述:
顶级父类先去加载,,永远抛给服了(好处:父类只加载一次)