JVM体系结构
类加载器:
package com.hzx;
public class Student {
// 双亲委派机制:安全
// 先去 App -> EXT -> BOOT(最终)
// 如果不在 APP -> EXT -> BOOT中
// 会使用本地创建的
public String toString() {
return “hello”;
}
public static void main(String[] args) {
Student student = new Student();
System.out.println(student.toString());
System.out.println(student.getClass().getClassLoader()); //AppClassLoader
System.out.println(student.getClass().getClassLoader().getParent()); //PlatformClassLoader
System.out.println(student.getClass().getClassLoader().getParent().getParent()); //null 1.不存在 2.java中获取不到,在C或者C++中
/*
* 1.类加载器收到类加载的请求
* 2.将这个请求向上委托给父类加载器去完成,一直向上,直到启动类加载器
* 3.启动类加载器检查是否能够加载当前这个类,找到就结束。 如果找不到,向下委托,一步一步找到(本地委托)
* 4.重复步骤3
* */
}
}
堆:Heap
GC:
复制算法:
优点:没有内存碎片
缺点:浪费了内存空间,多了一半空间永远是to,假设对象100%存活(极端情况下)
复制算法引用场景:对象的存活度较低: 新生区
标记压缩清除算法:
优点:
缺点:
JMM:
关于主内存与工作内存之间的具体交互协议,即一个变量如何从主内存拷贝到工作内存,如何从工作内存同步回主内存子类的细节实现,java内存模型定义了八种操作:(这八个操作都具有原子性)
lock(锁定):作用于主内存的变量,把一个变量标识为一条线程独占的状态。
unclock(解锁):作用于主内存的变量,把一个处于锁定的状态释放出来。
read(读取):作用于主内存的变量,把一个变量的值从主内存传输到线程的工作内存中
load(载入):作用于工作内存的变量,把read操作从主内存 得到的变量值放入工作内存的变量副本中。
use(使用):作用于工作内存的变量,把工作内存中一个变量的值传递给执行引擎,每当虚拟机遇到一个需要使用到变量的 值的字节码指令时将会执行这个操作。
assign(赋值):作用于工作内存的变量,把一个从执行引擎接收到的值 赋值给工作内存的变量,每当虚拟机遇到一个给变 量赋值的字节码指令时执行这个操作。
store(存储):作用于工作内存的变量,把工作内存中的一个变量的值传递到主内存,以便write操作使用。
write(写入):作用于主内存的变量,把store操作从工作内存中得到的变量的值放入主内存的变量中。