-
加载
-
验证
-
准备
-
解析
-
初始化
2、对象的创建过程
-
检查类是否被加载
-
为对象分配内存
-
为分配的内存空间初始化零值
-
为对象进行其他设置
-
执行 init 方法
3、对象的内存布局
-
对象头(markword)
-
实例数据(Instance Data)
-
对其填充(Padding)
-
预估对象大小
4、对象访问
-
句柄访问
-
直接指针
5、JVM 内存区域
-
虚拟机栈
-
本地方法栈
-
程序计数器
-
本地内存
-
堆
6、对象存活判断
-
引用计数
-
可达性分析
-
finalize
-
对象引用类型
7、垃圾回收算法
-
标记-清除
-
标记-整理
-
复制算法
-
分代算法
8、安全点
-
安全点
-
安全区域
9、JVM 垃圾回收器
-
Serial (新生代)
-
ParNew(新生代)
-
Parallel Scavenge(新生代)
-
Serial Old(老年代)
-
Parallel Old(老年代)
-
CMS(Concurrent Mark Sweep)(老年代)
-
G1
-
ZGC
=======================================================================================
==================================================================================
给大家介绍一本学习书籍**《Java虚拟机:JVM高级特性与最佳实践》454页的PDF,分为5个部分:走近java、启动内存管理机制、虚拟机执行子系统、程序编译与代码优化、高效并发。**
说到这个笔记,前些日子我自己还整理了一份JVM的笔记,也拿出来分享一下吧。这份JVM笔记我主要是分成了十个模块:(1)JVM 内存结构、(2)HotSpot 虚拟机对象探秘、(3)垃圾收集策略与算法、(4)HotSpot 垃圾收集器、(5)内存分配与回收策略、(6)JVM 性能调优、(7)类文件结构、(8)类加载的时机、(9)类加载的过程、(10)类加载器
================================================================================
下面这些是我总结的一些面试常问的题目并附带解析:
-
内存模型以及分区,需要详细到每个区放什么?
-
堆里面的分区:Eden,survival (from+ to),老年代,各自的特点?
-
对象创建方法,对象的内存分配,对象的访问定位?
-
GC 的两种判定方法?
-
SafePoint 是什么?
-
GC 收集器有哪些?CMS 收集器与 G1 收集器的特点?
-
Minor GC 与 Full GC 分别在什么时候发生?
-
几种常用的内存调试工具:jmap、jstack、jconsole、jhat?
-
类加载的几个过程?
-
JVM 内存分哪几个区,每个区的作用是什么?
-
如和判断一个对象是否存活?(或者 GC 对象的判定方法)?