字节码文件与ClassLoader

  • 使用javac命令编译.java源代码文件生成.class字节码文件
  • 使用javap -c -v XXX.class可以查看字节码文件内容
  • ClassLoader
    • 将class字节码文件加载到JVM虚拟机中
    • 搜索class字节码文件的范围是由classpath中配置的一个或多个路径来决定的,如果执行时真的找不到则会抛出ClassNotFound异常。
    • 文件验证器检查每一个class字节码文件的过程
      • 字节码文件结构
      • 检查class字节码文件开头的几个数字,即魔数,一般就是0xCAFEBABE,说明是一个Java类。
      • 检查class字节码文件接下来的两个数,即主副版本号,比如50.0代表1.6。
      • 验证Class编译得对不对,比如常量池、访问标识、字段、方法等。
    • 分级的ClassLoader
      • Bootstrap ClassLoader
      • Extension ClassLoader
      • App ClassLoader
      • App ClassLoader必须一级级请示上级是否已经加载了该class(上级加载过就不用再重复加载了),因为有一些String、ArrayList这样的重要类,由核心ClassLoader去加载,避免黑客搞一些同名的会进行攻击的class被App ClassLoader加载进来被运行
  • JVM虚拟机
    • 方法区
      • Java函数栈
        • 每个线程会有一个
        • 包含多个栈帧,即依次多个函数调用
        • 栈帧
          • 一旦调用一个新方法,就会形成一个新的栈帧
          • 每个栈帧中都有一个函数变量区和一个操作数栈
          • 局部变量区
          • 操作数栈
            • 先进先出
            • 举例来说,通常会根据指令(如a+b),将当前指令需要的变量(a、b)从局部变量区放到操作数栈中,然后再执行加法操作指令
    • 根据类创建出的对象被放在
    • 每个线程在运行时,如果需要用到某个类的方法,会根据地址(?)去向类要并执行方法对应的一条条指令
    • 垃圾回收
      • 清理者
      • JVM虚拟机可以使用多少内存,是在启动虚拟机时通过参数由码农指定的
      • 如果不清理,很快就会用完内存,系统崩溃,Out Of Memory
      • 通过可达性分析来确定需要清理哪些对象
        • 从GC Roots对象节点出发,四处搜索被GC Roots直接引用的对象,再一层层去找引用链条上的对象,如果不在这些链条上,那么就很有可能被清理。

posted on 2019-11-26 14:17  碎羽love星谊  阅读(209)  评论(0编辑  收藏  举报

导航