jvm的跨平台,字节码的作用
jvm的跨平台
不同操作系统系统运行的JVM不一样,但度能够处理对应的字节码文件
字节码的作用
利用编译节省了运行的时候的效率
JVM整体结构
类加载子系统:用于加载不同的class(字节码)文件
解释器:方法区所存在的字节码指令
垃圾回收器:回收内存里的垃圾
JTT编译器:编译热点指令(不用每次都翻译,翻译一次缓存起来)
类加载子系统
类加载的过程:
(把class文件从磁盘中的class文件加载到方法区的内存当中)
加载—— 验证—— 准备 —— 解析 —— 初始化
加载 :磁盘读取
验证:验证class文件的准确性
准备:为static的属性变量分配内存并赋零值
解析:将符号引用解析为直接引用 (类里面应用类名,我们代码是根据包名类名识别(符号引用),此时我们要将其转换成直接指向类名地址(直接引用))
初始化:赋值是否制定了明确的值
类加载器分类
jdk默认提供的三个类加载器
BootStrapClassLoader:jre/lib
ExtClassLoader: jre/lib/ext
AppClassLoad: app应用的路径 (target/classes路径下的class类)
双亲委派机制
作用:避免类的重发加载,避免核心API被篡改
具体代码(暂放)
大概的原理:就是现会找到其的父类加载器判断是否有该类,有的话就父类加载器进行加载,没有的话就子类进行加载
Tomcat为什么要使用自定义加载器WebappClassLoader
为了进行类隔离
运行时数据区
代码栈执行的过程
程序计数器
虚拟机栈(方法栈/java栈)
栈帧
操作数栈
局部变量表
本地方法栈
native method:java定义的用c实现的方法
堆
方法区(元空间)
垃圾回收机制
为什么要进行垃圾回收机制:
垃圾是指在IM中没有任何引用指向它的对象,如果不清理这些垃圾对象,那么它们就一直占用着内存,而不能给其他对象使用,最终垃圾对象越来越多,就会出现OOM了。
java对象在堆里的流转过程
垃圾回收算法
引用计数法
可达性分析法
GC ROOT包括
GC Roots是一组引用,包括
- 线程中虚拟机栈中正在执行的方法中方法参数、局部变量所对应的对象引用
- 线程中本地方法栈中正在执行的方法中方法参数、局部变量所对应的对象引用
- 方法区中保存的类信息中静态属性所对应的对象引用
- 方法区中保存的类信息中常量属性所对应的对象引用等等
标记-清除算法(对找到的垃圾进行处理)
优点:思路简单
缺点:效率不高,内存碎片
复制算法