方法区
在JDK 8
版本之前,也叫永久代;JDK 8
版本之后,改名为了方法区(元空间,方法区的实现是元空间)
功能:
- 存储一些
static
修饰的东西 - 存储一些
classloader
和一些class
对象(包含类的元信息,例如方法表、字段表)(而实例对象在堆中) - 在
JDK 1.7
版本以前,方法区还存储字符串常量池;但是,从JDK1.7
开始,字符串常量池转移到堆中
其他区域解释
各区解释
栈(JVM栈):存储一些函数方法当前运行中的临时变量
本地方法栈:存储C++的一些native的方法(因为Java的底层就是C++)
程序计数器:指向程序当前执行的位置
方法区:存储一些一些静态的方法、变量,还有类加载器之类的数据
堆区:存储对象实例数据(而对应的变量,即对象的引用变量,是存储在栈中,或者堆中的对象实例数据中的变量(即对象的引用变量可能在栈中,也可能在堆中的对象实例数据中)),还有字符串常量池也在堆区
从
JDK 7
开始,字符串常量池被移到了堆内存中,而不再存储在方法区(永久代)中字符串常量池的位置:
JDK 7
之前: 方法区(永久代)。JDK 7
及之后: 堆内存。移动到堆内存后,字符串常量池更加灵活,避免了永久代空间不足的问题。
共享性
栈(JVM栈)、本地方法栈、程序计数器,这三个是==线程私有==的,有多少个线程,就有多少个这样的区域
堆区、方法区是==全局共享==的(即线程共享,都可以访问)