JVM:方法区

JVM:方法区,第1张

JVM:方法

尽管所有的方法区在逻辑上是堆的一部分,但是没有垃圾回收和压缩,所以, 方法区看作是一块儿独立于 Java 堆的内存空间

方法区和堆一样,是各个线程共享的内存区域

方法区在 JVM 启动的时候被创建,并且实际物理内存和 Java 堆区一样,可以是不连续的。

方法区的大小,跟堆空间一样,可以选择固定大小或者可拓展的

方法区的大小决定了系统可以保存多少个类,如果系统定义了太多类,导致方法区溢出,虚拟机同样会抛出 OOM 错误

关闭 JVM 就会释放这个区域的内存

在 JDK7 以前,方法区成为永久代。
在 JDK8 开始,使用元空间取代永久代
最大的区别在于,元空间不在虚拟机设置的内存中,而是使用本地内存

方法区的内部结构:

方法区都存储什么:类型信息,常量,静态变量,即时编译器编译后的代码缓存等

运行时常量池 VS 常量池

为什么需要常量池?
一个 java 源文件中的类,接口,编译后产生一个字节码文件,而 java 中的字节码需要数据支持,通常这种数据会很大以至于不能直接存在字节码里,但是可以存到常量池,在动态链接的时候会用到运行时常量池。

运行时常量池是方法区中的一部分
常量池表是 class 文件的一部分,用于存放编译期生成的字面量和引用

方法区的演进细节

jdk 8 之后,无永久代,然后所有的类型信息,字段,方法,常量保存在本地内存的元空间,但是字符串常量池、静态变量仍在堆

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/4969586.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-11-13
下一篇 2022-11-13

发表评论

登录后才能评论

评论列表(0条)

保存