1 class装载验证流程
a) 加载:
a.1) 装载类的第一个阶段
a.2) 取得类的二进制流
a.3) 转为方法区数据结构
a.4) 在Java堆中生成对应的java.lang.Class对象
b) 链接
验证:
准备:
分配内存,并为类设置初始值 (方法区中) public static int v=1; 在准备阶段中,v会被设置为0 在初始化的<clinit>中才会被设置为1 对于static final类型,在准备阶段就会被赋上正确的值 public static final int v=1;
解析:
符号引用(字符串)替换为直接引用(指针/地址)
c) 初始化 : 执行父类构造器,执行子类构造器
2 什么是类装载器ClassLoader
a) ClassLoader是一个抽象类
b) ClassLoader的实例将读入Java字节码将类装载到JVM中
c) ClassLoader可以定制,满足不同的字节码流获取方式
d) ClassLoader负责类装载过程中的加载阶段
ClassLoader的几个方法:
public Class<?> loadClass(String name) throws ClassNotFoundException 载入并返回一个Class protected final Class<?> defineClass(byte[] b, int off, int len) 定义一个类,不公开调用 protected Class<?> findClass(String name) throws ClassNotFoundException loadClass回调该方法,自定义ClassLoader的推荐做法 protected final Class<?> findLoadedClass(String name) 寻找已经加载的类
ClassLoader的分类:
a) BootStrap ClassLoader (启动ClassLoader)
b) Extension ClassLoader (扩展ClassLoader)
c) App ClassLoader (应用ClassLoader/系统ClassLoader)
d) Custom ClassLoader(自定义ClassLoader)
这四个分类对应关系和对应JAR:
上图中,查找类是从底向上查找,如果找到就不会继续向上找。
3 java沙箱简介:
java沙箱是你可以接受来自任何来源的代码,沙箱限制了可能进行系统破坏的任何动作,所以沙箱更像一个针对具有破坏能力代码的监狱。
java沙箱基本组件:
a) 类装载器 (可以由用户定制)
b) class文件校验器
c) 内置的java虚拟机
d) 安全管理器 (可以由用户定制)
e) java核心API
4 java类装载器体系结构(从三方面对java沙箱起作用):
a) 防止恶意代码干扰善意代码:(确保类之间相互独立)
不同类装载器装入同样类会产生一个唯一的命名空间,不同命名空间之间的类如同各自有自己的防护罩,
隔绝并感知不到彼此存在,jvm维护这些命名空间,看下图理解:
b) 守护了被信任的类库边界(确保包的安全)
jvm通过 双亲委托模式 和 运行时包 来界定类库的边界。
b.1) 双亲委托模式:
先看如下代码(java.lang.ClassLoader的loadClass)
<SPAN style="FONT-SIZE: 14px">protected synchronized Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException { // First, check if the class has already been loaded Class c = findLoadedClass(name); if (c == null) { try { if (parent != null) { c = parent.loadClass(name, false); } else { c = findBootstrapClass0(name); } } catch (ClassNotFoundException e) { // If still not found, then invoke findClass in order // to find the class. c = findClass(name); } } if (resolve) { resolveClass(c); } return c; }</SPAN>
虚拟机去装载一个类时, 调用loadClass()方法,在方法内,
使用findLoadedClass来判断要装载的类字节码是否已经转入了内存,
如果没有的话,它会找到它的parent(parent是指装载自己的类加载器,而应用程序的类加载器是AppClassLoader),然后调用parent的loadClass,重复自己loadClass的过程。
如果parent没有装载过着这个类,就调用findBootstrapClass(这里是指bootStrap,启动装载器)
来尝试装载这个类的字节码,
如果bootStrap也没有办法装载这个类,则调用自己的findClass来尝试装载这个类,
如果还是没办法装载则抛出异常。
说白了,双亲委托模式就是:
自底向上检查类是否已经加载
自顶向下尝试加载类。
那么双亲委托模式的优点:
自定义一个String类,
public class String { public static void main(String[] args) { System.out.println("111"); } } 运行报错如下: java.lang.NoSuchMethodError: main Exception in thread "main"
行这个我们自己定义的类的java.lang.String的双亲委托模式加载过程如下AppClassLoader -> ExtClassLoader -> BootstrapLoader, 按照上述代码加载流程, AppClassLoader 根据name去classpath下找这个类,找不到,然后在BootstrapLoader下找,BootstrapLoader去加载核心API里的类,它匹配到核心API(JAVA_HOME\jre\lib)里的String类,所以调用核心API里的String类里的main函数,所以就抛出异常了
总结下 优点就是: 防止了我们自己写的类对java核心代码的破坏。
b.2) 运行时包:
jvm只允许装载同一包中的类互相访问,
自定义下的 java.lang.xxx 和 java.lang.String 是不同加载器加载,因此不能相互访问,达到隔离效果
c) 将代码归入到某保护区,确保类内代码的作用域
类装载器会把代码放在保护区中一限定这些代码能够执行的操作的权限,类比于在监狱指定范围活动。
5 类装载器体现结构脑图:
相关推荐
《JVM类装载器原理详解》 Java的JVM(Java Virtual Machine)类装载器是Java运行时系统的重要组成部分,负责在程序运行期间查找并加载类的二进制数据。理解类装载器的工作原理对于优化Java应用性能和实现动态加载类...
- `jstat`:监控JVM的堆内存、GC、类装载等情况。 - `jmap`:获取堆内存快照,用于分析内存泄漏。 - `jhat`:分析堆内存快照,找出内存泄漏的线索。 - `jconsole` 和 `VisualVM`:图形化界面工具,提供更直观的...
1. 类装载器:类装载器负责加载.class文件到JVM中,分为引导类装载器、扩展类装载器和应用类装载器,以及用户自定义的类装载器。了解类装载过程(加载、验证、准备、解析和初始化)对于理解类的生命周期至关重要。 ...
4. **系统类装载器(App ClassLoader)**:也称为应用类装载器,加载`Classpath`中指定的类,通常由用户应用程序使用。 5. **自定义类装载器**:开发者可以根据需求编写自己的类装载器,用于加载特定路径或者网络上...
- 类装载器确保类的正确加载和重用,避免了重复加载相同的类。 2. **执行引擎(Execution Engine)** - 执行引擎负责将字节码(bytecode)转换为机器指令并执行。 - 包括解释器(Interpreter)和即时编译器(JIT ...
类装载器分为引导类装载器、扩展类装载器和应用程序类装载器,以及用户自定义的类装载器。 2. 运行时数据区(Runtime Data Area):包括堆、方法区、虚拟机栈、本地方法栈和程序计数器。堆存储所有对象实例,方法区...
JVM主要包括类装载器、运行数据区、执行引擎、本地方法接口和本地库。类装载器负责加载类文件,运行数据区存储程序运行时的各种数据,执行引擎执行字节码,本地方法接口用于调用非Java语言编写的本地方法,本地库则...
在深入理解JVM的过程中,编写自己的类装载器(ClassLoader)是一个非常实用且有趣的实践。这个“java之jvm学习笔记五(实践写自己的类装载器)”很可能是对这一主题的详细探讨。 类装载器在Java中的主要职责是动态...
在Java中,每个类都是由类装载器加载到JVM中的,并且每个类都由特定的类装载器实例加载。类装载器不仅确保了程序的动态性,还提供了强大的安全性保障。 #### 类装载器的作用 1. **动态性**:类装载器使Java程序...
4. **性能监控工具**:如JConsole、VisualVM、JProfiler等,它们可以帮助开发者实时监控JVM的运行状态,包括CPU、内存、线程、类装载和GC等信息,从而定位性能瓶颈。 5. **JVM参数调整**:通过设置-Xms、-Xmx控制堆...
1. **类装载器**:负责加载类文件,完成类的加载、验证、准备和初始化等工作。 2. **运行时数据区**:包括堆、方法区、虚拟机栈、本地方法栈和程序计数器。其中,堆是所有线程共享的内存区域,用于对象实例的分配;...
- **jconsole**:Java可视化监控工具,可以显示JVM的内存、线程、类装载、Garbage Collection (GC) 和CPU使用情况等信息。 - **jvisualvm**:这是一个更加强大的多合一工具,包含jconsole的功能,并且可以附加到...
JVM主要包括类装载器、运行数据区、执行引擎、本地方法接口和本地库。类装载器是这个结构中的一个重要组成部分,它的任务是查找并加载Java类。Java类加载器分为三种基本类型:启动类加载器(Bootstrap ClassLoader)...
类装载器负责将类文件加载到Java虚拟机(JVM)中,而命名空间则帮助组织和管理这些类,避免命名冲突。 1. **类装载器(ClassLoader)** 类装载器是Java动态性的一个关键组件,它们根据类的全限定名(包括包名和...
4. 理解反射和动态代理:类装载器和运行时数据区是Java反射和动态代理技术的基础,深入理解JVM有助于开发更灵活的代码。 5. 安全编程:了解安全管理器的工作原理,可以帮助开发者编写更安全的代码,防止恶意代码的...
1. 提供对类的请求服务:当JVM需要一个类时,类装载器负责找到并返回这个类。 2. 动态定位和加载代码、数据和资源:这允许在运行时实现动态加载,比如加载不同版本的类或从特定位置加载资源。 Java类装载器的体系...
2. **JVM实现**:根据平台特性实现JVM的各个组件,如类装载器、执行引擎等。 3. **字节码与机器码转换**:设计并实现字节码解释器或JIT编译器,将Java字节码转换为目标平台的机器码。 4. **系统调用适配**:实现本地...
1. 类装载器:负责加载类文件,确保在运行时能找到对应的类。 2. 运行数据区:包括方法区、堆、栈、本地方法栈和程序计数器。方法区存储类信息,堆存放对象实例,栈处理方法调用,本地方法栈服务于本地方法,程序...
JVM加载class文件的原理机制是Java中的核心机制之一,由于Java中的所有类必须被装载到JVM中才能运行,这个装载工作是由JVM中的类装载器完成的。类装载器所做的工作实质是把类文件从硬盘读取到内存中。 类加载机制 ...
所有JVM都内置了一个特殊的类装载器——根装载器(Bootstrap ClassLoader),它负责装载Java核心类库。当需要装载非设计时已知的类时,则需要使用用户自定义的类装载器。 #### 实例演示 以下是一个简单的示例,...