JVM
JVM加载顺序
类加载器
类加载器,通过双亲委派机制,先委托给父类找代码,再一步一步交给子类,防止用户代码污染源代码。
栈空间
栈空间,通过栈帧管理程序的运行。
方法区
方法区(元空间),存放类的结构信息,被虚拟机加载的类信息、常量、静态变量、以及编译后的方法等数据 。
空调 f = new 格力();
/*
方法区 -> f
*/
堆空间
堆空间(存储空间),分为新生代,老年代,元空间。新生代和老年代采用的虚拟机配置的内存空间,元空间采用的是机器的物理内存空间。
GC
GC,垃圾回收算法。分代收集算法分为4种,复制算法,引用计数算法,标记清除算法,标记压缩算法。
复制算法,将内存分为两部分,回收时对其中一部分内存进行垃圾回收,然后复制到另外一个内存空间。优点:效率高。缺点:碎片多,浪费空间,适用于新生代Eden区。
引用计算法,(不常见),通用可达性分析,判断对象是否被引用,引用+1,不引用-1。从而判断该对象是否该回收。
标记清除算法,标记可回收的对象再进行清除,需要两次扫描,缺点:碎片多,优点:节约空间。
标记压缩算法,标记可回收的对象,清除完毕后再对碎片空间进行压缩。优点:无碎片,节约空间。缺点:浪费时间。 标记压缩算法和标记清除算法适用于老年代。
JMM
JMM ,即java内存模型。为了保证程序运行时解决对象储存到计算机存储空间的线程问题。
- 原子性,保证多次访问数据一致性问题。
- 可见性,共享对象发生改变对其他线程可见。
- 有序性,程序运行顺序运行。
JVM每个线程运行时有一个独立工作内存, 每次去主空间拿去数据后对数据上锁(lock),然后(read and load )读取到工作空间由执行器对数据进行修改(use and assign ),修改完毕后再由工作空间写入(store and write)到主空间中,并解锁(unlock ),最后通知其他线程。采用的是一种悲观锁的方式。
补充:
类的加载顺序是:静态代码块 -> 构造快 -> 构造方法
extend 抽象类 和 new实例对象是对立管理。