IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 系统运维 -> 【JVM】类初始化机制 -> 正文阅读

[系统运维]【JVM】类初始化机制

一个类从准备加载到虚拟机的内存中,到从虚拟机中内存卸载这样的一个生命周期中,有以下几个过程:加载 -> 验证 -> 准备 -> 解析 -> 初始化 -> 使用 ->卸载。

在《JVM虚拟机规范》中,并没有对加载的时机做严格控制,但是对初始化的时机做了严格的控制。在六种情况下,虚拟机必须对一个类做初始化操作。

其中有一种情况是:如果读取或者写入一个静态资源,那么这个静态资源所在的类应该被提前加载。

但存在一些边界条件在这类情况中:

  1. 一个子类继承了父类,那么也可以通过子类去读取父类的静态资源,此时子类不会被初始化。
  2. 静态资源被final修饰,此时这个类不会被初始化。

第一类情况:

public class ParentClass {

    static {
        System.out.println("I am father");
    }

    public void test() {
        System.out.println("Father tesst");
    }

    public static int value = 127;
}


--------

public class SubClass extends ParentClass{

    static {
        System.out.println("I am sub");
    }

}
--------

public class TestMain {
    public TestMain() {
    }

    public static void main(String[] argv) {
        System.out.println(SubClass.value);
    }
}

我们认为一个类被加载入虚拟机中,他首先会执行这个类中的静态方法。那么我们可以通过观察一个类的静态方法有没有被执行来判断这个类有没有被初始化。

按照示例代码运行主函数,发现输出结果为

I am father
127

子类没有被初始化,我们认为如果子类没有覆盖父类的值,那么这个静态资源应该归属父类。

第二种情况,我们将静态资源 value 用final修饰

public static final int value = 127;

重新运行代码,发现输出结果中少了静态方法执行的输出

127

查看主函数所在的编译文件

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by FernFlower decompiler)
//

public class TestMain {
    public TestMain() {
    }

    public static void main(String[] argv) {
        System.out.println(127);
    }
}

发现直接被127这个值所代替,所以我猜测是常量池资源不属于类的资源,是在编译阶段就被优化了,所以不涉及到加载类静态资源的问题。

  系统运维 最新文章
配置小型公司网络WLAN基本业务(AC通过三层
如何在交付运维过程中建立风险底线意识,提
快速传输大文件,怎么通过网络传大文件给对
从游戏服务端角度分析移动同步(状态同步)
MySQL使用MyCat实现分库分表
如何用DWDM射频光纤技术实现200公里外的站点
国内顺畅下载k8s.gcr.io的镜像
自动化测试appium
ctfshow ssrf
Linux操作系统学习之实用指令(Centos7/8均
上一篇文章      下一篇文章      查看所有文章
加:2021-08-02 11:10:24  更:2021-08-02 11:10:42 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/5 6:50:13-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码