类加载过程详解
类的生命周期
加载:获取此类的二进制流,并加载到方法区,并在堆中生成一个java.lang.Class对象,作为方法区这个类的访问入口。
验证:验证字节流是否符合虚拟机的标准。
准备:为类变量(static)分配内存(注意,逻辑上的方法区,实际上的堆)和零值(初值)。
解析:把类中的符号引用转换为直接引用
初始化:执行类构造器()方法,为类变量(static)初始化值(自定义值)。
类加载器
所有的类都由类加载器加载,加载的作用就是将 .class文件加载到内存。
启动类加载器):最顶层的加载类,由 C++实现,负责加载 %JAVA_HOME%/lib目录下的 jar 包和类或者被 -Xbootclasspath参数指定的路径中的所有类
扩展类加载器 :主要负责加载 %JRE_HOME%/lib/ext 目录下的 jar 包和类,或被 java.ext.dirs 系统变量所指定的路径下的 jar 包。
应用程序类加载器:面向我们用户的加载器,负责加载当前应用 classpath 下的所有 jar 包和类
双亲委派模型
classloader_WPS图片.png在类加载的时候,系统会首先判断当前类是否被加载过。已经被加载的类会直接返回,否则才会尝试加载。加载的时候,首先会把该请求委派给父类加载器的 loadClass() 处理,因此所有的请求最终都应该传送到顶层的启动类加载器 BootstrapClassLoader 中。当父类加载器无法处理时,才由自己来处理。当父类加载器为 null 时,会使用启动类加载器 BootstrapClassLoader 作为父类加载器。
双亲委派模型的好处
双亲委派模型保证了 Java 程序的稳定运行,可以避免类的重复加载,也保证了 Java 的核心 API 不被篡改。
总结
Java文件经过编译后变成 .class 字节码文件
字节码文件通过类加载器被搬运到 JVM 虚拟机中
虚拟机主要的5大块:方法区,堆都为线程共享区域,有线程安全问题,栈和本地方法栈和计数器都是独享区域,不存在线程安全问题,而 JVM 的调优主要就是围绕堆,栈两大块进行
网友评论