JVM-方法区-元信息
有的时候博客内容会有变动,首发博客是最新的,其他博客地址可能会未同步,认准
https://blog.zysicyj.top
全网最细面试题手册,支持艾宾浩斯记忆法。这是一份最全面、最详细、最高质量的 java 面试题,不建议你死记硬背,只要每天复习一遍,有个大概印象就行了。
https://store.amazingmemo.com/chapterDetail/1685324709017001
1. 什么是方法区?
方法区是一块用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据的内存区域。需要注意的是,Java虚拟机规范中使用了运行时常量池这个概念,它并不是方法区的一部分,但是不同的实现可以通过方法区实现运行时常量池。
2. 为什么需要方法区?
在Java中,每一个类都需要被加载到虚拟机中才能被使用。而Java是一门支持反射机制的语言,反射机制需要在运行时根据类的元数据来动态地创建类的实例、访问属性、调用方法等操作。因此,Java需要一块专门的内存区域来存放类的元信息,这个内存区域就是方法区。
3. 类的元信息在方法区中如何存储?
Java源文件编译成Java字节码文件后,其中包含了该类的类名、父类名、属性信息、方法信息等元信息。这些元信息会被加载到虚拟机中的方法区,使用一定的数据结构进行存储。
在方法区中,每一个类都会被分配一个Class对象来存储该类的元信息。Class对象是一个特殊的对象,它保存了Java类的完整信息,包括类名、属性、方法等。在Java中,每个对象都有一个getClass() 方法,可以获取该对象所属的Class对象,从而获取该类的元信息。
4. 类的元信息在方法区中的存储结构
在Java中,类的元信息主要包括以下几个方面:
类名
父类名
接口列表
常量池
字段信息
方法信息
构造方法信息
静态变量
动态变量
在方法区中,这些元信息被保存在一个叫做运行时常量池的结构中,它是每个类或接口的常量池的运行时表示形式。
同时,还需要注意的是,不同的虚拟机实现对于方法区的实现可能会有所不同,在一些低版本的JDK中,方法区被称为永久代,但是在JDK1.8中已经被移除,改为了一个称为元空间的结构来实现。无论如何,这些实现都需要保证存储类的元信息、常量、静态变量等,并且保证在运行时可以动态地修改和更新这些元信息,以支持Java的反射机制、注解、动态代理和代码生成等高级特性。
5. 类的元信息在方法区中的优点
支持Java语言的反射机制,反射机制需要在运行时动态地创建类的实例、调用方法等。
支持Java语言的注解,注解需要在运行时动态地获取类的信息。
支持Java语言的动态代理和代码生成等特性,需要在运行时创建类的实例和修改类的信息。
在运行时可以动态地更新类的元信息,这使得Java语言具有更高的灵活性和可扩展性。
6. 类的元信息在方法区中的缺点
分配给方法区的内存是有限的,过多的类的加载会导致方法区内存不足。
方法区的垃圾回收比较频繁,因为类的加载和卸载都需要进行垃圾回收。
如果存在大量的动态代理和代码生成,会导致方法区内存占用过大。
最后更新于