day1 读完前三章
- 关于Jit编译器和解释器和关系,见博客:https://www.cnblogs.com/insistence/p/5901457.html
- HotSpot VM,相信所有Java程序员都知道,它是Sun
JDK和OpenJDK中所带的虚拟机,也是目前使用范围最广的Java虚拟机。这款虚拟机在JIT编译上有许多优秀的理念和实际效果
java虚拟机采用混合编译。
java内存区域
- 程序计数器
- java虚拟机栈
java栈帧中存放的内容,局部变量表,方法返回地址等 - 本地方法栈
- java堆
- 方法区
- 运行时常量池
- 直接内存
垃圾收集器与内存分配策略
对象存活判定算法
- 引用计数算法一种垃圾回收算法(java虚拟机没有使用这种算法)
- 可达性分析算法
垃圾收集算法
- 标记-清除算法
- 复制算法(现在的商业虚拟机都采用这种收集算法回收新生代)
- 标记-整理算法 (收集老年代)
- 分代收集算法(当前虚拟机的垃圾收集都采用分代收集算法)
垃圾收集器
- Serial 收集器
- ParNew 收集器
- Paraller Scavenge 收集器(新生代收集器,使用复制算法的收集器,并行的多线程收集器,目标则是达到一个可控制的吞吐量。
- Serial Old收集器
- Parallerl Old 收集器
- CMS收集器(是一种以获取最短回收停顿时间为目标的收集器)
- G1收集器
day2 编译jdk源码
-
mac环境下安装homebrew 出现curl: (7) Failed to connect to
raw.githubusercontent.com port 443: Connection refused-解决方法点此链接 -
count find freetype 错误将上面教程中的命令改成
--with-target-bits=64 \ --with-debug-level=slowdebug \ --with-freetype-include=/usr/local/include/freetype2 \ --with-freetype-lib=/usr/local/Cellar/freetype/2.10.1/lib \ --enable-debug-symbols \ ZIP_DEBUGINFO_FILES=0
要注意freetype路径改成自己的
day3 完成前5章,仔细阅读前三章内容
jdk的命令行工具
- jps虚拟机进程状况工具
- jstat 虚拟机统计信息监视工具
- jinfo java配置信息工具
- jmap Java内存映像工具
- jhat 虚拟机堆存储快照分析工具
- jstack Java堆栈跟踪工具
- hsdis JIT生成代码反汇编
day4 看完虚拟机执行子系统(6,7,8,9章)
类文件结构
- Class文件的头4个字节称为魔数,确定这个文件是否为一个能被虚拟机接受的Class文件。
- 常量池(数量不固定)主要两大类常量:字面量和符号引用
- 分析Class文件字节码的工具:javap
- 访问标志 识别类或接口层次的信息
- 类索引,父类索引和接口索引 这三项数据来确定这个类的继承关系
- 字段表集合 用于描述接口或者类中声明的变量
- 方法表集合
- 属性表集合 在Class文件、字段表、方法表中都可以携带自己的属性表集合
字节码指令
- 字节码与数据类型
- 加载与存储指令
- 运算指令
- 类型准换指令
- 对象创建与访问指令
- 操作数栈管理指令
- 控制转移指令
- 方法调用和返回指令
- 异常处理指令
- 同步指令
虚拟机类加载机制
- 加载、验证、准备、初始化和卸载这五个阶段的顺序是确定的,但解析阶段则不一定,它在某些情况下可以在初始化阶段之后再开始