一、方法区的理解
方法区有个别名叫做Non-Heap(非堆),目的上就是要和堆区分开来,所以我们可以把方法区看作一块独立于堆的内存空间。
在HotSpot中可以把永久代看作方法区的实现,JDK1.8后,元空间取代永久代
元空间与永久代的区别?
二、设置方法区的大小与OOM
jdk1.7及以前(永久代)
jdk1.8(元空间)
内存泄漏(垃圾回收器不回收还有引用的对象,但是这个对象已经没有用了)与内存溢出会导致OOM
三、方法区的内部结构
一个类的Class文件被类加载器加载到内存中的方法区
1.首先来看Class文件里有什么东西?
2.总体来说方法区里有这些东西
类型信息
域信息
方法信息
JIT代码缓存:存储的即时编译器编译好的机器指令
静态变量:类的静态变量
暂时的理解:
static int a= 10;a在堆的静态变量 10在运行时常量池
static Person person = new Person(); new的对象在堆里,尚硅谷的说这个person在new的这个对象里
运行时常量池:
class文件中的常量池在类加载后存放到运行时常量池,同时常量池中的符号引用变成了直接地址引用
① 首先来看class文件中的常量池
②
四、永久代为什么会被元空间取代?
- 为永久代设置空间是很难确定的
- 对永久代的调优是十分困难的
五、方法区的垃圾回收?
必要且苛刻但是回收效果不好
常量的回收比较简单但类的回收就比较难
类的实例 类的加载器 类对应的Class对象