淮北做网站电话,安卓app用什么开发,网站建设吸引人的话语,常德网站制作目录 1- 引言#xff1a;方法区概述1-1 方法区是什么#xff1f;(What)1-2 为什么用方法区#xff1f;方法区的作用 (Why) 2- ⭐核心#xff1a;详解方法区(How)2-1 能不能解释一下方法区#xff1f;2-2 元空间内存溢出问题2-3 什么是常量池#xff1f;2-4 运行时常量池 … 目录 1- 引言方法区概述1-1 方法区是什么(What)1-2 为什么用方法区方法区的作用 (Why) 2- ⭐核心详解方法区(How)2-1 能不能解释一下方法区2-2 元空间内存溢出问题2-3 什么是常量池2-4 运行时常量池 3- 小结3-1 什么是方法区方法区的作用3-2 介绍一下运行时常量池 1- 引言方法区概述
1-1 方法区是什么(What)
方法区是 Java 虚拟机中的一个运行时数据区它是各个线程共享的内存区域主要用于存储类的信息和运行时常量池。方法区在 Java 虚拟机启动时创建在虚拟机关闭时释放。具体存储内容包括类的结构、方法、字段以及运行时常量池的信息。 在 JDK 8之前方法区存储在堆中的永久代区域在 JDK 8之后永久代被移除改为元空间使用的是操作系统的本地内存 1-2 为什么用方法区方法区的作用 (Why)
① 存储类信息方法区存储所有被加载类的结构信息包括类名、访问修饰符、字段描述、方法描述等。这些信息在类加载时会被读取并存储到方法区以便于虚拟机执行相应的操作。② 存储运行时常量池运行时常量池是方法区的重要组成部分包含了编译期间生成的各种字面量和符号引用。当类被加载时常量池的信息会被加载到运行时常量池并将符号地址转换为真实的内存地址以便在程序运行时进行快速查找和执行。③ 支持类加载和卸载方法区在类加载时创建在类卸载时释放存储空间。它的存在使得Java虚拟机可以动态加载和卸载类从而支持Java的动态性和扩展性。 2- ⭐核心详解方法区(How)
2-1 能不能解释一下方法区
方法区(Method Area) 是各个线程 共享的内存区域主要存储类的信息、运行时常量池虚拟机启动的时候创建关闭虚拟机时释放如果方法区域中的内存无法满足分配请求则会抛出OutOfMemoryError:Metaspace 2-2 元空间内存溢出问题
以下代码演示了通过动态生成和加载类来导致Java虚拟机的元空间Metaspace内存溢出java.lang.OutOfMemoryError: Metaspace的情况。
在没有设置元空间大小上限的情况下
以下代码的执行是没有错误的
**如果设置了 **-XX:MaxMetaspaceSize8m
此时会抛出 java.lang.OutOfMemoryError: Metaspace异常
/*** 演示元空间内存溢出 java.lang.OutOfMemoryError: Metaspace* -XX:MaxMetaspaceSize8m*/
public class MetaspaceDemo extends ClassLoader { // 可以用来加载类的二进制字节码public static void main(String[] args) {MetaspaceDemo test new MetaspaceDemo();for (int i 0; i 10000; i) {// ClassWriter 作用是生成类的二进制字节码ClassWriter cw new ClassWriter(0);// 版本号public类名包名父类接口cw.visit(Opcodes.V1_8, Opcodes.ACC_PUBLIC, Class i, null, java/lang/Object, null);byte[] code cw.toByteArray();// 执行类的加载test.defineClass(Class i, code, 0, code.length); // Class 对象}}
}2-3 什么是常量池
常量池可以看做是一张表虚拟机指令根据这张常量表找到要执行的类名、方法名、参数类型、字面量等信息。 字符串常量池String Constant Pool是Java虚拟机中的一个特殊内存区域用于存储字符串字面量。 一个Java方法的机器指令想要执行则需要他要去查表翻译到常量池中去找到对应的地址进行翻译然后最终才能去执行当前的指令。
2-4 运行时常量池
常量池是 .class 文件中的当该类被加载它的常量池信息就会 放入运行时常量池并把里面的符号地址变为真实地址* 3- 小结
3-1 什么是方法区方法区的作用 3-2 介绍一下运行时常量池