JVM学习笔记2

1、类命名空间


  1. 每一个类都有自己的命名空间,类命名空间由加载该类的类加载器以及其父加载器所加载的类组成的
  2. 在同一个命名空间内,不允许出现类完整名字相同的两个类
  3. 在不同的类命名空间中,可能会出现类的完整名字相同的类
  4. 一个类有可能被加载多次,在不同的命名空间中
  5. 一个类如果由父加载器加载的,那它是看不到子加载器加载的类,反过来不成立

2、运行时包

同一个类加载器加载,属于同一个包,多个类型的集合

java默认允许同一个包内个各类直接访问彼此的权限,当一个外部内伪装成java API 例如java.lang.Virus(病毒类),按照包内访问权限,它应该能访问到java.lang.String等等之类的类,但是由于存在运行时包存在,java虚拟机不仅要确认该类是属于同一个包,而且还必须确认二者被同一个类加载器加载,而病毒类是由用户自定义的类加载器加载的,java API核心是由启动类加载器加载的,故不能访问

3、类加载器分类

  1. 系统自带的
  • 启动类加载器

      会load   JRE/lib/rt.jar 或者Xrootclasspath选项指定的目录下

      内建于虚拟机中的启动类加载器会加载java.lang.ClassLoader以及其他的java类

      当JVM启动时,会执行一段特殊的机器码会运行,这段特殊的机器码会加载扩展类和系统类加载器

      这块特殊的机器码就是启动类加载器

      启动类加载器不是java代码编写的,是特定于平台的机器指令,内建于JVM中的,其他所有加载器都被实现为java类

      启动类加载器还会负责加载供JRE正常运行所需要的基本组件,包括java.util和java.lang中的类等等

  • 扩展类加载器

       会load  JAVA平台中扩展功能的jar包 通过设定java.ext.dirs  查找的是jar包里面的class文件,单纯的class文件不会被查找

  • 系统类加载器

       会load  classpath

        If the system property "java.system.class.loader" is defined when this method is first invoked then the value of that         property is taken to be the name of a class that will be returned as the system class loader. The class is loaded                using the default system class loader and must define a public constructor that takes a single parameter of type            ClassLoader which is used as the delegation parent. An instance is then created using this constructor with the            default system class loader as the parameter. The resulting class loader is defined to be the system class loader.

        可以显式的指定用户自定义的类加载器为默认的系统类加载器,只需要在启动的额时候配置系统启动属性  

        java.system.class.loader 参数指定一个类的全限定名,则这个类加载器就成为了系统类加载器,需要注意的是

        该自定义的类加载器必须要有一个public constructor方法,参数接收一个ClassLoader ,用作委托父级

  1. 用户自定义的类加载器

         需要继承ClassLoader类

3、获取ClassLoader

  • 获取当前类的类加载器

    clazz.getClassLoader()

  • 获取当前线程上下文类加载器

  Thread.currentThread.getContextClassLoader()

  • 获取系统类加载器

  ClassLoader.getSystemClassLoader()

4、类的卸载

  1. 由JVM自带的类加载器加载的类在程序的整个生命周期内都不会被卸载

       虚拟机本身会始终引用这些类加载器的,而这些类加载器会始终引用它们所加载的类的Class对象

     2.由用户自定义的类加载器加载的类可以被卸载

     3.一个类要被卸载,就是Class对象已经不再被引用了,从而导致Class对象生命周期结束

你可能感兴趣的:(JVM类加载,JVM学习)