<div class="iteye-blog-content-contain" style="font-size: 14px"></div>
我们都知道Java程序最终都是以class文件的表现形式,其中这些class文件都要被加载到JVM之后才能改被执行和使用。但是对于JVM是如何去加载这些Class文件?以及Class文件被加载到JVM中之后会发生什么变化?下面来做个简单的对于JVM类加载的浅析。
JVM把class文件加载到内存中,并要经过一些特定的操作过程才能被JVM所认可,首先要对数据进行校验、转换解析,初始化等过程,最终才能被JVM直接所使用。这就是JVM的类加载机制。下面是类加载的几个过程图,根据图能更加直观的了解加载过程。
下面来具体说说以上各个阶段所做的具体事情。
1. 加载阶段
1) 通过类的权限定名称获取此类的二进制字节流
2) 将这个字节流转所代表的静态存储结构转换成JVM中方法区运行时数据
3) 在Java堆中生成一个代表此类的Class对象,主要是作为方法区数据的访问入口
实际上仅仅根据上面三点的描述还是比较抽象模糊,让人不太理解,如果想要准确理解需要详细了解JVM几个运行时数据区以及他们之间的联系。
下面简单介绍一下JVM几个内存区域所存放的具体数据信息
1:方法区:方法区和JAVA堆区一样是线程间共享的内存区域,它主要用于存放被JVM加载的类信息、常量、静态变量、以及编译之后的代码等数据。
2:堆区:对于JVM来说堆区是JAVA虚拟机所管理的内存区域中最大的一块内存区。它也是被所有线程共享的一块区域,在启动JVM的过程中创建而成。对于堆区来说存放的主要是JAVA对象实例,可以这么说几乎所有的java对象实例都在堆区进行分配。
3:本地方法栈和虚拟机栈:JAVA虚拟机栈是线程私有的内存区域,它的生命周期和线程的生命周期相同。我们都知道JAVA中普遍存在着方法,其实java虚拟机栈是java方法执行的内存模型,这句话可以这么理解:java中每个方法执行的时候都会创建一个属于这个方法的栈帧,
2. 验证阶段
JVM的验证阶段的工作量在JVM的类加载系统中占了比较大的一部分,但是根据官方文档规范说明来看对于这一块的介绍的比较笼统,仅仅说了如果校验到class文件存储格式不合法就抛出异常。并且各个不同的JDK对于类验证的具体实现可能有所不同,但是大部分都是可以分为如下几个验证阶段:文件格式验证、元素据验证、字节码验证、和符号引用验证。
3. 准备阶段
4. 解析阶段
5. 初始化阶段
6. 使用阶段
7. 卸载阶段
相关推荐
理解Java内存分配原理有助于优化程序性能,避免内存泄露等问题。 在JVM中,内存主要划分为以下几个区域: 1. **寄存器**:这是JVM内部的虚拟寄存器,用于存储快速存取的数据,但程序员无法直接控制。 2. **栈...
总结,ClassLoader是Java运行时的关键组成部分,理解其工作原理对于优化程序性能、实现动态加载和解决类冲突等问题至关重要。开发者需要根据具体需求灵活运用双亲委派模型,合理设计自定义类加载器,充分利用上下文...
图片加载可以通过Toolkit类的getImage()方法进行,获取图片对象后,可以调用Graphics对象的drawImage()方法将图片绘制到面板上。需要注意的是,在调用drawImage()方法时,可以设置图片的绘制位置以及是否进行缩放。 ...
2. JVM:在有限的资源下运行Java代码,支持类装载、垃圾回收等功能,确保代码高效执行。 三、Java智能卡的开发流程 1. 定义需求:明确智能卡需要实现的功能,如电子钱包、加密服务等。 2. 设计Applet:编写符合...
Spring AOP可以在编译时、类加载时或运行时进行织入。 在Spring中,通过注解或XML配置可以定义切面和通知。例如,使用`@Aspect`注解创建切面类,`@Before`、`@After`、`@Around`等注解定义通知,`@Pointcut`定义...
【JDBC连接MySQL数据库的方法浅析】 Java数据库连接(JDBC)是Java...理解JDBC的工作原理和使用方法,是成为一名合格的Java数据库开发者的基础。同时,JDBC的灵活性和高效性使其成为Java开发中的首选数据库连接技术。
该注解会触发 `@Import(AutoConfigurationImportSelector.class)`,后者会根据 `META-INF/spring.factories` 文件来加载所有自动配置类。 - `@ComponentScan` 扫描指定包下的所有组件,包括 @Component、@Service、@...
Android系统使用Java虚拟机(Dalvik或ART)进行内存分配和管理,但如果不妥善处理,很容易引发内存溢出(Out Of Memory,简称OOM)。本篇文章将深入浅析Android源码中的内存管理机制,以及如何预防和处理内存溢出...
setContentView(int)方法的实现原理是通过加载布局参数到mContentParent对象中。mContentParent对象是一个ViewGroup类对象,它是通过generateLayout()方法来实例化的。generateLayout()方法的实现过程较为复杂,但是...
- "Android_JNI浅析":可能从更直观的角度介绍了JNI,适合初学者快速理解JNI的工作原理。 - "jni详解":这可能是对JNI的深入解析,包括复杂的API使用和最佳实践。 了解和掌握JNI,开发者可以更好地利用Android...
在深入探讨如何在Android系统中利用JNI(Java Native Interface)技术来监控WiFi网络连接状态、DHCP客户端守护进程(dhcpcd)的执行以及管理电源控制(power),我们首先需要理解基本概念与原理。 ### Android与JNI...
理解JVM的工作原理,包括内存模型、类加载机制、垃圾回收等,对于优化Java应用程序性能至关重要。 3. **固定SessionID漏洞** 在Web开发中,SessionID用于跟踪用户状态。固定SessionID可能引发安全问题,如会话劫持...
**RILJ(Radio Interface Layer Java)浅析** RILJ是Java层的RIL实现,它与RILD协同工作,提供API供上层应用程序(如电话应用)调用。RILJ处理来自应用的请求,将这些请求转换为AT命令,并通过RILD传递给基带处理器...
- OSGi定义了一套模块化的服务框架,允许动态加载和卸载插件,这极大地提高了系统的灵活性和可扩展性。 **1.4 RCP技术** - RCP(Rich Client Platform)是Eclipse提供的一个框架,用于构建具有丰富用户体验的应用...
1. **页面的国际化**:通过资源文件加载不同语言版本的字符串。 2. **Action的国际化**:在Action中通过国际化配置获取不同的文本消息。 3. **验证信息的国际化**:错误消息和验证提示可以根据用户选择的语言进行...
- **控件定制**:通过继承现有控件类来实现个性化的设计需求。 - **性能优化**:对控件进行优化以提高应用的响应速度。 #### 2.5 源码中常用于参考的代码 - **源码解读**:分析Android框架源码中的关键部分,加深对...