在Java 6及之前的版本中,Java虚拟机使用永久代(Permanent Generation)来存储类的元数据、静态变量、常量池等信息。永久代是堆内存的一部分,它的主要作用是用于存放与程序运行期间不会被GC回收的数据。
主要存放的数据包括:
- 类的元数据(Class Metadata): 存放每个类的信息,如类的名称、方法信息、字段信息等。在运行时,JVM需要通过这些元数据来正确执行类的方法。
- 静态变量(Static Variables): 存放类的静态变量,这些变量在类加载时被初始化,而且在整个运行期间都不会被修改。
- 常量池(Constant Pool): 存放字符串常量和符号引用,包括类和接口的全限定名、字段的名称和描述符、方法的名称和描述符等。
虽然永久代在某些情况下确实有一些优点,但也存在一些问题,例如容易发生永久代内存溢出(OutOfMemoryError: PermGen space),特别是在大型应用程序、长时间运行的应用程序或使用动态生成类的应用程序中。
因此,从Java 7开始,为了解决永久代的一些问题,Java虚拟机引入了元空间(Metaspace)。元空间不再属于堆内存,而是直接使用本地内存。元空间的大小不再受到永久代的限制,它会根据需要动态调整,这有效地解决了永久代的一些问题。在使用元空间后,永久代的概念被移除。
Was this helpful?
0 / 0