JVM 心得分享(加载 链接 初始化)

JVM 心得分享(加载 链接 初始化)

Java虚拟机(JVM)是Java语言的核心且重要的组成部分,了解JVM的加载、链接、初始化过程,对于Java程序员来说也是至关重要的。本文将对JVM的加载、链接、初始化过程进行详细讲解,并提供两个示例说明。

加载

在JVM运行Java程序时,需要在内存中加载所需的Java类文件,也就是将代码装载到内存中执行。JVM的类加载器可以分为三类:

  1. 启动类加载器(Bootstrap Class Loader):该加载器使用C++编写,并不是Java类,其负责在JVM启动时加载核心类库和JVM初始化操作。
  2. 扩展类加载器(Extension Class Loader):该加载器负责加载扩展类路径(JAVA_HOME/lib/ext目录)下的类库。
  3. 应用程序类加载器(Application Class Loader):该加载器负责加载应用程序的类路径(CLASSPATH)下的类库。

类加载器按照委托机制进行加载,即父加载器代理子加载器进行加载,在子加载器找不到类的情况下才由父加载器进行加载。

链接

类在加载到内存中之后,还需要进行链接,其中包括三个步骤:

验证

在验证阶段,JVM会检查类文件的正确性和安全性,查看是否符合JVM规范,在验证成功之后才能被加载执行。

准备

在准备阶段,JVM会为类变量(static变量)分配内存并设置初始值(0或null)。在该阶段,还不会执行初始化器中的代码。

解析

在解析阶段,JVM会将类中的符号引用转化为直接引用,即将类中的常量池中的符号引用替换为直接指向内存地址的引用。

初始化

在类加载和链接完成后,就会进入初始化阶段,也是类的生命周期中的最后一个阶段,在该阶段会为类变量赋值并执行初始化器中的代码。类的初始化顺序遵循类的继承关系,先初始化父类,然后再初始化子类。

下面,我们通过两个示例来更好地理解JVM的加载、链接、初始化过程:

示例一

public class InitializationDemo1 {
    static {
        i = 2;
//        System.out.println(i); // 非法的前向引用
    }
    static int i = 1;
    public static void main(String[] args) {
        System.out.println(InitializationDemo1.i);
    }
}

该程序输出结果为1,原因是在静态初始化块中后定义的变量i,故i=1,而非静态初始化块中定义的i=2。若将注释取消,程序会编译失败,提示非法的前向引用,这是因为i定义在静态初始化块之后,尚未声明。

示例二

public class InitializationDemo2 {
    public static void main(String[] args) {
        System.out.println(Base.value);
    }
}
class Base {
    static {
        System.out.println("Base 静态初始化块");
    }
    static int value = 123;
}
class Sub extends Base {
    static {
        System.out.println("Sub 静态初始化块");
    }
}

该程序的输出结果为“Base 静态初始化块”和“123”(Sub类没有被加载初始化)。这是因为执行到主函数所在的类时,虚拟机会初始化类的静态属性,触发Base类的初始化。类的初始化是按需进行的,只有首次实例化或对类的静态成员变量进行访问时才会触发。

以上就是JVM加载、链接、初始化的完整攻略。了解JVM的类加载机制、堆、栈等知识,有利于我们编写高效并可靠的Java程序。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JVM 心得分享(加载 链接 初始化) - Python技术站

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

相关文章

  • 360N7怎么开启开发者选项?360手机N7开启开发者选项教程

    下面是360手机N7开启开发者选项的完整攻略,包含详细的步骤和示例说明。 1. 打开手机设置 第一步,打开360N7手机的“设置”应用。可以在桌面或者应用列表中找到。 2. 找到手机版本号 在设置页面中,向下滑动,找到“关于手机”或者类似的选项,点击进入。 在“关于手机”页面中,可以找到“版本号”的选项,点击进入。 3. 点击多次版本号 在“版本号”页面中,…

    other 2023年6月26日
    00
  • linux系统下hosts文件详解及配置

    下面就为您详细讲解 “Linux系统下hosts文件详解及配置”的完整攻略: 什么是hosts文件? hosts是一种用于指定域名到IP地址之间对应关系的计算机文件。当我们在浏览器中访问一个网站时,浏览器首先会查询hosts文件以获取网站对应的IP地址,然后再去访问这个IP地址。在Linux系统中,hosts文件的位置通常位于/etc/hosts。 host…

    other 2023年6月27日
    00
  • IE10浏览器无法记住网站的登陆账号和密码的解决方法

    解决IE10浏览器无法记住网站的登陆账号和密码的方法有以下几步: 步骤一:检查IE10浏览器的设置 打开IE10浏览器,点击右上角的齿轮图标,选择Internet选项; 在弹出的Internet选项窗口中,选择“内容”选项卡,并点击“自动完成设置”按钮; 确认选中“用户名和密码在表单中填写”和“为我保存密码”两个选项,并点击“确定”按钮; 关闭所有IE10浏…

    other 2023年6月27日
    00
  • 微信小程序如何像vue一样在动态绑定类名

    在微信小程序中,可以使用类似于Vue.js的动态绑定类名的方式来渲染样式。下面,我将详细讲解如何在微信小程序中实现这个功能,并提供两个示例说明。 步骤一:在标签中使用动态类名 首先,在小程序的 wxml 中,在需要绑定类名的标签内部使用 class 属性。然后,使用{}包裹一个JavaScript 表达式来动态渲染类名。 例如,在下面的 wxml 中,我们动…

    other 2023年6月27日
    00
  • Java使用HttpClient实现文件下载

    下面是使用HttpClient实现文件下载的完整攻略,我将详细讲解该过程并提供两个示例说明。 简介 HttpClient是Apache软件基金会下的一个开源HTTP客户端库,它支持Http/Https协议,并具有稳定、高效、易用的特点。本文将介绍如何使用HttpClient来实现文件下载。 下载依赖 我们需要在项目中引入HttpClient的依赖,该依赖在M…

    other 2023年6月27日
    00
  • MySQL变量原理及应用实例

    MySQL变量原理及应用实例攻略 MySQL变量是一种用于存储和操作数据的特殊类型。它们可以在MySQL查询中使用,并且可以存储各种数据类型,如整数、字符串和日期。在本攻略中,我们将详细讲解MySQL变量的原理以及如何在实际应用中使用它们。 1. MySQL变量的原理 MySQL变量是在会话级别中定义和使用的。这意味着变量只在当前会话中可见,并且在会话结束后…

    other 2023年7月29日
    00
  • 如何查找YUM安装的JAVA_HOME环境变量详解

    在Linux系统中,我们可以使用YUM包管理器来安装Java环境。在安装完成后,我们需要查找JAVA_HOME环境变量的路径,以便在其他应用程序中使用Java环境。本文将介绍如何查找YUM安装的JAVA_HOME环境变量的完整攻略,包括查找方法、示例说明和常见问题解决方法。 1. 查找YUM安装的JAVA_HOME环境变量 在Linux系统中,我们可以使用w…

    other 2023年5月5日
    00
  • CSS标签居中

    CSS标签居中 CSS作为前端开发的基础技术之一,在页面布局方面有着重要的作用。而标签居中则是CSS布局中经常用到的一种方法。本文将介绍几种常见的CSS标签居中的方法。 水平居中 文字水平居中 对于单行文字而言,可以使用以下两种方式实现水平居中。 text-align div { text-align: center; } 将包含文本的元素的text-ali…

    其他 2023年3月28日
    00
合作推广
合作推广
分享本页
返回顶部