JVM(Java Virtual Machine):Java虚拟机
构成
JVM由五部分组成:方法区、堆、栈,本地方法栈和程序计数器。
方法区:存放类似于元数据信息方面的数据的,比如类信息,常量,静态变量等
堆:存放数据,比如对象实例,数组等。通过new创建的对象,都在堆上进行分配。
栈:代码运行空间,方法会在栈里运行。线程创建时创建,和线程的生命周期一致
程序计数器:类似于指针,指向正在执行的指令。
方法区和堆是现成共享的,其余三部分是线程独享的。
当多线程在堆上请求空间时,为了提高效率,采用TLAB(Thread Local Allocation Buffer)技术,即给每个线程分配一小块内存,用于该线程上的内存分配。当该线程内存分配不足时,当请求的内存低于threshold时,重新给线程分配一块空间,但是当高于threshold时,就直接在公共的堆空间分配,这就需要进行同步控制。
类加载
过程
一个类从被加载到JVM开始,到卸载出内存主要经过:加载,链接,初始化,使用,卸载。
类加载器:实现”通过一个类的全限定名来获取描述该类的二进制字节流“动作的代码,称为类加载器。
三层类加载器
- 启动类加载器:主要加载<JAVA_HOME>\lib目录存放的类
- 扩展类加载器:主要加载<JAVA_HOME>\lib/ext目录存放的类
- 应用程序类加载器: 加载用户路径的类
三层类加载器+双亲委派模型
双亲委派模型的优点:避免重复加载 + 避免核心类篡改