一、1.8之前
运行时数据区(进程共享)
- 运行时常量池
- 为什么要有方法区:
- jvm完成类装载后,需要将class文件中的常量池转入内存,保存在方法区中
- 为什么是常量:
- 常量对象操作较多,为了避免频繁创建和销毁
进程私有区域
- 虚拟机栈:主要用于方法的调用,每次函数调用都对应一个栈帧,方法结束(异常也可)弹出栈帧,由于方法中局部变量本身是实例变量的引用,因此栈中实际上保存的是对gc堆中对象的引用。
- 本地方法栈:服务非java原生方法
- 程序计数器
二、关于运行时常量池和串池
- 1.7之前:运行时常量池逻辑包含串池,位于方法区
- 1.7:串池被放入了堆之中
- 1.8:串池还在堆,方法区被取消,运行时常量池此时在原空间中
三、1.8及之后
将方法区拉出来,作为元空间,元空间使用直接内存