JAVA代码的执行
- Java源码 在Java编译器中 经过一系列的加工称.classs文件。
- 将.class文件放置到java虚拟机【JVM】。
- Java续集你使用类加载器加载class文件。
- 类加载器加载完成之后,对字节码进行校验,字节码校验通过后JVM吧字节码翻译成机器码交给操作系统执行。
Java编译器 .java源码 在Java编译器中【词法分析、语法分析、语义分析、字节码生成器】变成.class文件
Java虚拟机 .class文件放入JVM中【类加载器、字节码校验、翻译机器码,编译执行】
所以JVM是java实现跨平台的关键。
字节码
如果某个程序因为不同硬件平台需要编写多套代码,是十分领人崩溃的,而Java可以一次编写,到处执行。Java的跨平台是通过增加一个中间层来解决,字节码"Bytecode"就是该中间层.Java所有执行有200个左右,一个字节(8位)可以存储256种不同的指令信息,一个这样的字节称之为"字节码"。JVM可以将字节码编译执行,如果是热点代码,或通过JIT动态的编译为机器码,提高执行效率。
热点代码:JVM虚拟机判定热点代码的方式有两种:
- 采样热点判定
主要是虚拟机周期性检查各个线程的栈顶,若某个方法经常出现在栈顶,那么这个方法就是热点方法。 - 计数器热点判定
虚拟机给每个方法甚至代码块简历一个计数器,统计方法的执行次数,超过一定阀值标记此方法为热点方法。【在Client模式下阀值1500,Server是10000】
在Java编译器中此法解析是通过空格分割出的单词、操作符、控制符等信息,将其形成token信息流,传递给语法解析器,语法解析器把token信息流按照Java语法规范组装成一颗语法树,在语义分析阶段,需要检查关键字使用的是否合理、类型是否匹配、作用域是否正确,当语义解析完成后即可生成字节码。
字节码必须经过类加载器加载到JVM环境后才可以执行。执行有三种模式:
- 解释执行
- JIT编译执行
- JIT编译与解释混合执行
类加载
ClassLoader是提前加载.class文件到CPU中执行,在加载类时,使用的是"双亲委派模式"。
- Load阶段读取类文件,产生二进制流,并转换为特定的数据结构,然后创建对应类的java.lang.Class实例。
- Link阶段包括验证,准备,解析三个步骤。验证是更加详细的校验,比如final是否合规,数据类型是否正确。
- Init阶段执行类构造器。
垃圾回收机制
Java会对内存进行自动分配与回收管理,是上层业务更加安全。垃圾回收(Garbage Collection GC)。垃圾回收主要是清除不在使用的对象,自动释放内存。
- 判断对象是否存活。
JVM引入了GC Roots。如果一个对象与GC Roots之间没有直接或间接的引用关系(某个失去任何引用的对象,或者两个相互引用的对象)判决这些对象的状态是准备回收尚未回收。
垃圾回收器是实现垃圾回收算法并且应用在JVM环境中的内存管理模块。
实现垃圾回收器可以参考
https://www.cnblogs.com/jalja365/archive/2020/01/12/12182064.html