深入Java虚拟机

⑴ 在如下几种情况下,Java虚拟机会结束其生命周期
    -执行了System.exit()方法
    -程序正常执行结束
    -程序在执行过程中遇到了异常或错误而异常终止
    -由于操作系统出现错误而导致Java虚拟机进程终止
⑵ 有两种类型的类加载器
    -Java虚拟机自带的加载器
  • 根类加载器(Bootstrap)
  • 扩展类加载器(Extension)
  • 系统类加载器(System)
    -用户自定义类加载器
  • java.lang.ClassLoader的子类
  • 用户可以定制类的加载方式
⑶ 类加载器并不需要等到某个类被“首次主动使用”时再加载它,JVM规范允许类加载器在预料到某个类将要被使用时就预先加载它,如果在预先加载的过程中,遇到了.class文件缺失或存在错误,类加载器必须在程序首次主动使用该类时才报告错误(LinkageError);如果这个类一直没有被主动使用,那么类加载器就不会报告错误;类被加载后,就进入了链接阶段,链接就是将已经被读入到内存的类的二进制数据合并到虚拟机的运行时环境中去。
⑷ 当Java虚拟机初始化一个类时,要求它的所有父类都已经被初始化,但是这条规则并不适用于接口。在初始化一个类时,并不要求先初始化它所实现的接口;在初始化一个接口时,并不会先初始化它的父接口;因此一个父接口并不会因为它的子接口或者实现类的初始化而初始化。只有当程序首次使用特定接口的静态变量时,才会导致该接口的初始化。
⑸ 调用ClassLoader类的loadClass方法加载一个类,并不是对类的主动使用,不会导致类的初始化。所有用户自定义的类加载器应该继承ClassLoader类。由同一类加载器加载的属于相同包的类组成了运行时包。决定两个类是不是属于同一个运行时包,不仅要看它们的包名是否相同,还要看定义类加载器是否相同。(定义类加载器是指实际加载类的那个类加载器)
⑹ 子加载器的命名空间包含所有父加载器的命名空间。因此由子加载器加载的类能看见父加载器加载的类。由父类加载器加载的类不能看见子类加载器加载的类。如果两个加载器之间没有直接或间接的父子关系,那么它们各自加载的类相互不可见。


原文地址:https://www.cnblogs.com/jiangu66/p/3174531.html