每日一句

人到情多情转薄,而今真个不多情。

每日一句

The frog in the well knows nothing of the great ocean.

井底之蛙,不知大海。

JVM 的类加载阶段

JVM 的类加载分为五个阶段:

1. 加载:被虚拟机读入内存

2. 验证:验证 Class 字节流的数据是否遵守JVM的规定

3. 准备:正式为类变量(静态变量)分配内存并设置初始值,并非代码中设置的值

4. 解析:将常量池中的符号引用解析为直接引用

5. 初始化:真正执行类中定义的java代码

加载

指 JVM 读取 class 文件,并且根据 Class 文件描述创建 java.lang.Class 对象的过程。

类加载过程主要包含将 Class 文件读取到运行时区域的方法区内,在堆中创建 java.lang.Class 对象,并封装类在方法区的数据结构的过程。

在读取 Class 文件是既可以通过文件的形式读取,也可以通过 jar 包、war 包读取,还可以通过代理自动生成 Class或其他方式读取

验证

主要用于确保 Class 文件符合当前虚拟机的要求,保障虚拟机自身的安全,只有通过验证的 CLass 文件才能被 JVM 加载

准备

主要工作是在方法区中为类变量分配内存空间并设置类中变量的初始值。

初始值指不同数据类型的默认值,这里需要注意 final 类型的变量和非final类型的变量在准备阶段的数据初始化过程不同

例如一个成员变量定义如下:

public static long value = 1000;

在以上代码中,静态变量 value 在准备阶段的初始值是0,将 value 设置为 1000 的动作是在对象初始化时完成的,因为 JVM 在编译阶段会将静态变量的初始化操作定义在构造器中。

public static final int value = 1000;

则JVM在编译阶段后会为final类型的变量value生成其对应的ConstantValue属性,虚拟机在准备阶段会根据ConstantValue属性将value赋值为1000。

总结:静态变量会赋两次初值,准备阶段赋零值,初始化时赋用户设定值,而final变量会在准备阶段一次性赋值完毕

解析

JVM 会将常量池中的符号引用替换为直接引用。

初始化

主要通过执行类构造器的  方法为类进行初始化。

 方法是在编译阶段由编译器自动收集类中静态语句和变量的赋值操作组成的。JVM规定,只有在父类的  方法都执行成功后,子类中的  方法才可以被执行。

在一个类中既没有静态变量赋值操作也没有静态语句块时,编译器不会为该类生成  方法。

在发生以下几种情况时,JVM不会执行类的初始化流程:

1. 常量在编译时会将其常量值存入使用该常量的类的常量池中,该过程不需要调用常量所在的类,因此,不会触发该常量类的初始化。

2. 在子类引用父类的静态字段时,不会触发子类的初始化,只会触发父类的初始化。

3. 定义对象数组,不会触发父类的初始化

4. 在使用类名获取 Class 对象时不会触发类的初始化

5. 在使用 Class.forName 加载指定的类时,可以通过 initialize 参数设置是否需要对类进行初始化

6. 在使用ClassLoader默认的loadClass方法加载类时不会触发该类的初始化。

美文佳句

很多时候,事情的困境,常常是因为我们自己钻了牛角尖,此时,你需要做的就是改变。

完美主义者可以放下执念,允许自己有普通人都会犯的小迷糊;职场妈妈可以直面现实,一个人永远做不到家庭和事业的双百分;承担了过多工作任务的员工,可以尝试向上级反映,寻求资源或调整目标……这些,都是我们应当并可以作出的改变。

正如这句话所说:世界上从来都没有所谓的奇迹,命运一直都掌握在我们自己手里。想要改变自己的命运,最重要的就是改变自己。当你开始改变自己的时候,很多东西就跟着改变了。

下一次,当烦恼降临时,不妨试试从自身找找问题。调整努力的方向和节奏,学会给心灵松绑,你会发现:很多事,其实没什么大不了。

面试题

SpringMVC 框架有什么用?

Spring Web MVC 框架提供”模型-视图-控制器”( Model-View-Controller )架构和随时可用的组件,用于开发灵活且松散耦合的 Web 应用程序。

MVC 模式有助于分离应用程序的不同方面,如输入逻辑,业务逻辑和 UI 逻辑,同时在所有这些元素之间提供松散耦合。

@RestController 和 @Controller 有什么区别?

@RestController 注解,在 @Controller 基础上,增加了 @ResponseBody 注解,更加适合目前前后端分离的架构下,提供 Restful API ,返回例如 JSON 数据格式。当然,返回什么样的数据格式,根据客户端的 "ACCEPT" 请求头来决定。

SpringMVC工作原理?

1. 客户端发送请求到前端控制器 DispatcherServlet
2. DispatcherServlet 收到请求后,调用 HandlerMapping 处理器映射器,请求获取 handler
3. 处理器映射器根据 url 找到具体的处理器,生成处理器对象以及处理器拦截器(如果有则生成)一并返回给 DispatcherServlet
4. DispatcherServlet 调用 HandlerAdapter 处理器适配器
5. HandlerAdapter 经过适配器调用 具体处理器(Handler,也叫后端控制器)
6. Handler 执行完成返回 ModelAndView
7. HandlerAdaper 将 Handler 执行结果 ModelAndView 返回给 DispatcherServlet
8. DispatcherServlet 将 ModelAndView 传给 ViewResolver 视图解析器 进行解析
9. ViewResolver 解析后返回具体 View
10. DispatcherServlet 对 view 进行 渲染视图(即将模型数据填充至视图中)
11. DispatcherServlet 响应用户

