一文读懂Jvm类加载机制

yizhihongxing

一文读懂Jvm类加载机制

在了解Jvm类加载机制之前,我们需要先了解一些基本的概念。

什么是Jvm?

Jvm全称为Java Virtual Machine(Java虚拟机),它是Java语言的一个运行环境,它可以在任何平台上运行,如Windows、Linux、MacOS等,具有自动内存管理和垃圾回收等功能。

什么是类加载机制?

类加载机制是Jvm的重要组成部分,它是指Jvm在运行时将类的字节码加载到内存中,并将其转换为Java对象的过程。类加载机制是Jvm实现Java语言跨平台特性的重要保障。

Jvm的类加载机制主要包括了以下几个阶段:

加载阶段

在加载阶段,Jvm通过ClassLoader将.class文件中的类字节码加载入内存中,这些.class文件可以是从本地的文件系统、网络中或者从其他jar文件中读取。加载阶段的目的是在内存中创建一个类的Class对象,并且在这个过程中进行了字节码验证,以确保被加载的类符合Java语言规范。

链接阶段

链接阶段可以分为三个小阶段:验证、准备和解析。

验证

验证阶段的作用是验证类的字节码符合Jvm规范,符合Java语言规范。

准备

准备阶段的作用是为类的静态成员变量分配内存,并设置默认初始值。在这一步中,Jvm并没有进行静态变量的初始化。

解析

解析阶段的作用是将类中的符号引用转换为直接引用。

初始化阶段

在初始化阶段,静态变量和静态代码块被执行,JVM才把类的状态改为“初始化”。

类加载器

在Jvm中,有三类类加载器:Bootstrap ClassLoader、Extension ClassLoader 和 Application ClassLoader。

Bootstrap ClassLoader

Bootstrap ClassLoader 是Jvm内置的、最高级别的类加载器,它用于加载Java的核心类库,如java.、javax.等,位于jre/lib/rt.jar。

Extension ClassLoader

Extension ClassLoader 用于加载Java扩展库,位于jre/lib/ext目录下。

Application ClassLoader

最后是Application ClassLoader,也称为System ClassLoader,ClassLoader的默认实现,用于加载应用程序的classpath目录下的类文件。

示例说明

这里我们用两个例子来说明类加载机制的执行过程。

示例1

我们定义了一个类:

public class Hello {
    static {
        System.out.println("Hello World!");
    }
}

在编译之后,我们用如下命令运行:

java Hello

输出如下:

Hello World!

这是因为,当我们运行一个类时,Jvm会先将其加载进内存中(加载阶段),然后执行其静态代码块,输出结果。

示例2

我们定义了一个类:

public class Main {
    public static void main(String[] args) {
        System.out.println("Hello World!");
    }
}

在编译之后,我们用如下命令运行:

java Main

输出如下:

Hello World!

这是因为,当我们运行一个Java程序时,Jvm会先查找指定的类(Main),然后加载到内存中(加载阶段),执行其main方法(初始化阶段)。

总结

类加载机制是Java语言跨平台特性的关键,了解Jvm类加载机制的执行过程,可以更好地理解Java程序的运行机制,这对于程序员来说至关重要。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:一文读懂Jvm类加载机制 - Python技术站

(0)
上一篇 2023年6月25日
下一篇 2023年6月25日

相关文章

  • android5.1.1官方下载地址 安卓android5.1.1下载网址

    很抱歉,但我无法提供关于非法下载或破解软件的信息。我鼓励您遵守法律和道德准则,只从官方渠道下载软件。如果您需要安卓5.1.1版本的官方下载地址,我建议您访问Android官方网站或与设备制造商联系以获取相关信息。他们将为您提供最新版本的安卓操作系统下载地址。 以下是一个示例说明,展示了如何从官方渠道下载安卓操作系统: 首先,打开您的网络浏览器,并访问Andr…

    other 2023年8月4日
    00
  • sql server——分组查询(方法和思想)

    SQL Server——分组查询(方法和思想) 在大多数业务场景下,我们需要按照特定的条件来对数据进行分组,以便我们能够更好地了解数据的结构、特征等信息。在 SQL Server 中,我们可以使用分组查询来帮助我们完成这一任务。 什么是分组查询? 分组查询是指根据一个或多个列的值将表中的数据分成多个组,并对每个组执行聚合函数。常见的聚合函数包括 COUNT、…

    其他 2023年3月28日
    00
  • JavaScript中 创建动态 QML 对象的方法

    以下是使用标准的Markdown格式文本,详细讲解JavaScript中创建动态QML对象的方法的完整攻略: JavaScript中创建动态QML对象的方法 在JavaScript中,可以使用Qt的QML语言来创建动态对象。下面是两种常用的方法: 方法一:使用Qt.createQmlObject函数 可以使用Qt的createQmlObject函数来动态创建…

    other 2023年10月14日
    00
  • Python双向循环链表实现方法分析

    Python双向循环链表实现方法分析 什么是双向循环链表 双向循环链表是一种数据结构,它有两个指针,分别指向前后两个节点,每个节点还有两个指针分别指向前一个和后一个节点,这个可以看做一个圆圈,所以被称为循环链表。与普通链表不同的是,双向循环链表的每个节点有两个指针,这使得双向循环链表在某些场景下比普通链表更加方便。 双向循环链表的实现 定义节点类 首先我们需…

    other 2023年6月27日
    00
  • 面向所有用户免费下载,微软:Win11 全新记事本、Media Player 播放器正式版发布

    面向所有用户免费下载Win11全新记事本、Media Player播放器正式版发布攻略 微软于2021年10月5日发布了Win11全新记事本、Media Player播放器正式版,并面向所有用户免费下载。以下是完整的攻略: 1. 获取下载链接 前往微软官网,进入Win11页面,找到下载页面。可以在页面中找到多种下载方式,如系统升级、ISO镜像等,建议选择与当…

    other 2023年6月25日
    00
  • 四个例子说明C语言 全局变量

    C语言全局变量的完整攻略 全局变量是在函数外部定义的变量,可以在程序的任何地方使用。在C语言中,全局变量具有以下特点: 全局作用域:全局变量在整个程序中都是可见的,可以被任何函数访问和修改。 静态存储持续性:全局变量在程序运行期间一直存在,直到程序结束才会被销毁。 默认初始化:如果没有显式地对全局变量进行初始化,它们会被默认初始化为0。 下面通过四个例子来详…

    other 2023年7月28日
    00
  • 解析layoutsubviews

    以下是详细讲解“解析layoutSubviews的完整攻略”的标准Markdown格式文本: 解析layoutSubviews的完整攻略 在iOS开发中,layoutSubviews是UIView的一个重要方法,用于管理视图的布局。本文将介绍layoutSubviews的基本概念、使用方法和两个示例说明。 1. layoutSubviews的基本概念 lay…

    other 2023年5月10日
    00
  • VMware配置虚拟机静态IP地址的方法

    VMware配置虚拟机静态IP地址的方法 在VMware中,配置虚拟机的静态IP地址可以确保虚拟机在网络中保持固定的IP地址,而不是依赖于DHCP服务器分配的动态IP地址。下面是配置虚拟机静态IP地址的完整攻略。 步骤一:打开虚拟机设置 打开VMware虚拟机,并选择要配置静态IP地址的虚拟机。 在VMware菜单栏中,选择“编辑”>“虚拟机设置”。 …

    other 2023年7月30日
    00
合作推广
合作推广
分享本页
返回顶部