深入Java虚拟机之类加载

article/2025/8/22 15:41:58

深入Java虚拟机_ClassLoader

类加载器深入剖析

  • Java虚拟机与程序的生命周期

  • 在如下几种情况下,Java虚拟机将结束生命周期

    • 执行了System.exit()方法
    • 程序正常执行结束
    • 程序在执行过程中遇到了异常或错误而异常终止
    • 由于操作系统出现错误而导致Java虚拟机进程

类的加载连接和初始化

  • 加载:查找并加载类的二进制数据

  • 连接

    • 验证:确保被加载的类的正确性
    • 准备:为类的静态变量分配内存,并将其初始化为默认值
  • 解析:把类中的符号引用转换为直接引用

  • 初始化:为类的静态变量赋予正确的初始值

  • Java程序对类的使用方式可分为两种

    • 主动使用
    • 被动使用
  • 所有的Java虚拟机实现必须在每个类或接 口被Java程序“首次主动使用”时才初始化他们

  • 主动使用(六种)

    • 创建类的实例
    • 访问某个类或接口的静态变量,或者对该静态 变量赋值
    • 调用类的静态方法
    • 反射(如 Class.forName(“com.shengsiyuan.Test”) )
    • 初始化一个类的子类
    • Java虚拟机启动时被标明为启动类的类(Java Test)
  • 除了以上六种情况,其他使用Java类的方 式都被看作是对类的被动使用,都不会导 致类的初始化

类的加载

  • 类的加载指的是将类的.class文件中的二进 制数据读入到内存中,将其放在运行时数 据区的方法区内,然后在堆区创建一个 java.lang.Class对象,用来封装类在方法 区内的数据结构

  • 加载.class文件的方式

    • 从本地系统中直接加载
    • 通过网络下载.class文件
    • 从zip,jar等归档文件中加载.class文件
    • 从专有数据库中提取.class文件
    • 将Java源文件动态编译为.class文件

  • 类的加载的最终产品是位于堆区中的Class对象

  • Class对象封装了类在方法区内的数据结构 ,并且向Java程序员提供了访问方法区内 的数据结构的接口

  • 有两种类型的类加载器

    • Java虚拟机自带的加载器
      • 根类加载器(Bootstrap)
      • 扩展类加载器(Extension)
      • 系统类加载器(System)
  • 用户自定义的类加载器

    • java.lang.ClassLoader的子类
    • 用户可以定制类的加载方式
  • 类加载器并不需要等到某个类被“首次主 动使用”时再加载它

  • JVM规范允许类加载器在预料某个类将要 被使用时就预先加载它,如果在预先加载 的过程中遇到了.class文件缺失或存在错误 ,类加载器必须在程序首次主动使用该类 时才报告错误(LinkageError错误)

  • 如果这个类一直没有被程序主动使用,那 么类加载器就不会报告错误

类的验证

  • 类被加载后,就进入连接阶段。连接就是 将已经读入到内存的类的二进制数据合并 到虚拟机的运行时环境中去。

  • 类的验证的内容

    • 类文件的结构检查
    • 语义检查
    • 字节码验证
    • 二进制兼容性的验证

类的准备

类的解析

类的初始化

  • 类的初始化步骤

类的初始化时机

  • 主动使用(六种)

    • 创建类的实例
    • 访问某个类或接口的静态变量,或者对该静态 变量赋值
    • 调用类的静态方法
    • 反射(如 Class.forName(“com.shengsiyuan.Test”) )
    • 初始化一个类的子类
    • Java虚拟机启动时被标明为启动类的类(Java Test)
  • 除了上述六种情形,其他使用Java

类的方 式都被看作是被动使用,不会导致类的初始化

  • 只有当程序访问的静态变量或静态方法确 实在当前类或当前接口中定义时,才可以 认为是对类或接口的主动使用

  • 调用ClassLoader类的loadClass方法加载 一个类,并不是对类的主动使用,不会导 致类的初始化。

类加载器

类加载的父委托机制


命名空间


个类

运行时包

创建用户自定义的类加载器

不同类加载器的命名空间关系

  • 修改MyClassLoader类的源代码

类的卸载

结语

作者:ricky

交流群: 244930845


http://chatgpt.dhexx.cn/article/VjCN1dgq.shtml

相关文章

Java虚拟机安装

下载VMware然后安装打开(如果已经有了的就不要下载了) 秘钥:FF31K-AHZD1-H8ETZ-8WWEZ-WUUVA CV7T2-6WY5Q-48EWP-ZXY7X-QGUWD 然后创建虚拟机 创建完成 然后开启虚拟机如果报以上错误: 重启计算机,进入bios&#xff08…

Java虚拟机面试题精选(一)

微信搜索【程序员囧辉】,关注这个坚持分享技术干货的程序员。 概述 现在面试Java开发时,基本都会问到Java虚拟机的知识,根据职位不同问的内容深浅又有所区别。本文整理了10道面试中常问的Java虚拟机面试题,希望对正在面试的同学有…

【JAVA虚拟机】java虚拟机

文章目录 前言一、JAVA内存结构体系二、双亲委派机制三、JAVA虚拟机调优场景1.CPU占用过高2.死锁3.内存泄漏4.元数据空间溢出性能调优归纳 三、垃圾回收器1、垃圾回收算法2、垃圾收集器 前言 记录java虚拟机常见的问题场景。 提示:以下是本篇文章正文内容&#xff…

java虚拟机是什么?

