【Java学习笔记】JVM对类的处理

简介: 作者:gnuhpc 出处:http://www.cnblogs.com/gnuhpc/ 1.类的加载 加载:查找并加载类的二进制数据。把.class文件的二进制数据读入到内存中,把它存放在运行时数据区的方法区内,然后在堆区中创建一个java.lang.Class对象(这就是类加载的最终产品),用来封装类在方法区内的数据结构,并且向JAVA程序提供了访问类在方法区内的数据结构的接口。

作者:gnuhpc
出处:http://www.cnblogs.com/gnuhpc/

1.类的加载
加载:查找并加载类的二进制数据。把.class文件的二进制数据读入到内存中,把它存放在运行时数据区的方法区内,然后在堆区中创建一个java.lang.Class对象(这就是类加载的最终产品),用来封装类在方法区内的数据结构,并且向JAVA程序提供了访问类在方法区内的数据结构的接口。

2.类的验证:
验证:确保加载类的正确性,检查的内容包括,类文件的结构检查,语义检查,字节码验证,二进制兼容的验证。

3.类的准备:
为类的静态变量分配内存,并将其初始化为默认值)和解析类的二进制数据(把类中的符号转换为直接引用)。

4.类的解析:
将类中的引用替换为指针。

5.类的初始化:
初始化:给类的静态变量赋予正确的初始值,JVM只有在程序首次主动使用一个类或者接口的时候才会初始化它(所谓主动使用,创建类的实例,调用类的静态方法,调用反射方法,初始化一个类的子类等都属于这一类)。这个类还没有被加载或连接,则先进行加载和连接,若类存在直接父类,则先初始化直接父类,接着在执行初始化语句,然后这个类的初始化才算完成。
以下是几种不会导致类的初始化的类被动使用的情况:

a.对于final类型的静态变量,如果在编译的时候就可以算出变量的取值,那么就不会导致类的初始化,而是直接在字节流中保存那个值,所以当访问的时候其实就是访问的那个值。例如:
public static final int a = 2*3;则public static final int b = (int) (Math.random()*5)就会导致类的初始化。

b.初始化一个类的时候,要求它的所有父类都已经被初始化了,但是这条规则并不适用于接口。但在初始化一个类时,并不会先初始化它所实现的接口。在初始化一个接口时,并不会先初始化它的父接口。

c.调用ClassLoader类的loadClass()方法加载一个类,并不是对类的主动使用,不会导致类的初始化。

 

类的生命周期:

当Sample类被加载、连接和初始化后,它的生命周期就开始了。当代表Sample类的Class对象不再被引用,即不可触及时,Class对象就会结束生命周期,Sample类在方法区内的数据也会被卸载,从而结束Sample类的生命周期。

JVM自身的类加载器所加载的类,在JVM生命周期中始终不会被卸载。而用户自定义的类加载器所加载的类是可以被卸载的。

 

作者:gnuhpc
出处:http://www.cnblogs.com/gnuhpc/


               作者:gnuhpc
               出处:http://www.cnblogs.com/gnuhpc/
               除非另有声明,本网站采用知识共享“署名 2.5 中国大陆”许可协议授权。


分享到:

目录
相关文章
|
21小时前
|
安全 Java 开发者
Java一分钟之-文件与目录操作:Path与Files类
【5月更文挑战第13天】Java 7 引入`java.nio.file`包,`Path`和`Files`类提供文件和目录操作。`Path`表示路径,不可变。`Files`包含静态方法,支持创建、删除、读写文件和目录。常见问题包括:忽略异常处理、路径解析错误和权限问题。在使用时,注意异常处理、正确格式化路径和考虑权限,以保证代码稳定和安全。结合具体需求,这些方法将使文件操作更高效。
10 2
|
21小时前
|
安全 Java 开发者
Java一分钟之-Optional类:优雅处理null值
【5月更文挑战第13天】Java 8的`Optional`类旨在减少`NullPointerException`,提供优雅的空值处理。本文介绍`Optional`的基本用法、创建、常见操作,以及如何避免错误,如直接调用`get()`、误用`if (optional != null)`检查和过度使用`Optional`。正确使用`Optional`能提高代码可读性和健壮性,建议结合实际场景灵活应用。
16 3
|
1天前
|
存储 Java ice
【Java开发指南 | 第十六篇】Java数组及Arrays类
【Java开发指南 | 第十六篇】Java数组及Arrays类
8 3
|
1天前
|
Java 编译器 ice
【Java开发指南 | 第十五篇】Java Character 类、String 类
【Java开发指南 | 第十五篇】Java Character 类、String 类
11 1
|
1天前
|
存储 Java ice
【Java开发指南 | 第十四篇】Java Number类及Math类
【Java开发指南 | 第十四篇】Java Number类及Math类
9 1
|
1天前
|
存储 缓存 Java
【Java开发指南 | 第六篇】Java成员变量(实例变量)、 类变量(静态变量)
【Java开发指南 | 第六篇】Java成员变量(实例变量)、 类变量(静态变量)
9 2
|
1天前
|
Java 编译器
【Java开发指南 | 第一篇】类、对象基础概念及Java特征
【Java开发指南 | 第一篇】类、对象基础概念及Java特征
9 4
|
2天前
|
安全 Java 数据安全/隐私保护
Java一分钟之-Java反射机制:动态操作类与对象
【5月更文挑战第12天】本文介绍了Java反射机制的基本用法,包括获取Class对象、创建对象、访问字段和调用方法。同时,讨论了常见的问题和易错点,如忽略访问权限检查、未捕获异常以及性能损耗,并提供了相应的避免策略。理解反射的工作原理和合理使用有助于提升代码灵活性,但需注意其带来的安全风险和性能影响。
16 4
|
3天前
|
安全 Java 调度
Java一分钟:多线程编程初步:Thread类与Runnable接口
【5月更文挑战第11天】本文介绍了Java中创建线程的两种方式:继承Thread类和实现Runnable接口,并讨论了多线程编程中的常见问题,如资源浪费、线程安全、死锁和优先级问题,提出了解决策略。示例展示了线程通信的生产者-消费者模型,强调理解和掌握线程操作对编写高效并发程序的重要性。
43 3
|
4天前
|
Java
【JAVA基础篇教学】第五篇:Java面向对象编程:类、对象、继承、多态
【JAVA基础篇教学】第五篇:Java面向对象编程:类、对象、继承、多态