JVM类加载

为什么要类加载

Java语言编译期间没有Link,此项工作在类加载期间完成。编译期间只会编译
一个Java程序的类文件在需要的时候才加载,而不是程序启动时就会加载,后期运行时动态加载
class.forName();//java程序可以装载在编译时并不知道或尚未存在的类或接口
对于类的加载是非常灵活的,因此os去做不会这么灵活。
因此类加载器将负责动态加载java类到java虚拟机的内存空间中,具体来说:java编译器将源文件编译成字节码文件,类加载器将字节码文件加载到JVM的内存区域中,并在java的堆中创建一个java.lang.class对象,通过这个对象可以访问到该类在方法区的内容。

java类加载的步骤

加载(找到类文件,内存里/url下载,遵循java语言规范的;即通过一个类的全限定名来获取定义此类的二进制字节流)-验证(文件格式)-准备(为变量进行初始化,给这个class文件中类变量在方法区中分配内存)-解析(把符号引用解析为实际引用)-初始化(静态初始化,static块)-使用(类加载完后就等待使用)-卸载(使用完成之后进行卸载动作)

类加载器类型

  • 启动类加载器(顶级父类加载器):负责加载存放在JDK\jre\lib下,并且能被虚拟机识别的类库。无法被java程序直接引用
  • 扩展类加载器:负责加载JDK\jre\lib\ext目录下的所有类库。开发者可以直接使用
  • 应用程序类加载器:负责加载用户类路径所指定的类,开发者可以直接使用。如果应用程序没有自定义过自己的类加载器,一般情况下这个就是程序中默认的类加载器。
    类加载器遵循双亲委派模式,并通过组合的方式实现父子关系。即优先由父加载器处理,父加载器处理不了的再交给子加载器处理,从而保证基础类的唯一性。

内存管理

逻辑分区

  • 程序计数器:字节码行号指示器
  • 虚拟机栈:方法执行时创建栈帧
  • 本地方法栈:执行本地方法
  • 堆:存放对象的空间
  • 方法区:存储类数据、常量、常量池、静态变量
  • 对象访问:初始化一个对象,其引用存放于栈帧,对象存放于堆内存,对象包含属性信息和该对象父类、接口等类型数据
posted @ 2020-08-20 15:27  闲不住的小李  阅读(88)  评论(0编辑  收藏  举报