JVM中类的加载机制是怎样的?
- 内容介绍
- 文章标签
- 相关推荐
本文共计1529个文字,预计阅读时间需要7分钟。
每日一句:人到了情境多,而真正的不多情。每日一句:The frog in the well knows nothing of the great ocean. 井底之蛙,不知大海。JVM的类加载阶段:JVM的类加载分为五个阶段:1. 加载:被虚拟机加载到内存中,称为字节码。
每日一句人到情多情转薄,而今真个不多情。
每日一句The frog in the well knows nothing of the great ocean.
井底之蛙,不知大海。
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不会执行类的初始化流程:
1.常量在编译时会将其常量值存入使用该常量的类的常量池中,该过程不需要调用常量所在的类,因此,不会触发该常量类的初始化。
2.在子类引用父类的静态字段时,不会触发子类的初始化,只会触发父类的初始化。
3.定义对象数组,不会触发父类的初始化
4.在使用类名获取Class对象时不会触发类的初始化
5.在使用Class.forName加载指定的类时,可以通过initialize参数设置是否需要对类进行初始化
6.在使用ClassLoader默认的loadClass方法加载类时不会触发该类的初始化。
美文佳句很多时候,事情的困境,常常是因为我们自己钻了牛角尖,此时,你需要做的就是改变。
完美主义者可以放下执念,允许自己有普通人都会犯的小迷糊;职场妈妈可以直面现实,一个人永远做不到家庭和事业的双百分;承担了过多工作任务的员工,可以尝试向上级反映,寻求资源或调整目标……这些,都是我们应当并可以作出的改变。
正如这句话所说:世界上从来都没有所谓的奇迹,命运一直都掌握在我们自己手里。想要改变自己的命运,最重要的就是改变自己。当你开始改变自己的时候,很多东西就跟着改变了。
下一次,当烦恼降临时,不妨试试从自身找找问题。调整努力的方向和节奏,学会给心灵松绑,你会发现:很多事,其实没什么大不了。
面试题 SpringMVC 框架有什么用?Spring Web MVC 框架提供”模型-视图-控制器”( Model-View-Controller )架构和随时可用的组件,用于开发灵活且松散耦合的 Web 应用程序。
MVC 模式有助于分离应用程序的不同方面,如输入逻辑,业务逻辑和 UI 逻辑,同时在所有这些元素之间提供松散耦合。
@RestController 注解,在 @Controller 基础上,增加了 @ResponseBody 注解,更加适合目前前后端分离的架构下,提供 Restful API ,返回例如 JSON 数据格式。当然,返回什么样的数据格式,根据客户端的 "ACCEPT" 请求头来决定。
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
本文共计1529个文字,预计阅读时间需要7分钟。
每日一句:人到了情境多,而真正的不多情。每日一句:The frog in the well knows nothing of the great ocean. 井底之蛙,不知大海。JVM的类加载阶段:JVM的类加载分为五个阶段:1. 加载:被虚拟机加载到内存中,称为字节码。
每日一句人到情多情转薄,而今真个不多情。
每日一句The frog in the well knows nothing of the great ocean.
井底之蛙,不知大海。
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不会执行类的初始化流程:
1.常量在编译时会将其常量值存入使用该常量的类的常量池中,该过程不需要调用常量所在的类,因此,不会触发该常量类的初始化。
2.在子类引用父类的静态字段时,不会触发子类的初始化,只会触发父类的初始化。
3.定义对象数组,不会触发父类的初始化
4.在使用类名获取Class对象时不会触发类的初始化
5.在使用Class.forName加载指定的类时,可以通过initialize参数设置是否需要对类进行初始化
6.在使用ClassLoader默认的loadClass方法加载类时不会触发该类的初始化。
美文佳句很多时候,事情的困境,常常是因为我们自己钻了牛角尖,此时,你需要做的就是改变。
完美主义者可以放下执念,允许自己有普通人都会犯的小迷糊;职场妈妈可以直面现实,一个人永远做不到家庭和事业的双百分;承担了过多工作任务的员工,可以尝试向上级反映,寻求资源或调整目标……这些,都是我们应当并可以作出的改变。
正如这句话所说:世界上从来都没有所谓的奇迹,命运一直都掌握在我们自己手里。想要改变自己的命运,最重要的就是改变自己。当你开始改变自己的时候,很多东西就跟着改变了。
下一次,当烦恼降临时,不妨试试从自身找找问题。调整努力的方向和节奏,学会给心灵松绑,你会发现:很多事,其实没什么大不了。
面试题 SpringMVC 框架有什么用?Spring Web MVC 框架提供”模型-视图-控制器”( Model-View-Controller )架构和随时可用的组件,用于开发灵活且松散耦合的 Web 应用程序。
MVC 模式有助于分离应用程序的不同方面,如输入逻辑,业务逻辑和 UI 逻辑,同时在所有这些元素之间提供松散耦合。
@RestController 注解,在 @Controller 基础上,增加了 @ResponseBody 注解,更加适合目前前后端分离的架构下,提供 Restful API ,返回例如 JSON 数据格式。当然,返回什么样的数据格式,根据客户端的 "ACCEPT" 请求头来决定。
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

