赢卡购网站建设,无锡网站制作启,花店网站建设课程设计,wordpress照片评选Java中的所有类#xff0c;都需要由类加载器装载到JVM中才能运行。类加载器本身也是一个类#xff0c;而它的工作就是把class文件从硬盘读取到内存中。
在写程序的时候#xff0c;我们几乎不需要关心类的加载#xff0c;因为这些都是隐式装载的#xff0c;除非我们有特殊…Java中的所有类都需要由类加载器装载到JVM中才能运行。类加载器本身也是一个类而它的工作就是把class文件从硬盘读取到内存中。
在写程序的时候我们几乎不需要关心类的加载因为这些都是隐式装载的除非我们有特殊的用法像是反射就需要显式的加载所需要的类。
类装载方式有两种
隐式装载 程序在运行过程中当碰到通过new 等方式生成对象时隐式调用类装载器加载对应的类到jvm中显式装载 通过class.forname()等方法显式加载需要的类
Java类的加载是动态的它并不会一次性将所有类全部加载后再运行而是保证程序运行的基础类(像是基类)完全加载到jvm中至于其他类则在需要的时候才加载。这当然就是为了节省内存销。
JVM 类加载机制分为五个部分加载验证准备解析初始化下面我们就分别来看一下这五个过程 一、加载 加载是类加载过程中的一个阶段 这个阶段会在内存中生成一个代表这个类的 java.lang.Class 对象作为方法区这个类的各种数据的入口。注意这里不一定非得要从一个 Class 文件获取这里既可以从ZIP 包中读取比如从 jar 包和 war 包中读取也可以在运行时计算生成动态代理也可以由其它文件生成比如将 JSP 文件转换成对应的 Class 类。
二、验证 这一阶段的主要目的是为了确保 Class 文件的字节流中包含的信息是否符合当前虚拟机的要求并且不会危害虚拟机自身的安全。
三、准备 准备阶段是正式为类变量分配内存并设置类变量的初始值阶段即在方法区中分配这些变量所使用的内存空间。
四、解析 解析阶段是指虚拟机将常量池中的符号引用替换为直接引用的过程。符号引用就是 class 文件中的 1. CONSTANT_Class_info 2. CONSTANT_Field_info 3. CONSTANT_Method_info 等类型的常量。符号引用 符号引用与虚拟机实现的布局无关 引用的目标并不一定要已经加载到内存中。 各种虚拟机实现的内存布局可以各不相同但是它们能接受的符号引用必须是一致的因为符号引用的字面量形式明确定义在Java 虚拟机规范的 Class 文件格式中。直接引用 直接引用可以是指向目标的指针相对偏移量或是一个能间接定位到目标的句柄。如果有了直接引用那引用的目标必定已经在内存中存在。
五、初始化 初始化阶段是类加载最后一个阶段前面的类加载阶段之后除了在加载阶段可以自定义类加载器以外其它操作都由 JVM 主导。到了初始阶段才开始真正执行类中定义的 Java 程序代码。