一 class是怎么到内存中的? 为什么可以去new
因为启动java程序的时候,由类加载器去加载了这些类
二 有哪些加载器
2.1 **BootStrapClassLoader** 启动类加载器,底层库编写,启动
jvm的时候自动调用,然后加载java运行必备的jar库, jre/lib。
如rt.jar
2.2 **ExtClassLoader** 扩展类加载器,加载jre/lib/ext的库.
2.3 **AppClassLoader** 应用类加载器,加载用户自定义的类.
三 加载的过程是怎样的?
3.1 先把类的二进制的元数据加载到方法区
3.2 验证: 验证二进制文件是否被篡改
3.3 准备: 初始化static属性,在方法区中分配内存
3.4 解析: 解析类里面的各种接口的引用,类的引用是否正确
3.5 初始化: 执行static属性的赋值, 执行static静态块
3.6 使用 : 可以在其他地方new了
3.7 卸载 : java退出的时候释放这些占用的内存
四. 什么是双亲委派模型/机制, 为什么要用?
4.1 类加载的时候,不是直接加载,而是逐个向上询问上级类加载器
是否加载过,如果加载过,则直接使用,不会二次加载。
4.2 如果上级加载器都没有加载,则由当前加载器加载
4.3 这种模型解决了安全问题,防止一个类被加载多次,防止系统类
被篡改。