尽管所有的方法区在逻辑上是堆的一部分,但是没有垃圾回收和压缩,所以, 方法区看作是一块儿独立于 Java 堆的内存空间
方法区和堆一样,是各个线程共享的内存区域
方法区在 JVM 启动的时候被创建,并且实际物理内存和 Java 堆区一样,可以是不连续的。
方法区的大小,跟堆空间一样,可以选择固定大小或者可拓展的
方法区的大小决定了系统可以保存多少个类,如果系统定义了太多类,导致方法区溢出,虚拟机同样会抛出 OOM 错误
关闭 JVM 就会释放这个区域的内存
在 JDK7 以前,方法区成为永久代。
在 JDK8 开始,使用元空间取代永久代
最大的区别在于,元空间不在虚拟机设置的内存中,而是使用本地内存
方法区都存储什么:类型信息,常量,静态变量,即时编译器编译后的代码缓存等
运行时常量池 VS 常量池为什么需要常量池?
一个 java 源文件中的类,接口,编译后产生一个字节码文件,而 java 中的字节码需要数据支持,通常这种数据会很大以至于不能直接存在字节码里,但是可以存到常量池,在动态链接的时候会用到运行时常量池。
运行时常量池是方法区中的一部分
常量池表是 class 文件的一部分,用于存放编译期生成的字面量和引用
jdk 8 之后,无永久代,然后所有的类型信息,字段,方法,常量保存在本地内存的元空间,但是字符串常量池、静态变量仍在堆
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)