JVM学习笔记2

本文详细探讨了JVM的类命名空间、运行时包和类加载器分类。类命名空间由加载类的类加载器及其父加载器决定,确保命名唯一。运行时包确保了只有被相同类加载器加载的类才能相互访问。类加载器分为启动类加载器、扩展类加载器和系统类加载器,以及用户自定义类加载器。启动类加载器加载JVM核心类,扩展类加载器加载扩展功能,系统类加载器根据classpath加载类。用户可以通过java.system.class.loader参数指定自定义类加载器。类的卸载主要针对用户自定义类加载器加载的类,当类的对象不再被引用时,类可以被卸载。

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对象生命周期结束

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值