jvm-类加载

 1、我们平常用eclipse或者idea开发的java代码 是怎么运行起来的呢?

        通常的过程是 编译(.java文件转为.class文件)----- 打包成.jar包或者.war包---------通过java -jar命令或者tomcat这类容器部署-----类加载器加载到JVM中--------字节码执行引擎执行。jar包或者war包中的.class文件,能够被jvm识别并运行的前提是要被加载到jvm中,完成这一个过程依赖的就是类加载器。加载完后,jvm会通过字节码执行引擎来执行这些写好的类。

2、who is 类加载器?

          一个写好的类的声明周期:加载--->验证--->准备--->解析--->初始化--->使用--->卸载。

          加载:当代码中用到这个类的时候,这个类就会被加载。

          验证:校验.class文件 是否是java文件,内容是否符合java规范

          准备:给类变量分配内存空间,并设置初始值。类变量如果指向对象,为其指向的对象分配内存空间

          解析:将符号引用改为值引用

          初始化:执行我们的代码。static修饰的变量、修饰的代码块。

                     java中类的初始化主要有:1、通过new 关键字来实例化对象的时候 触发类的加载到初始化。2、main方法的主类立即初始化 3、初始化一个类的时候 如果父类没有初始化,先初始化他的父类。

                    类的初始化的应用:虚拟机会保证一个类的clinit()方法在多线程环境中被正确的加锁、同步,如果多个线程同时去初始化一个类,那么只会有一个线程去执行这个类的clinit()方法,其他线程都需要阻塞等待,直到活动线程执行类初始化方法完毕。

          类的加载机制:双亲委派机制。先去找父类加载,不行的话再由儿子去加载。

          java的类加载器:1、启动类加载器:Bootstrap ClassLoader  负责加载java目录下的核心类 lib/* 2、扩展类加载器,Extension ClassLoader lib\ext目录下的类 3、应用程序类加载器 Application ClassLoader 负责加载classPath环境变量所指定的路径的类。4、自定义类加载器。

3、自定义类加载器。

      两个步骤:继承ClassLoader类;覆盖findClass(String className)方法。

     findClass方法中:1、加载指定的字节码文件 2、调用ClassLoader超类的defineClass方法,给虚拟机提供字节码。

4、tomcat类加载机制。

  参考:https://www.cnblogs.com/xing901022/p/4574961.html 

5、附上自己画的图:

 

      

 

 

你可能感兴趣的:(jvm)