JVM
此文章梳理自己对jvm整体概况的理解,未深入细节
思考,为什么要学习 jvm
一、理解jvm定位
1、jvm jdk jre 关系
jdk:java程序开发最小环境
jre:java程序运行最小环境
jvm:java虚拟机
java可跨平台 - jvm起主导作用。
二、java运行时数据区
1、程序计数器
2、栈(java虚拟机栈、本地方法栈 hotspot将其合二为一)基本单位 - 栈帧(每个方法一个栈帧)
3、堆
4、方法区
知道那些私有,哪些共享。配合线程去思考
三、垃圾回收
主要围绕三个点:what 回收什么?when 什么时候回收?how 怎么回收?
1、主要回收堆区,因为对象的创建和销毁十分频繁,少数方法区
2、判断对象是否消亡(引用计数算法、可达性分析法)
3、三种回收算法:标记 - 清除 、 复制(新生代) 、标记 - 整理(老年代),需知道为什么会因为新生代、老年代分别使用不同算法
4、引用(强、软、弱、虚)
5、了解各类回收器
四、java内存模型
JMM(Java Memory Model)
java内存模型产生:jvm规范中试图定义一种java内存模型(JMM)来屏蔽掉各种硬件及操作系统的内存访问差异。
从什么方向理解JMM:java内存模型与线程做整合理解,并融合java运行时数据区理解
细节:
1、协调cpu、内存工作:
cpu的运行速率和内存的运行速率相差还是很大的,为了更进一步的压榨cpu,会在线程中引用高速缓存,高速缓存会遵循(各类)一致性协议,与主内存进行交互。
同时在编译时也会有指令重排序的优化。(同时了解happens-before原则)
Java 语言规范规定了JVM线程内部维持顺序化语义,也就是说只要程序的最终结果等同于它在严格的顺序化环境下的结果,那么指令的执行顺序就可能 与代码的顺序不一致
线程、工作内存、主内存关系:
五、类文件结构
Class文件是一组以8位字节为基础的单位的二进制流。
魔数和版本
常量池
访问标志
类索引 父类索引 接口索引集合
字段表集合
方法表集合
属性表集合
六、类加载机制
虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制。
1、加载:
① 通过一个类的全限定名,获取定义此类的二进制字节流
② 通过字节流展现的静态结构,转换为方法区的运行时数据结构
内存中生成一个代表这个类的java.lang.Class对象,作为方法区这个类的数据访问入口
2、验证:
验证是连接阶段的第一步,目的是为了确保Class文件的字节流信息是符合JVM的要求,并不会危害到自身的安全
3、准备:
正式的为类变量分配内存并设置类变量的初始值状态,这些变量所使用的内存都将在方法区中进行分配。
4、解析:
解析阶段是虚拟机将常量池内的符号引用转换为直接引用的过程。
5、初始化:
真正的执行字节码