1. 其他
1.1. 方法重载类型优先级
1.2. 基于计数器的热点探测方法
1.2.1. 方法计数器
1.2.2. 回边计数器
1.2.2.1. 用于统计代码循环的执行次数
2. 内存区域
2.1. 虚拟机栈
2.1.1. 线程独享
2.1.2. 用于存储局部变量、操作栈、动态链接、方法出口
2.1.3. 超过虚拟机允许深度StackOverflowError
2.1.4. 无法扩容OOM
2.2. 本地方法栈
2.2.1. 线程独享
2.2.2. 为Native方法执行服务
2.3. 程序计数器
2.3.1. 线程独享
2.3.2. 当前执行字节码文件的行号指示器
2.3.3. 不会产生OOM
2.3.4. 执行Native方法时为空
2.4. 方法区
2.4.1. 线程共享
2.4.2. 用于类信息、静态变量、常量、即时编译后的代码
2.4.3. 不太会发生GC
2.4.4. 常量池
2.4.4.1. Class文件中的符号引用
2.4.4.2. String.intern()获取常量池中的引用
2.5. 堆
2.5.1. 线程共享
2.5.2. 存放实例对象
2.5.3. 物理上不连续
2.6. 直接内存
2.6.1. 不受虚拟机内存大小影响
2.6.2. 不会自动进行GC
2.7. 内存访问机制
2.7.1. 采用指针的方式访问,增加访问效率
2.7.2. 未采用句柄模式
3. 类加载
3.1. 生命周期:加载-验证-准备-解析-初始化-使用-卸载
3.2. 类加载器
3.2.1. 双亲委派模型
3.2.2. 相同类加载器加载的相同全类名类才相同
3.2.3. 启动类加载器
3.2.3.1. 用于加载<JAVA_HOME>\lib目录
3.2.4. 扩展类加载器
3.2.4.1. 用于加载<JAVA_HOME>\lib\ext目录
3.2.5. 应用程序类加载器
3.2.5.1. 用于加载用户路径内的文件
3.2.6. 相互关系
3.2.6.1. 启动类加载器
3.2.6.1.1. 扩展类加载器
3.3. OSGI
3.3.1. 破坏双亲委派模型
3.3.2. Bundle连同类加载器一起替换
4. 锁
4.1. 互斥同步
4.1.1. synchronized
4.1.1.1. 可重入
4.1.1.2. 非公平锁
4.1.1.3. native实现
4.1.2. reentrantLock
4.1.2.1. 可重入
4.1.2.2. 公平锁
4.1.2.3. 支持多条件
4.1.2.4. Java实现
4.2. 非阻塞同步
4.2.1. 自旋
4.2.1.1. 固定尝试次数
4.2.2. 自适应自旋
4.2.2.1. 自动计算尝试次数
4.3. 锁升级
4.3.1. 偏向锁
4.3.1.1. 标记线程
4.3.1.2. 轻量
4.3.2. 轻量级锁
4.3.2.1. 自旋
4.3.2.2. 中量
4.3.3. 重量级锁
4.3.3.1. 重量
5. 垃圾回收
5.1. GC Roots可达性检查
5.1.1. 虚拟机栈中的引用对象
5.1.2. 方法区中的类静态属性引用对象
5.1.3. 方法区中的常量引用对象
5.1.4. 本地方法栈中JNI的引用对象
5.2. 引用
5.2.1. 强引用
5.2.1.1. 不会被回收
5.2.2. 软引用
5.2.2.1. 内存不足时回收
5.2.3. 弱引用
5.2.3.1. 下次GC时被回收
5.2.4. 虚引用
5.2.4.1. 无法通过虚引用获取对象
5.2.4.2. 不影响GC
5.3. 标记
5.3.1. 对象至少经历2次标记
5.4. finalize
5.4.1. 回收时调用,不建议使用
5.5. 回收算法
5.5.1. 标记清除
5.5.2. 复制算法
5.5.2.1. 用于新生代算法
5.5.2.2. eden:from:to为8:1:1
5.5.3. 标记-整理
5.5.3.1. 用于老年代
5.6. 垃圾收集器
5.6.1. Serial
5.6.1.1. 新生代
5.6.1.2. 单线程
5.6.2. ParNew
5.6.2.1. 新生代
5.6.2.2. 多线程
5.6.3. Parallel Scavenge
5.6.3.1. 新生代
5.6.3.2. 多线程
5.6.3.3. 复制算法
5.6.4. G1
5.6.4.1. 新生代和老年代
5.6.4.2. 标记整理
5.6.4.3. 整个堆变为多个大小相同的Region
5.6.5. CMS
5.6.5.1. 老年代
5.6.5.2. 标记清除
5.6.5.3. 多线程
5.6.5.4. 低停顿
5.6.5.4.1. 只在标记时STW
5.6.5.5. 无法处理浮动垃圾
5.6.5.6. 会产生内存碎片
5.6.6. Serial Old
5.6.6.1. 老年代
5.6.6.2. 标记整理
5.6.6.3. 单线程
5.6.7. Parallel Old
5.6.7.1. 老年代
5.6.7.2. 标记整理
5.6.7.3. 多线程
5.7. 内存分配
5.7.1. 新对象优先进入新生代
5.7.2. 大对象直接进入老年代
5.7.2.1. 防止新生代发生大内存拷贝
5.7.3. 长期存活对象进入老年代
5.7.3.1. 默认为15岁
5.7.3.2. 每经过一次GC,对象增加1岁
5.7.4. 新生代存活对象超过survivor一半大小时,晋升年龄最大的一批对象进老年代
6. 内存模型
6.1. 主内存
6.1.1. 线程共享
6.2. 工作内存
6.2.1. 线程独占
6.3. 内存交互操作
6.3.1. lock 锁定
6.3.2. unlock 解锁
6.3.3. read 读取
6.3.4. load 载入
6.3.5. use 使用
6.3.6. assign 赋值
6.3.7. store 存储
6.3.8. write 写入
6.4. volatile
6.4.1. 所有操作前读取主内存对象,保证执行器层面数据一致
6.4.2. 禁止语义重排
7. 虚拟机工具
7.1. jps
7.1.1. 列出正在运行的虚拟机进程
7.1.2. 列出进程所执行的main方法
7.2. jstat
7.2.1. 类装载
7.2.2. 垃圾收集
7.2.3. 内存
7.2.4. JIT编译
7.3. jinfo
7.3.1. 虚拟机配置查看修改
7.4. jmap
7.4.1. 用于生产堆转储快照
7.4.2. 堆和永久代信息
7.5. jhat
7.5.1. 用于分析转储快照
7.6. jstack
7.6.1. 堆栈跟踪工具