JVM位置:在操作系统(Window,Linux,Mac)之上
类加载器的作用:加载Class文件
顺序
1.类加载器收到类加载的请求
2.将这个请求委托给父类加载器去完成,一直向上委托,直到启动类加载
3.启动加载器检查是否能加载当前这个类,能加载就结束使用当前的加载器,否则抛出异常,通知子加载器进行加载。
4.重复3的步骤
双亲委派机制的优势和劣势
双亲委派机制优势
避免类的重复加载, 确保一个类的全局唯一性
Java 类随着它的类加载器一起具备了一种带有优先级的层级关系, 通过这种
层级关系可以避免类的重复加载, 当父亲已经加载了该类时, 就没有必要子
ClassLoader 再加载一次
保护程序安全, 防止核心 API 被随意篡改
代码支持
双亲委派机制的弊端
检查类是否加载的委派过程是单向的, 这个方式虽然从结构上说比较清晰,
使各个 ClassLoader 的职责非常明确, 但是同时会带来一个问题, 即顶层的
ClassLoader 无法访问底层的 ClassLoader 所加载的类
通常情况下, 启动类加载器中的类为系统核心类, 包括一些重要的系统接口,
而在应用类加载器中, 为应用类。 按照这种模式, 应用类访问系统类自然是没
有问题, 但是系统类访问应用类就会出现问题。 比如在系统类中提供了一个接
口, 该接口需要在应用类中得以实现, 该接口还绑定一个工厂方法, 用于创建该
接口的实例, 而接口和工厂方法都在启动类加载器中。 这时, 就会出现该工厂方
法无法创建由应用类加载器加载的应用实例
native 凡是java中带有native就说明java作用范围不够会调用底层c语言
栈:数据结构
程序=数据结构加算法
先进后出,先出后进:桶的概念
队列:先进先出
栈内存:主管程序的运行,生命周期和线程同步;
线程结束,栈内存也就释放,对于栈来说不存在垃圾回收,因为一旦线程结束栈就Over!
栈里面会存那些东西:八大基本类型+对象的引用+实例的方法
问题 一个对象实例化的过程在内存中
复制算法使用场景:在对象存活率较低的时候使用比较好
复制算法的好处:没有内存的碎片
复制算法的坏处:浪费了内存空间,多了一半空间永远是to,假设对象的存活率为100%的情况使用就不合适