java jdk 类加载机制_JDK源码阅读之类加载
java类加载
类的生命周期(类加载过程)
LLIUU+VPR
加载(Loading)
链接(Linking)
验证(Verification)
准备(Preparation)
解析(Resolution)
初始化(Initialization)
使用(Using)
卸载(Unloading) 类
类加载器种类
BootstrapClassLoader:C++编写,负责加载java核心类库
Launcher.ExtClassLoader:Launcher中的内部类,parent == null
Launcher.AppClassLoader:Launcher中的内部类,parent == ExtClassLoader
用户自定义ClassLoader:继承自ClassLoader,parent == AppClassLoader
类加载机制
java中默认的类加载机制是双亲委派模式。
ClassLoader中关键的方法说明:
loadClass // 类加载入口,包含下面这些步骤
=> findLoadedClass => findLoadedClass0 // 先从缓存中查询一下,看看目标类是否已加载过
=> findBootstrapClassOrNull => findBootstrapClass // 用Bootstrap类加载器进行加载
=> findClass // 读取字节码文件,然后加载字节码文件
=> defineClass // 加载字节码文件
=> preDefineClass // 加载前的检查
=> defineClassSourceLocation // 定义类加载的路径
=> defineClass1/defineClass2 // 调用native方法加载类
=> postDefineClass //
=> resolveClass => resolveClass0
ClassLoader 部分源码:
package java.lang;
import java.io.InputStream;
...
public abstract class ClassLoader {
private final ClassLoader parent;
// -- Class --
protected Class> loadClass(String name, boolean resolve)
throws ClassNotFoundException
{
synchronized (getClassLoadingLock(name)) {
// First, check if the class has already been loaded
Class> c = findLoadedClass(name); // 缓存机制
if (c == null) {
long t0 = System.nanoTime();
try {
// 双亲委派机制
if (parent != null) {
c = parent.loadClass(name, false);
} else {
c = findBootstrapClassOrNull(name);
}
} catch (ClassNotFoundException e) {
// ClassNotFoundException thrown if class not found
// from the non-null parent class loader
}
if (c == null) {
// If still not found, then invoke findClass in order
// to find the class.
long t1 = System.nanoTime();
c = findClass(name);
// this is the defining class loader; record the stats
sun.misc.PerfCounter.getParentDelegationTime().addTime(t1 - t0);
sun.misc.PerfCounter.getFindClassTime().addElapsedTimeFrom(t1);
sun.misc.PerfCounter.getFindClasses().increment();
}
}
if (resolve) {
resolveClass(c);
}
return c;
}
}
// findClass由子类去实现
protected Class> findClass(String name) throws ClassNotFoundException {
throw new ClassNotFoundException(name);
}
// defineClass 加载类
protected final Class> defineClass(String name, byte[] b, int off, int len,
ProtectionDomain protectionDomain)
throws ClassFormatError
{
protectionDomain = preDefineClass(name, protectionDomain);
String source = defineClassSourceLocation(protectionDomain);
Class> c = defineClass1(name, b, off, len, protectionDomain, source);
postDefineClass(c, protectionDomain);
return c;
}
private ProtectionDomain preDefineClass(String name,
ProtectionDomain pd)
{
if (!checkName(name))
throw new NoClassDefFoundError("IllegalName: " + name);
// Note: Checking logic in java.lang.invoke.MemberName.checkForTypeAlias
// relies on the fact that spoofing is impossible if a class has a name
// of the form "java.*"
if ((name != null) && name.startsWith("java.")) {
throw new SecurityException
("Prohibited package name: " +
name.substring(0, name.lastIndexOf('.')));
}
if (pd == null) {
pd = defaultDomain;
}
if (name != null) checkCerts(name, pd.getCodeSource());
return pd;
}
private String defineClassSourceLocation(ProtectionDomain pd)
{
CodeSource cs = pd.getCodeSource();
String source = null;
if (cs != null && cs.getLocation() != null) {
source = cs.getLocation().toString();
}
return source;
}
private void postDefineClass(Class> c, ProtectionDomain pd)
{
if (pd.getCodeSource() != null) {
Certificate certs[] = pd.getCodeSource().getCertificates();
if (certs != null)
setSigners(c, certs);
}
}
private native Class> defineClass0(String name, byte[] b, int off, int len,
ProtectionDomain pd);
private native Class> defineClass1(String name, byte[] b, int off, int len,
ProtectionDomain pd, String source);
private native Class> defineClass2(String name, java.nio.ByteBuffer b,
int off, int len, ProtectionDomain pd,
String source);
protected final void resolveClass(Class> c) {
resolveClass0(c);
}
private native void resolveClass0(Class> c);
private Class> findBootstrapClassOrNull(String name) {
if (!checkName(name)) return null;
return findBootstrapClass(name);
}
// return null if not found
private native Class> findBootstrapClass(String name);
protected final Class> findLoadedClass(String name) {
if (!checkName(name))
return null;
return findLoadedClass0(name);
}
private native final Class> findLoadedClass0(String name);
// -- Resource --
...
// -- Hierarchy --
...
// -- Package --
...
// -- Native library access --
...
// -- Assertion management --
...
}
双亲委派
java jdk 类加载机制_JDK源码阅读之类加载相关推荐
- JVM类加载机制(ClassLoader)源码解析
http://blog.csdn.net/chenyi8888/article/details/7066569 其实JVM类加载机制,简单地说就是类管理,也就是我们生成的class文件. 三个步骤:装 ...
- 深度分析Java的ClassLoader机制(源码级别)
转载自 深度分析Java的ClassLoader机制(源码级别) Java中的所有类,必须被装载到jvm中才能运行,这个装载工作是由jvm中的类装载器完成的,类装载器所做的工作实质是把类文件从硬盘读取 ...
- java io中断_JDK源码阅读:InterruptibleChannel 与可中断 IO
来源:木杉的博客 , imushan.com/2018/08/01/java/language/JDK源码阅读-InterruptibleChannel与可中断IO/ Java传统IO是不支持中断的, ...
- java collection源码_jdk源码阅读Collection实例分析
jdk源码阅读Collection详解 见过一句夸张的话,叫做"没有阅读过jdk源码的人不算学过java".从今天起开始精读源码.而适合精读的源码无非就是java.io,.util ...
- 深度分析 Java 的 ClassLoader 机制(源码级别)(转)
写在前面:Java中的所有类,必须被装载到jvm中才能运行,这个装载工作是由jvm中的类装载器完成的,类装载器所做的工作实质是把类文件从硬盘读取到内存中,JVM在加载类的时候,都是通过ClassLoa ...
- java类验证和装载顺序_深度分析Java的ClassLoader机制(源码级别)
原文地址:https://dwz.cn/AztGFkO7 作者:Hollis Java中的所有类,必须被装载到jvm中才能运行,这个装载工作是由jvm中的类装载器完成的,类装载器所做的工作实质是把类文 ...
- JVM类加载机制及源码分析
JVM类加载机制 当我们运行某个类的main函数时,首先需要通过类加载器将主类加载到JVM中去. 类加载过程 加载 在硬盘上找到对应的.class文件,并且通过IO 读入 验证 校验字节码文件的正确性 ...
- Android消息机制 Looper源码阅读
什么是Looper android源码上Looper类的注释为: 用于为线程运行消息循环的类,在默认情况下线程是没有与其关联的消息循环的;可以通过在线程中调用Looper.prepare()创建一个与 ...
- java常用类介绍及源码阅读(ArrayList)
java.util 类 ArrayList<E> 继承关系: java.lang.Objectjava.util.AbstractCollection<E>java.util ...
最新文章
- linux 故障注入_阿里巴巴开源故障注入工具_chaosblade
- 【备忘1】防止表格/层 被撑破的CSS控制代码
- 别再蒸馏3层BERT了!变矮又能变瘦的DynaBERT了解一下
- android开发超级群(500人)
- 可真有你的!EasyEdge模型压缩新姿势……
- SHOI2016 黑暗前的幻想乡
- 在pandas中遍历DataFrame行
- php怎样使用pdo,PHP中使用PDO_PHP教程
- php全局化标签,PHP – 在整个应用程序中使类对象全局化?
- 解决win10的WiFi图标消失、win10打开或关闭系统图标网络灰色问题
- java long_Java long数据类型
- 15、孪生网络与相似度
- MDK5 添加Device
- 2020网易游戏测试面试二面面经(上海春招)
- 【一起学Rust | 设计模式】新类型模式
- 蜕变测试(metamorphic testing)经典论文阅读 Compiler Validation via Equivalence Modulo Inputs
- gcc参数-Wl,–gc-sections,不链接未用函数,减小可执行文件大小
- 自己动手写一个番茄小助手
- 微服务架构之全局异常(@ControllerAdvice + @ExceptionHandler)
- 如何做数据分析,数据分析流程是什么?