一、java虚拟机定义: 虚拟机是一种抽象化的计算机,通过在实际的计算机上仿真模拟各种计算机功能来实现的。Java虚拟机有自己完善的硬体架构,如处理器、堆栈、寄存器等,还具有相应的指令系统。Java虚拟机屏蔽了与具体操作系统平台相关的信息,使得Java程序只需生成在Java虚…

【Java虚拟机】万字长文,搞定Java虚拟机方方面面!

文章目录 1.JVM内存结构1.1.JVM内存结构图1.2.程序计数器1.3.虚拟机栈1.4.本地方法栈1.5.Java堆1.6.方法区1.7.StringTable1.8.直接内存 2.对象创建解析2.1.对象创建的流程2.2.对象的结构2.3.对象的访问方式 3.JVM垃圾回收3.1.垃圾回收概述3.2.引用计数法3.3.可达性分析算法3.4…

java虚拟机运行机制

首先简单阐述下解释型语言和编译型语言的联系与区别。 编译型语言是通过编译器将程序编译成目标机器所能识别的机器码,而解释型语言不需要编译过程。由该语言的解释器读取脚本,按照语法规则进行解释,然后调用解释器内建的命令(或者库函数)。例…

浅谈Java虚拟机(JVM)

前言👇 第一次在CSDN上写博客(2022.03.24,大二下),历时天,期间因为准备蓝桥杯有所延误。思考了一下,决定在第一篇写一写JVM,不能保证所有的东西都是对的,虚心求教&#x…

[JVM] Java虚拟机栈

1. 概念 Java虚拟机栈(Java Virtual Machine Stacks)是线程私有的,栈使用的内存不需要保证是连续的,栈帧存储了方法的局部变量表、操作数栈、动态连接和方法返回地址等信息。每一个方法从调用至执行完成的过程,都对应…

【JVM】Java虚拟机简介

【JVM】Java虚拟机简介 我们看中的并非Java语言,而是JVM。——Java之父James Gosling Java 虚拟机(Java virtual machine,JVM)是运行 Java 程序必不可少的机制。 JVM实现了Java语言最重要的特征:即平台无关性。这是因…

JAVA虚拟机概述

本博客内容为《深入理解Java虚拟机:JVM高级特性与最佳实践》的阅读笔记。 1 Java技术体系 仅从传统意义上来看,Sun官方所定义的Java技术体系包括以下几个组成部分: Java程序语言设计各种硬件平台上的Java虚拟机Class文件格式Java API类库来…

详解Java虚拟机

资料来源:尚硅谷宋红康JVM全套教程(详解java虚拟机)_哔哩哔哩_bilibili 1.JVM与Java体系结构 1.1. 前言 如果我们把核心类库的API比做数学公式的话,那么Java虚拟机的知识就好比公式的推导过程。 计算机系统体系对我们来说越来越远…

java虚拟机到底是什么

转自:http://blog.csdn.net/zhangjg_blog/article/details/20380971 http://blog.hesey.net/2011/04/introduction-to-java-virtual-machine.html 虚拟机是一种抽象化的计算机,通过在实际的计算机上仿真模拟各种计算机功能来实现的。Java虚拟机有自己完善的硬体架…

深入理解Java虚拟机到底是什么

什么是Java虚拟机 作为一个Java程序员,我们每天都在写Java代码,我们写的代码都是在一个叫做Java虚拟机的东西上执行的。但是如果要问什么是虚拟机,恐怕很多人就会模棱两可了。在本文中,我会写下我对虚拟机的理解。因为能力所限&am…

java虚拟机(JVM)

一、虚拟机的组成 虚拟机的组成主要有:方法区、堆都为线程共享区域,有线程安全问题。 栈、本地方法栈、程序计数器为线程的独享区域,不存在线程安全问题。 注:JVM的调优主要是针对堆和栈进行的 1.1:运行时数据区域 …

JVM——Java虚拟机架构

0. 前言 Java虚拟机(Java virtualmachine)实现了Java语言最重要的特征:即平台无关性。 平台无关性原理:编译后的 Java程序(.class文件)由 JVM执行。JVM屏蔽了与具体平台相关的信息,使程序可以…

深入理解Java虚拟机

前言 JVM是什么? JVM(Java Virtual Machine,Java 虚拟机)顾名思义就是用来执行 Java 程序的“虚拟主机”,实际的工作是将编译生成的.class 文件(字节码)翻译成底层操作系统可以运行的机器码并…

一文彻底了解JVM

目录 JVM内存结构 GC算法和收集器 JDK性能调优监控工具 GC调优 JVM内存结构 类加载机制 Java运行时编译源码(.java)成字节码,由jre运行。jre由java虚拟机实现。JVM分析字节码,后解释并执行。 1、全盘负责委托机制 当一个ClassLoader加载一个类的时…

通俗易懂理解JAVA虚拟机

目录 前言 一、什么是JAVA虚拟机(JVM) 二、内存结构 1.程序计数器 2.虚拟机栈 3.本地方法栈 4.堆 5.方法区(元数据区) 6、执行引擎 7、直接内存 三、垃圾回收 1.如何判断对象可以回收, 2.垃圾回收算法…

Java虚拟机(JVM)你只要看这一篇就够了!

本文是学习了《深入理解Java虚拟机》之后的总结,主要内容都来自于书中,也有作者的一些理解。一是为了梳理知识点,归纳总结,二是为了分享交流,如有错误之处还望指出。 用XMind画了一张导图(源文件对部分节点…

简单的文本编辑器

今天应同学的需求写了一个文本编辑器可以简单的时间文本的打开、删除、显示、查找、插入的简单功能 C语言代码如下&#xff1a; #include <stdio.h> #include <stdlib.h> #include <malloc.h> #include <time.h> #define MAX 10000 #include <stri…