关于后端:JVM的类加载过程

3次阅读

共计 2546 个字符,预计需要花费 7 分钟才能阅读完成。

每日一句

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

每日一句

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 会将常量池中的符号援用替换为间接援用。

初始化

次要通过执行类结构器的 <client> 办法为类进行初始化。
<client> 办法是在编译阶段由编译器主动收集类中动态语句和变量的赋值操作组成的。JVM 规定,只有在父类的 <client> 办法都执行胜利后,子类中的 <client> 办法才能够被执行。
在一个类中既没有动态变量赋值操作也没有动态语句块时,编译器不会为该类生成 <client> 办法。

在产生以下几种状况时,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

正文完
 0