JVM深入理解
类加载器过程
- 加载:将class文件加载到内存
- 校验:对class文件进行校验
- 准备:为静态变量分配内存空间,设置默认值
- 解析:静态链接,将符号引用链接为直接引用
- 初始化:为静态变量设置指定的值,加载静态代码块
类加载器
- 启动类加载器:加载JRE目录下lib目录下的jar包
- 应用类加载器:加载JRE目录lib目录下的etx目录下的jar包
- 扩展类加载器:加载ClassPath目录下的jar包
- 自定义类加载器:继承ClassLoad类,加载自己指定目录下jar包
双亲委派机制的目的
- 沙箱机制:对权限进行限制,避免对核心类库的修改
- 保证类只被加载一次
如何打破双亲委派机制
自定义类加载器,重写loadClass()方法,修改加载规则
运行时数据区
- 栈:线程独占。总栈空间固定,每个线程分配一个小栈,栈中存储栈帧,每一方法对应一个栈帧,方法运行结束,弹出栈帧。
栈帧中包括内容- 局部变量表: 用于存储局部变量
- 操作数栈:用于存储操作数,配合局部变量表进行运算
- 动态链接:动态的将符号应用链接为 直接引用
- 方法出口:方法运行结束,返回
- 程序计数器:线程独占,记录每个线程执行的位置
- 本地方法栈:线程独占,用于存储运行本地方法需要的信息
- 方法区:线程共享,逻辑概念,1.8前为永久代,1.8及之后为元空间,元空间不占用JVM内存,存储类相关信息。
- 堆:线程共享,分为年轻代和老年代
年轻代(1/3):eden区(8)+servivor区(From(1)+To(1))
老年代(2/3):
MinorGC:eden区满了进行的MinorGC,回收eden区对象,将存活对象放入Servivor区,第一次MinorGC将存活对象放入From或To其中之一。之后将eden区和有对象的Servivor区放入空的Servivor区,如次反复。
FullGC:老年代满了进行FullGC