前言:

最近在看一本《深入理解java虚拟机》的书,在学类加载机制和结合众多大佬的表达并结合自己的理解写下这一篇博客,记录自己的困惑,以防以后忘记。

阅读须知:

此次博客以启发性代码和解释进行学习。在阅读时,按照代码和提示进行思考分析为什么,请思考过后在看答案来验证自己的思考。(此博客为个人观点且本人水平有限,如有错,请批评指正)

小题测试:(先思考,并写出自己的答案后在往下看)

package com.wen.demo.test.MyClass;class Singlen{private static Singlen singlen= new Singlen();static int count1;static int count2=0;public Singlen(){count1++;count2++;}public static Singlen getInstance(){return Singlen.singlen;}
}
public class MyClass {public static void main(String[] args) {Singlen singlen= Singlen.getInstance();System.out.println("count1的值为:"+Singlen.count1);System.out.println("count2的值为:"+Singlen.count2);}
}

对于以上代码,请先思考,输出的是什么。然后才往下面看。

概念:

我们在学java时都有接触过,运行java程序之前,会将我们写的*.java文件编译成.class文件。但是好像我们在学的时候,老师或许就讲了这个,然后就没然后了。

我们先看看这个张图:

基本上是分为这7份阶段,此次只讲讲前5个阶段。其中验证——准备——解析通常称为一个连接阶段

加载阶段:

在此阶段,虚拟机需要完成三件事情:

(1)通过一个类的全限定名来获取定义此类的二进制字节流

(2)将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构

(3)在内存中生成代表这个类的java.lang.Class对象,作为方法区这个类的各种数据的访问入口

(以上来自《深入理解java虚拟机》书上内容)

上面的解释已经很清楚了,如果你还是不能理解,先看接下来这个 简化版:

在加载的时候,虚拟机查找我们写的.java文件,编译成字节码后加载到内存里,然后在内存中生成一个java.lang.Class对象,作为方法区这个类的各种数据的访问入口。

嗯,好像还是有点长,在简单点就是查找并加载类的二进制数据到内存中。

验证阶段:

验证是连接阶段的第一步,他主要是确保Class文件的字节流中的信息符合虚拟机的要求,并且不会危害虚拟机的自身的安全。为什么要验证,不都是我们写的编译来的吗?假设虚拟机不验证字节流文件,那样放一些恶意恶意的字节流,那感觉会“灰常”开心些吧!~

准备阶段:

这一阶段,主要是为类的静态变量分配内存,并将其初始化为默认值。例如:

public static int value =123;

上面这个静态变量,在准备阶段:

将value值初始化为0而不是123

将value值初始化为0而不是123

将value值初始化为0而不是123

当然,这是通常情况下,想想女生每个月总有那么几天,所以我们java虚拟机也要有那么几天的特殊情况嘛,。怎么特殊呢?

public static final int value =123;

加一个final关键字后,这个value就是个常量了。常量在编译阶段就会存入调用类的常量池中,所以在这个准备阶段时,java虚拟机就会将value赋值了。

解析阶段:

解析阶段是指虚拟机将常量池中的符号引用替换为直接引用的过程(这里我也不是特别懂,太多东西了,看的脑阔疼)想要深入了解请去阅读《深入理解java虚拟机》第7章220页

初始化阶段:

这一步是类加载过程中的最后一步了,前面的类加载中除了用户应用程序可用通过自定义类加载器参与外,其他都是有JVM主导和控制的,到这一个阶段才是真正懂得执行类中定义的java程序代码。

比如:我们在准备阶段的时候,已经为变量初始化了一次(此初始化不是现在这个初始化)这时,虚拟机要为类的静态变量赋予的初始化值(就是我们写的代码定义的值value=123啦)

注:此次不涉及类的初始化,那样介绍太多了。持续懒惰中~!

看完上面的,在想想自己的之前写的答案,下面我们将公布答案:

Why?怀疑人生了?还是高兴我作对了。如果做错的同学,请再看一次5个阶段理解一下。

流程简单解析:

我们在调用时单例时new 实例属于主动使用(首次使用才有效,具体下一篇博客介绍)。这时类开始初始化,类的加载顺序是从上往下的。初始化了Singlen类,count1和count2都已经加了1是吧~!类的加载顺序是从上往下的,这时count1是1,count2也是1。接下来走count1,再走count2了。

由于count1没有被赋值,可以理解为我们程序猿给他赋了值:

    static int count1  = 1;

count2被我们自己赋值过了是不是?那么虚拟机在会将0赋值给count2。这时count2就是0了。所以结果就是1和0咯

总结:

没想到,这篇博文我会写了快3小时了。但是,也是收获满满滴。java虚拟机部分是基础,对于我们来说是必须去学的,只有懂了,我们才会学会去优化,才能走的更远。谢谢大家,注大家学习进步,工作愉快~!

