Java虚拟机进阶之二:运行时数据区内存划分

目标

1, 了解内存是划分为哪五部分的?

2, 每一部分具体是做什么的。


Note: 本部分的内容信息容量较大,细节较多。文章将从浅到深来介绍。



第一部分:各数据区线程共享/线程独立情况

Java虚拟机进阶之二:运行时数据区内存划分_ method area


线程共享

             方法区(Method Area),堆(heap)


线程独立

             虚拟机栈(Java VM Stack)本地方法栈(Native Stack)程序计数器(Program Counter Register)



第二部分:各数据区功能

方法区:存储已被虚拟机加载的类的信息,常量,静态变量,及时编译后的代码

:存放对象实例

虚拟机栈:方法执行的内存模型,创建栈帧,存储变量及方法出口

本地方法栈:执行Native方法的内存模型

程序计数器:虚拟机多线程切换,记录当前程序所执行的字节码的行号



第三部分:更多的细节


请仔细研读第三部分,这部分涉及到深入的内容,可以参考Java Vm Specification


可以点击图片放大。

Java虚拟机进阶之二:运行时数据区内存划分_vm stack_02


For More Details:

1, String intern()

Java虚拟机进阶之二:运行时数据区内存划分_vm stack_03


2,常量池(Constant Pool Table) vs 运行时常量池(Runtime Constant Pool)

根据官方文档:

运行时常量池(Runtime Constant Pool)是每一个类或接口的常量池(Constant_Pool

§4.4)的运行时表示形式,它包括了若干种不同的常量:从编译期可知的数值字面量到必须运行

期解析后才能获得的方法或字段引用。运行时常量池扮演了类似传统语言中符号表(Symbol

Table)的角色,不过它存储数据范围比通常意义上的符号表要更为广泛。