《深入理解java虚拟机》第三版笔记

《深入理解java虚拟机》第三版笔记

💡 原文中文,约6800字,阅读约需17分钟。
📝

内容提要

本文介绍了Java中的基础知识,包括同名字段处理、重载和重写的区别、动态类型支持、内存泄漏、OSGi动态模块规范、静态和非静态代码块、泛型本质、分层编译和Graal编译器。其中,OSGi实现热插拔的原因是类加载器实现,Graal编译器目标是替换c2编译器。

🎯

关键要点

  • ClassicVM使用基于句柄的对象查找方式,优缺点分别为不需修改对象引用位置和需要两次定位对象。
  • GraalVM是跨语言全栈虚拟机,支持多种语言并能无额外开销混用。
  • 自JDK10起,HotSpot引入Graal编译器,旨在替换C2编译器。
  • NIO引入基于Channel与Buffer的IO方式,避免数据复制。
  • 对象内存分配使用指针碰撞或空闲列表,JVM通过CAS和TLAB解决并发问题。
  • new对象过程包括类加载、内存分配、对象头信息设置和构造器方法执行。
  • 对象内容包括对象头、实例数据和对齐填充。
  • 栈内存固定时会报栈溢出,动态扩展时会报内存溢出。
  • 分区垃圾回收器使用记忆集记录对象引用关系,避免整堆扫描。
  • 卡表维护通过写屏障实现,记录分区间对象依赖关系。
  • GCroot扫描优化通过OopMap存储对象引用,减少扫描时间。
  • ParNew是Serial的多线程版本,Parallel Scavenge关注吞吐量。
  • G1垃圾收集器为每个region设计TAMS指针,标记存活对象。
  • 三色标记法通过增量更新和原始快照算法解决动态引用变化问题。
  • Shenandoah垃圾收集器控制STW时间在十毫秒内,支持并发标记和整理。
  • ZGC与Shenandoah目标相似,动态变化region并优化并发整理。
  • ZGC通过染色指针存储对象状态信息,减少访问开销。
  • HashMap<Long, Long>添加kv占用88字节内存。
  • Class文件以8字节为单位排列,数据结构为无符号数和表。
  • 方法特征签名不包含返回值,重载条件不能仅依靠返回值。
  • java中的基本类型会转换为int进行操作。
  • 不同指令用于调用实例方法和特殊方法。
  • 类加载过程包括加载、验证、准备、解析和初始化,可能出现并行。
  • 数组引用不会触发类加载,final static属性直接放入常量池。
  • 接口的类加载过程与类相似,但不能使用静态代码块。
  • 局部变量表复用可能导致内存泄漏,需手动置为null。
  • OSGi是Java动态模块规范,支持热插拔,模块称为Bundle。
  • 类中可有静态和非静态代码块,静态块写入<clinit>()方法。
  • Java泛型是语法糖,编译后替换为原类型。
  • 分层编译根据JVM参数选择解释器和JIT编译器。
  • Graal编译器目标是替换C2编译器,使用JVM CI接口独立编译。
➡️

继续阅读