以下内容纯属个人扯淡,仅供参考,建议拜读原著
目录
读后感
第一部分:走近Java
第1章:Java概述
概览
1、实战:自己编译JDK
第二部分:自动内存管理
第2章:Java内存区域与内存溢出异常
对于Java程序员来说,在虚拟机自动内存管理机制的帮助下,不容易出现内存泄漏与内存溢出问题。但正因如此,一旦出现泄漏/泄漏问题,若不了解虚拟机是怎么样使用内存的,那排查错误将非常困难。
1、运行时数据区域
参考:Java内存区域(运行时数据区域)和内存模型(JMM)
JDK8之后
JDK8之前
1》程序计数器
2》Java虚拟机栈与本地方法栈
3》Java堆
1)对象堆
2)方法区
3)运行时常量池
方法区的一部分。Class文件中除了有类的版本、字段、方法、接口等描述信息外,还有一项常量池表(存放编译时期生成的各种字面量与符号引用)
4》直接内存
不是虚拟机运行时数据区、Java虚拟机规范中定义的。但JDK1.4中加入了NIO(基于通道与缓冲区的IO方式。它可以使用Native函数库直接分配堆外内存,然后通过一个存储在Java堆中的DirectByteBuffer对象作为这块内存的引用进行操作。可以避免在Java堆和Native堆中来回复制数据,提高性能)
它的分配将受到本机总内存(物理内存、SWAP分区、分页文件等)、处理器寻址空间的限制。当-Xmx等设置各个区域总和大于物理或OS限制时,从而导致动态扩展时出现OOM。
第3章:垃圾收集器与内存分配策略
第4章:虚拟机性能监控与故障处理工具
第5章:调优案例分析与实战
第三部分:虚拟机执行子系统
第6章:类文件结构
1、Class类文件结构
一组以8位字节(1Byte=8bit)为基础单位的二进制流,各个数据项目严格按顺序紧密排列。它采用类似C语言结构体的伪结构来存储(一个结构体类型可以只由基本类型构成,结构体中还可以有结构体),只有2种数据类型:无符号数、表
无符号数:基本数据类型。u1、u2、u4、u8,数字代表字节数。可以用来描述数字、索引引用、数值、UTF-8字符串值
u1:max = 255
u2:max = 65535
...
表:多个无符号数或其他表作为数据项的复合数据类型。约定以:_info结尾
注意:描述同一类型但数量不定的多个数据时,一般使用一个前置的容量计数器加若干个连续数据项的形式,也称为某一类型的集合
注意:Class结构并非像xml等描述型语言,它没有分隔号,因此上图中的数据项无论是顺序、数量都是被严格限定的,哪个字节代表什么含义,长度多少,先后顺序等都不允许改变(上图中,除去数量=1的,剩下的数据项可能可能会连续有多个)
1。魔数
u4 magic 1
固定为:0xCAFEBABE。由于确定该文件是否为一个能被虚拟机接受的Class文件(因为文件扩展名是可以随意被改动的,因此使用扩展名来区分文件类是不安全的)
2。版本号
u2 minor_version 1
u2 major_version 1
依次是次和主版本号。高版本jdk能兼容低版本class文件,但不能运行更高版本的。jdk8=52
3。常量池
u2 constant_pool_count 1
cp_info constant_pool constant_pool_count
它与其他项关联最多,也是占用Class文件空间最大的数据项之一
注意:constant_pool_count值从1开始,0表示不引用任何一个常量池项目
第7章:虚拟机类加载机制
第8章:虚拟机字节码执行引擎
第9章:类加载及执行子系统的案例与实战
第四部分:程序编译与代码优化
第10章:早期(编译期)优化
第11章:晚期(运行期)优化
第五部分:高效并发
第10章:Java内存模型与线程
第11章:线程安全与锁优化