在学习反射那一章节时想到自己之前学过的知识,故整理一番,希望能提供一点帮助,水平有限,如若有误欢迎指正。

Java提供了两种类的装载方式。一是预先加载,二是按需加载。因为可以对类进行按需加载,所以程序在启动时不需要把所有的类都装载到JVM中,大部分类都被延迟到使用时才动态加载。

1.预先加载

这里有Java基础类的加载和含main()函数类的加载。类加载器见文末补充。

Java基础类的加载流程:启动程序到jdk目录下找到并载入jvm.dll启动虚拟机初始化参数创建BootStrap Loader对象。

BootStrap Loader对象称为启动类装载器,它会在虚拟机启动时一次性加载JJVM的基础类。

含main函数的类加载:BootStrap Loader另一项工作就是负责装载定义在sun.misc命名空间下的Launcher类。Launcher类有两个内部类,ExcClassLoader和AppClassLoader,其中,ExtClassLoader的父加载器被设置为null,表示它的父加载器为BootStarp Loader,即它由BootStrap Loader直接装载,而AppClassLoader的父加载器为ExtClassLoader,含有main函数入口的类由AppClassLoader在程序启动时加载。

2.按需加载

即运行时动态装载,当需要使用这个类时,JVM才会去动态装载它。

1.装载条件:当一个类的静态成员被第一次引用时,JVM就会去装载它,包括【静态方法-静态属性-构造方法】

需要特别注意的是:

①当访问静态常量属性时,JVM加载类不会进行类的初始化工作。

②虽然构造方法没有被显式地声明为静态方法,但它仍是类的静态成员特例,因此,当使用new关键字来构造对象时,会被当成类静态成员的引用,从而触发JVM装载该类。

2.按需装载流程:

当需要使用某个类时,JVM首先会去检查该类的Class对象是否存在已经加载,如果没有,则执行以下步骤。

1)加载:查找并导入类的字节码,根据这些字节码创建Class对象

2)链接:其中分为三步

①校验:检查导入的字节码的完整性,正确性、安全性。

②准备:为静态域分配存储空间

③解析:将符号引用转折为直接引用(非必需)

3)初始化:初始化静态变量并执行静态域代码,上文提到,当访问类的常量静态属性时,类的初始化工作不会进行,真正的初始化工作会被延迟到对静态方法或非常量静态属性的首次访问时。

补充:类加载器

每当创建一个Java类的实例时,必须先将该类加载到内存中。JVM使用类加载器来加载类。Java加载器在Java核心类库和CLASSPATH环境下面的所有类中查找类。如果找不到,会抛出常见的 java.lang.ClassNotFoundException异常。

目前JVM使用3种类加载器:bootstrap类加载器、extension类加载器、system类加载器。三者是父子关系,其中,bootstrap类加载器在顶端,而system类加载器在结构的最底层。

bootstrap类加载器用于引导JVM,一旦调用java.exe程序,bootstrap类加载器就会开始工作,然后加载JVM所需要的类到函数中,其次,它还负责加载所有的Java核心类,如java.lang和java.io包等,另外,bootstrap还会根据JVM和操作系统来查找如rt.jar,i18n.jar等核心类库。

extension类加载器负责加载标准扩展目录下面的类,JVM的标准扩展目录是/jdk/jre/lib/ext。

system加载器是默认加载器,它负责在环境变量CLASSPATH目录下查找相应的类,这也就是我们为什么要配置好jdk环境变量的原因之一。

PS:JVM如何确定使用哪个类加载器呢?其实是通过委派模型来实现的,每次类需要加载,system类加载器首先被调用,但是它并不会马上加载类。而是将任务委派给它的父类extension类加载器。而extension类加载器也把任务委派给它的父类加载器bootstrap加载器。这也就是为什么bootstrap类加载器总是首先加载类的原因。如果父类加载器不能找到所需的类完成加载,这时才由子类尝试加载。如果连system类都加载失败,则抛出java.lang.ClassNotFoundException异常。

做这个笔记一是想自己整理一下这方面的知识,方便以后更深入学习Java虚拟机。其次也希望能整理出来帮助到他人。

