一、内存结构分哪几块?功能是什么?
- 程序指数器、虚拟机栈、本地方法栈、方法区、堆
| 分区 | 功能 |
|---|---|
| 程序指数器 | 多线程情况下需要上下文切换,用来指示每个线程当前执行到的字节码地址 |
| 虚拟机栈 | 每调用一个方法会形成一个栈帧存储在虚拟机栈中,里面存储着局部变量表、操作数栈、动态连接和返回地址 |
| 本地方法栈 | 与虚拟机栈功能相同,不过是服务于native方法 |
| 方法区 | 用于存储常量池、类信息(类的版本、字段、方法、接口和父类等) |
| 堆 | 用于存储对象,结构分为老年代和新生代,新生代又分为eden和survivor区,survivor区又分为from和to |
二、对象进入堆空间的流程是怎么样?
- 判断对象的大小,大对象直接进入老年代,老年代空间不足则产生fullGC
- 小对象进入新生代eden区,空间不足的产生minorGC,采用引用计数法或可达性分析看是否回收
- 存活下来的对象会放入survivor区,GC算法采用复制算法,from和to中存活的对象复制到对方区中,再将该区清除干净
- fullGC采用标记整理算法,将存活下来的对象移到一边,把另一边的全部清除
三、新生代被老年代引用了怎么办?
HotSpot虚拟机下有card table(卡表)来避免全局扫描老年代对象,跨代引用则标为脏页