java内存分析(5)——理解方法区(元空间、永久代)

方法区

JDK 8版本之前,也叫永久代JDK 8版本之后,改名为了方法区(元空间,方法区的实现是元空间)

功能:

  • 存储一些static修饰的东西
  • 存储一些classloader和一些class对象(包含类的元信息,例如方法表、字段表)(而实例对象在堆中
  • JDK 1.7版本以前,方法区还存储字符串常量池;但是,从JDK1.7开始,字符串常量池转移到堆中

其他区域解释

image-20241210181836591

各区解释

栈(JVM栈):存储一些函数方法当前运行中的临时变量

本地方法栈:存储C++的一些native的方法(因为Java的底层就是C++)

程序计数器:指向程序当前执行的位置

方法区:存储一些一些静态的方法、变量,还有类加载器之类的数据

堆区:存储对象实例数据(而对应的变量,即对象的引用变量,是存储在栈中,或者堆中的对象实例数据中的变量(即对象的引用变量可能在栈中,也可能在堆中的对象实例数据中)),还有字符串常量池也在堆区

JDK 7 开始,字符串常量池被移到了堆内存中,而不再存储在方法区(永久代)中

字符串常量池的位置:

  • JDK 7 之前: 方法区(永久代)。
  • JDK 7 及之后: 堆内存。

移动到堆内存后,字符串常量池更加灵活,避免了永久代空间不足的问题。

共享性

栈(JVM栈)、本地方法栈、程序计数器,这三个是==线程私有==的,有多少个线程,就有多少个这样的区域

堆区、方法区是==全局共享==的(即线程共享,都可以访问)

Contents
  1. 1. 方法区
  2. 2. 其他区域解释
    1. 2.1. 各区解释
    2. 2.2. 共享性
|