java类如何加载_简述Java类加载方式及流程相关推荐

  1. java类的加载机制简述

    1.JVM启动时,会申请内存空间,按功能划分,如下图 2.Java的类加载过程 一个Java文件从编码完成到最终执行,一般主要包括两个过程:编译和运行 . 编译,即把我们写好的java文件,通过jav ...

  2. Java类的加载及父类子类加载顺序

    点击 Mr.绵羊的知识星球 解锁更多优质文章. 目录 一.类的加载 1. 类加载 2. 类加载器 二.父类和子类加载顺序 1. 案例(代码) 一.类的加载 1. 类加载 当程序要使用某些类时,如果该类 ...

  3. java图片异步加载_使用java concurrent处理异步加载图片功能

    转载:http://marshal.easymorse.com/archives/3081 java5开始,增加了concurrent api,用于并发处理.比如起多个线程并发从网络上下载图片,然后在 ...

  4. Java深度历险(二)——Java类的加载、链接和初始化

    在上一篇文章中介绍了Java字节代码的操纵,其中提到了利用Java类加载器来加载修改过后的字节代码并在JVM上执行.本文接着上一篇的话题,讨论Java类的加载.链接和初始化.Java字节代码的表现形式 ...

  5. Java类的加载过程详解 面试高频!!!值得收藏!!!

    受多种情况的影响,又开始看JVM 方面的知识. 1.Java 实在过于内卷,没法不往深了学. 2.面试题问的多,被迫学习. 3.纯粹的好奇. 很喜欢一句话: 八小时内谋生活,八小时外谋发展. 望别日与 ...

  6. 28 Java类的加载机制、什么是类的加载、类的生命周期、加载:查找并加载类的二进制数据、连接、初始化、类加载器、双亲委派模型、自定义类加载器

    28Java类的加载机制 28.1.什么是类的加载 28.2.类的生命周期 28.2.1.加载:查找并加载类的二进制数据 28.2.2.连接 28.2.3.初始化 28.3.类加载器 28.4.类的加 ...

  7. 这篇文章绝对让你深刻理解java类的加载以及ClassLoader源码分析

    前言 package com.jvm.classloader;class Father2{public static String strFather="HelloJVM_Father&qu ...

  8. 透过现象看本质:Java类动态加载和热替换

    摘要:本文主要介绍类加载器.自定义类加载器及类的加载和卸载等内容,并举例介绍了Java类的热替换. 最近,遇到了两个和Java类的加载和卸载相关的问题: 1) 是一道关于Java的判断题:一个类被首次 ...

  9. java类的加载,链接,初始化

    Java字节代码的表现形式是字节数组(byte[]),而Java类在JVM中的表现形式是java.lang.Class类的对象.一个Java类从字节代码到能够在JVM中被使用,需要经过加载.链接和初始 ...

最新文章

  1. hbase scan超时设置_深入浅出HBase系列(二)
  2. 处理多维度变化——桥接模式
  3. Windows + Eclipse + Gtk 环境(总结)
  4. Linux下切换用户出现su: Authentication failure的解决办法
  5. DLNA, PulseAudio, diffpatch, bash
  6. 禁止服务器的协议,启用或禁用服务器网络协议
  7. sqldeveloper的查看执行计划快捷键F10
  8. 牛人和普通人的区别在于思维方式!
  9. STM32+CubeMX开发工程笔记汇总(更新2021.8.12)
  10. mysql user表字段详解_Mysql User表权限字段说明全介绍
  11. java uml建模工具 apk,UML建模工具(Astah Professional)
  12. 简约黑白双色求职简历PPT模板
  13. 易语言利用微云在线更新源码
  14. FillRect、FrameRect与Rectangle矩形绘制函数使用对比分析
  15. 系统备份和还原(固态系统盘)
  16. Mac上Elasticsearch 安装及PHP使用
  17. 7.24[C语言零基础 知识点总结]
  18. 统一网关 Gateway
  19. 数据中心网络设备管理(一)
  20. XENIRO 讯琥科技应用案例(八)| 基于边缘计算和区块链的跨境漫游结算

热门文章

  1. DB2导入数据import和load的使用
  2. 嘿嘿,成功加到妹子微信!
  3. IE11 FOR WIN7 32 装的补丁
  4. 我个人的网站推广方法
  5. vue 上传文件到华为云obs
  6. 数据结构实验二 :二叉树的操作与实现
  7. 自动升级的原理及实现
  8. 笔记本怎么打开html的面板,笔记本电脑触摸板如何打开和关闭
  9. 基于Python的发票OCR-数字识别的简单实现
  10. 程序员的几个搞笑瞬间!!!