程序人生,与君共勉~!

聊聊JVM——类的加载(一)相关推荐

  1. JVM——类的加载过程

    附一张图方便理解,一个类的执行过程 类的加载过程,简明的来说 类装饰器就是寻找类的字节码文件并构造出类在JVM内部表示的对象组件.在Java中,类装载器把一个类装入JVM中,要经过以下步骤: 装载:查 ...

  2. JVM:类的加载过程

    文章目录 类的生命周期 一.加载 二.连接 1.验证 2.准备 3.解析 三.初始化 四.卸载 类的生命周期 一个类的完整生命周期如下: Class 文件需要加载到虚拟机中之后才能运行和使用,那么虚拟 ...

  3. 从JVM看类的加载过程与对象实例化过程

    一. 类的加载过程 1. 类的加载过程大致是个什么过程? 我们编写产生.java文件,这些.java文件经过Java编译器编译成拓展名为.class的文件,.class文件中保存着Java代码经转换后 ...

  4. JVM学习笔记之-类加载子系统,类的加载与类的加载过程,双亲委派机制

    一 类加载器与类加载过程 类加载子系统作用 类加载器子系统负责从文件系统或者网络中加载class文件,class文件在文件开头有特定的文件标识. ClassLoader只负责class文件的加载,至于 ...

  5. jvm系列(一):java类的加载机制

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

  6. jvm对类的加载、链接、初始化

    package com.jmdf.redis.project;/*** 对于静态字段,只有直接定义了该字段的类才会被初始化* 当一个子类初始化时要求其全部父类已经初始化完毕.* -XX:+TraceC ...

  7. JVM简笔—类的加载

    什么是JVM? JVM基本概念 JVM是Java虚拟机(Java Virtual Machine)的缩写,是java运行环境的一部分 是可运行java代码的假想计算机,包括一套字节码指令集(用来解释字 ...

  8. Java必突-JVM知识专题(一): Java代码是如何跑起来的+类加载到使用的过程+类从加载到使用核心阶段(类初始化)+类加载的层级结构+什么是JVM的内存区域划分?Java虚拟机栈、Java堆内存

    前言: 该章节知识点梳理:本文主要是入门和了解jvm,不做深入 1.Java代码是如何运行起来的? 2.类加载到使用的过程? 3.验证准备和初始化的过程? 4.类从加载到使用核心阶段:初始化.类加载器 ...

  9. 尚硅谷2020最新版宋红康JVM教程-中篇-第3章类的加载过程(类的生命周期)详解-4-过程三:Initialization(初始化)阶段

    static与final的搭配问题 初始化阶段,简言之,为类的静态变量赋予正确的初始值. 具体描述 类的初始化是类装载的最后一个阶段.如果前面的步骤都没有问题,那么表示类可以顺利装载到系统中.此时,类 ...

  10. java虚拟机预先加载哪些类_Java虚拟机JVM学习02 类的加载概述

    Java虚拟机JVM学习02 类的加载概述 类的加载 类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个java.lang.Class对 ...

最新文章

  1. SOCKET用法详解
  2. Node学习9-gulp
  3. Java Native Interface 六JNI中的异常
  4. C语言自定义实现string字符串的算法(附完整源码)
  5. POJ 3133 Manhattan Wiring (插头DP)
  6. java json 易用_Java中 Json的使用
  7. Markdown: Basics (快速入门)
  8. 【转载】如何使用docker部署c/c++程序
  9. python调用C语言ctypes详解
  10. Vuex之store仓库计算属性Getter
  11. 如何快速转载网页博客
  12. 20220601超简单百度地图街景图片爬取+绿视率计算
  13. RecycleView的 Scrapped or attached views may not be recycled错误原因研究
  14. Linux 下 TC 命令原理及详解<一>
  15. 美颜特效、黑白照片上色、AI人像动漫化,达摩院的学习营来了!
  16. 性能优化之Apk瘦身
  17. CIFAR彩色图像分类数据集
  18. 自己的坟被人挖了怎么办,今天是一个时间限制
  19. postgres use
  20. Java商城面试题(三)

热门文章

  1. 免费又好用怎么把文字转换成语音呢?分享我常用的3个配音神器
  2. java计算机毕业设计辅导员班级量化管理系统源码+mysql数据库+系统+lw文档+部署
  3. Twaver-HTML5基础学习(18)数据容器(1)_增删查改、遍历数据容器、包含网元判断
  4. java事务是什么_在java中,事务是什么?
  5. IDM2018年最新版破解方法
  6. 怎样查看谁发的qq坦白说
  7. 网页设计大作业-五子棋游戏,可以进行双人对弈
  8. win7计算机事件查看器,win7事件查看器是什么,事件查看器概述
  9. 计算机开机错误0xc0000428,启动时出现错误码0xc0000428如何解决?
  10. QTcpSocket目录文件传输