JVM内存结构

66 阅读1分钟

一、内存结构分哪几块?功能是什么?

  1. 程序指数器、虚拟机栈、本地方法栈、方法区、堆
分区功能
程序指数器多线程情况下需要上下文切换,用来指示每个线程当前执行到的字节码地址
虚拟机栈每调用一个方法会形成一个栈帧存储在虚拟机栈中,里面存储着局部变量表、操作数栈、动态连接和返回地址
本地方法栈与虚拟机栈功能相同,不过是服务于native方法
方法区用于存储常量池、类信息(类的版本、字段、方法、接口和父类等)
用于存储对象,结构分为老年代和新生代,新生代又分为eden和survivor区,survivor区又分为from和to

二、对象进入堆空间的流程是怎么样?

  1. 判断对象的大小,大对象直接进入老年代,老年代空间不足则产生fullGC
  2. 小对象进入新生代eden区,空间不足的产生minorGC,采用引用计数法或可达性分析看是否回收
  3. 存活下来的对象会放入survivor区,GC算法采用复制算法,from和to中存活的对象复制到对方区中,再将该区清除干净
  4. fullGC采用标记整理算法,将存活下来的对象移到一边,把另一边的全部清除

三、新生代被老年代引用了怎么办?

HotSpot虚拟机下有card table(卡表)来避免全局扫描老年代对象,跨代引用则标为脏页