在书上看到堆中
有一个叫永久代的地方,里面是存放类,静态变量,方法的地方。
然而又在书中看到一个地方叫方法区,也是存放类,静态变量,方法的地方。
2者是否 相同?还是说我理解错里。
方法区被分为两个主要的子区域:
1 持久代也就是你说的永久代,翻译不同
这个区域会存储包括类定义、结构、字段、方法(数据及代码)以及常量在内的类相关数据。它可以通过-XX:PermSize及-XX:MaxPermSize来进行调节。如果它的空间用完了,会导致java.lang.OutOfMemoryError: PermGenspace的异常。而JDK8开始,持久代已经被彻底删除了,取代它的是另一个内存区域也被称为元空间。
2 存放数据
方法区存储的是每个class的信息:
1.类加载器引用(classLoader)
2.运行时常量池
所有常量、字段引用、方法引用、属性
3.字段数据
每个方法的名字、类型(如类的全路径名、类型或接口) 、修饰符(如public、abstract、final)、属性
4.方法数据
每个方法的名字、返回类型、参数类型(按顺序)、修饰符、属性
5.方法代码
每个方法的字节码、操作数栈大小、局部变量大小、局部变量表、异常表和每个异常处理的开始位置、结 束位置、代码处理在程序计数器中的偏移地址、被捕获的异常类的常量池索引
建议读一下<深入理解java虚拟机>这本书.这里面是这样阐述方法区的:用于存储已经被JVM加载的类信息,常量,静态变量等.虽然JVM规范把方法区描述为堆的一个逻辑部分,但是他却有另外的一个别名叫做Non-Heap(非堆),目的是个JVM的方法区分开来.很多人吧方法区称为永久代,但是两者其实并不等价.永久代只是来实现方法区而已,这样HotSpot可以像管理java的堆内存一样管理这部分的内存,能够省去专门为方法区编写内存代码管理的工作.我觉得读完这段话,应该能明白方法区和永久代的关系.我认为方法区使用的是JVM的堆内存,但是JVM团队想区分开来,所以有重新起名叫做方法区,那么方法区和永久代到底是很么关系,上面的一段话其实已经说明了,方法区和永久代本质上不是等号的,永久代只是为了实现方法区,使得JVM可以通过像管理堆内存一样去实现管理方法区的GC机制.
方法区是规范,永久代是实现。相当于servlet是一种规范,有很多种实现。针对不同的虚拟机,对方法区的实现是不一样的。
方法区是虚拟机规范规定的,类似于接口,持久代和元数据区是实现,