你好,我是yltrcc,日常分享技术点滴,欢迎关注我:ylcoder

JVM的类加载过程的更多相关文章

  1. JVM的类加载过程以及双亲委派模型详解

    JVM的类加载过程以及双亲委派模型详解 这篇文章主要介绍了JVM的类加载过程以及双亲委派模型详解,类加载器就是根据指定全限定名称将 class 文件加载到 JVM 内存,然后再转化为 class 对象 ...

  2. 类文件的结构、JVM 的类加载过程、类加载机制、类加载器、双亲委派模型

    一.类文件的结构 我们都知道,各种不同平台的虚拟机,都支持 "字节码 Byte Code" 这种程序存储格式,这构成了 Java 平台无关性的基石.甚至现在平台无关性也开始演变出 ...

  3. JVM虚拟机 类加载过程与类加载器

    目录 前言 类的生命周期 类加载过程 加载 连接 验证 准备 解析 初始化 类加载器 三大类加载器 双亲委派模型 概念 为什么要使用双亲委派模型 源码分析 反双亲委派模型 参考 前言 类装载器子系统是 ...

  4. JVM之类加载过程

    # 类的生命周期 1. 加载 loading2. 验证 verification3. 准备 preparation4. 解析 resoluation5. 初始化 initialization6. 使用 ...

  5. java jvm虚拟机类加载过程

    加载 在加载阶段, 虚拟机需要完成以下3件事情:1) 通过一个类的全限定名来获取定义此类的二进制字节流.2) 将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构.3) 在内存中生成一个代表这 ...

  6. 每日一问:讲讲 JVM 的类加载机制

    前面给大家讲解了 Java 虚拟的内存结构 以及 Java 虚拟机的垃圾回收机制,我们更加明白了 Java 的内存管理机制,今天我们来讲讲 Java 虚拟机的另外一个高频考点:类加载机制. JVM 的 ...

  7. JVM类加载过程学习总结

    JVM类加载过程学习总结 先不说JVM类加载的原理,先看实例: NormalTest类,包含了一个静态代码块,执行的任务就是打印一句话. /** * 在正常类加载条件下,看静态代码块是否会执行 * @ ...

  8. jvm学习002 虚拟机类加载过程以及主动引用和被动引用

    虚拟机把描述类的数据从class文件加载到内存,并对数据进行校验,转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制. 类从被加载到虚拟机内存中开始,到卸载出内存为 ...

  9. 【深入Java虚拟机】一 JVM类加载过程

    首先Throws(抛出)几个自己学习过程中一直疑惑的问题: 1.什么是类加载?什么时候进行类加载? 2.什么是类初始化?什么时候进行类初始化? 3.什么时候会为变量分配内存? 4.什么时候会为变量赋默 ...

随机推荐

  1. background-clip 和 background-origin

    下面都是我自己的理解, 如果有不对的地方, 还请大家帮忙指出.下面是在 chrome 浏览器上测试的 background-clip 和 background-origin 先说说background ...

  2. 制作html5微信页面的经验总结。

    先罗列一下我遇到的问题: 用户可选择图片上传,但是图片比较大(基本都是2M以上),而且还得异步上传. 由于操作上比较多的设计都是隐性的例如滑动之类,需要手势动画作提示. 块内元素滚动时不流畅,或不能滚 ...

  3. Spark入门之idea编写Scala脚本

    一.安装Scala插件 1.File->Settings 2.Plugins->Msrketplace->搜索Scala并安装 (或者自己下载合适的scala版本,教程:自己给ide ...

  4. java对象有什么重要的?

    3.历史上讲,对象有什么重要的?  [新手可忽略不影响继续学习]早期的编程主要是面向过程的编程,处理的问题都相对的简单,比较过程化,换句话说,就是一步一步从开始到结束,比如第一步进入电梯,第二步关门, ...

  5. java中的排序除了冒泡以来, 再给出一种方法, 举例说明

    9.5 排序:   有一种排序的方法,非常好理解,详见本题的步骤,先找出最大值和最小值,把最小值打印出来后,把它存在另一个数组b当中,再删除此最小值,之后再来一次找出最小值,打印出最小值以后,再把它存 ...

  6. 解决 Tomcat 控制台输出乱码(Tomcat Localhost Log / Tomcat Catalina Log 乱码)

    1. 按下图修改 先找到你的 Tomcat 安装目录,然后进入conf文件夹,找到 logging.properties,并打开它,然后把所有 UTF-8 格式的编码改成 GBK即可,具体操作如下图

  7. Problem N: 输出回字形

    这个题如果用for循环直接做的话恐怕得做上几个小时吧,加上一点小技巧,用坐标法来写这个题.就像下面这样: 坐标原点不在矩形的角上,而在矩形的中心处,这只是算是一个技巧,理解起来好理解而已.

  8. 2022.02.21 SA

    2022.02.21 SA 当我年少轻狂时,我曾拥有自由,但我并不明白它的意义.我曾拥有时间,但我没有意识到它的珍贵.我曾拥有爱,但我从未用心去体会.数十年的时间考验后,我终于理解了三者的真谛. 我已 ...

  9. 2021.12.06 P2501 [HAOI2006]数字序列(动态规划+LIS)

    2021.12.06 P2501 [HAOI2006]数字序列(动态规划+LIS) https://www.luogu.com.cn/problem/P2501 题意: 现在我们有一个长度为 n 的整 ...

  10. 2021.08.01 P4359 伪光滑数(二叉堆)

    2021.08.01 P4359 伪光滑数(二叉堆) [P4359 CQOI2016]伪光滑数 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 题意: 若一个大于 11 的整数 MM ...