java代码是怎么运行的?
1.Java代码都是以xxx.java的文件形式存在的
2.我们会将java文件打包生产xxx.class字节码文件
3.通过类加载器将class文件加载到jvm中,生产类
4.运行代码
jvm会在什么情况下去加载一个类?
1.一个类被加载通常会经过下面的经历:
加载->验证->准备->解析->初始化->使用->卸载
2.jvm会在类被调用的情况下采取加载一个类
验证
验证代码合不合代码规范,可不可以被编译成class字节码
准备
给类开辟空间,并给变量赋初始值,比如 public static int a; 就会给变量a赋值一个0;
解析
将符号引用替换为直接引用
初始化
准备阶段会给变量一个初始值,那么初始化阶段就会给类初始化
1. 以上代码在准备阶段,flushInterval变量只会有一个初始值0;
2.赋值会在初始化阶段执行,这个阶段会读取配置项,并赋值
类加载器和双亲委派机制
类加载器种类
- 启动类加载器 Bootstrap ClassLoader
- 负责加载java核心
- 扩展类加载器 Extension ClassLoader
- 负责加载java扩展类
- 应用类加载器 Application ClassLoader
- 加载classpath环境变量所制定路径的类
- 自定义加载器
- 除了上面那几种之外,还可以自定义类加载器,去根据你自己的需求加载你的类
双亲委派机制
一个类需要加载,首先会去找到自己的父类加载器去加载,最终会找到顶层类加载器去加载,如果父类加载器在自己负责加载的范围内,没找到这个类,那么就会下推,加载权利给自己的子类加载器。这就是双亲委派机制,先找父亲加载,不行再找儿子加载