类加载-java.lang.ClassLoader

本文详细介绍了Java中的ClassLoader,包括其作用、类加载过程、ClassLoader的分类以及工作原理。重点讲解了双亲委派模型,解释了ClassLoader如何协同工作以确保类的唯一性,并通过分析`loadClass`源码揭示了加载过程的细节。

ClassLoader是什么?

Class代表它的作用对象是类,Loader代表它的功能是加载,那么ClassLoader就是把一个以.class结尾的文件以JVM能识别的存储形式加载到内存中。

类加载过程

一个类在被使用之前,会经历class文件生成—>加载—>连接—>初始化等阶段。这些阶段组合起来为完整的类加载过程,其中加载阶段主要完成三件事:

通过类的全限定名来获取定义次类的二进制字节流
将该二进制字节流定义的静态数据结构转换成方法区的运行时数据结构
在内存中生成一个代表该类的Class对象,供外部通过该对象来获取类的元数据信息
上述类加载的大部分阶段是由JVM控制的,但JVM对于加载阶段有些没有做强制限制,比如从哪获取class文件,以及如何加载class都可以由用户自定义实现方案,正是由于JVM提供的这些入口,衍生出了动态字节码,applet, OSGI,类隔离(ali-Pandora)等技术。

正常情况下一个ClassLoader需要两个必要属性

1、parent:用于指明当前ClassLoader的父类加载器
2、url:类命名空间,用于指明当前ClassLoader从哪里加载class文件

ClassLoader分类:

1、系统自带的ClassLoader
2、用户自定义类加载ClassLoader

其中系统自带的ClassLoader分成三类:
1.1、 BootstrapClassloader: 启动类加载器, 加载JAVA_HOME/lib/目录下的所有jar包, 而该目录下的主要放系统核心类

Starting WLS with line: /usr/local/jdk-21.0.8/bin/java -server -Xms1024m -Xmx1024m -XX:MaxNewSize=128m -XX:NewSize=128m -XX:MetaspaceSize=512m -XX:MaxMetaspaceSize=512m -cp /opt/oracle/product/14.1.2.0/wlserver/server/lib/weblogic-launcher.jar -Dlaunch.use.env.classpath=true -Dweblogic.Name=ms-be-as -Djava.security.policy=/opt/oracle/product/14.1.2.0/wlserver/server/lib/weblogic.policy -Djava.system.class.loader=com.oracle.classloader.weblogic.LaunchClassLoader # GC Logging JAVA_OPTIONS= -Djava.system.class.loader=com.oracle.classloader.weblogic.LaunchClassLoader -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/opt/psa/dev/ct1/be/archive/heapdump -DLOG_ROOT=/opt/psa/dev/ct1/be/logs -Dsun.rmi.dgc.client.gcInterval=3600000 -Dsun.rmi.dgc.server.gcInterval=3600000 -Dsun.net.inetaddr.negative.ttl=10 -Dsun.net.inetaddr.ttl=30 -Dcom.sun.jndi.ldap.object.disableEndpointIdentification=true -XX:+DisableExplicitGC -XX:-TraceClassUnloading -XX:-TraceClassLoading -Djdk.disableSerialConstructorChecks=true -Doracle.net.tns_admin=/opt/oracle/product/12.1.0.1/network/admin -Dweblogic.ReverseDNSAllowed=false -Dweblogic.security.SSL.minimumProtocolVersion=TLSv1.2 -Dweblogic.diagnostics.DisableDiagnosticRuntimeControlService=true -DAppMon.defaults=/opt/psa/dev/ct1/be/css/appmon/config/AppMon-defaults.properties -javaagent:/opt/oracle/product/14.1.2.0/wlserver/server/lib/debugpatch-agent.jar -da -Dwls.home=/opt/oracle/product/14.1.2.0/wlserver/server -Dweblogic.home=/opt/oracle/product/14.1.2.0/wlserver/server weblogic.Server [0.010s][warning][cds] Archived non-system classes are disabled because the java.system.class.loader property is specified (value = "com.oracle.classloader.weblogic.LaunchClassLoader"). To use archived non-system classes, this property must not be set Error occurred during initialization of VM java.lang.Error: com.oracle.classloader.weblogic.LaunchClassLoader at java.lang.ClassLoader.initSystemClassLoader(java.base@21.0.8/ClassLoader.java:2024) at java.lang.System.initPhase3(java.base@21.0.8/System.java:2333) Caused by: java.lang.ClassNotFoundException: com.oracle.classloader.weblogic.LaunchClassLoader at jdk.internal.loader.BuiltinClassLoader.loadClass(java.base@21.0.8/BuiltinClassLoader.java:641) at jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(java.base@21.0.8/ClassLoaders.java:188) at java.lang.ClassLoader.loadClass(java.base@21.0.8/ClassLoader.java:526) at java.lang.Class.forName0(java.base@21.0.8/Native Method) at java.lang.Class.forName(java.base@21.0.8/Class.java:534) at java.lang.Class.forName(java.base@21.0.8/Class.java:513) at java.lang.ClassLoader.initSystemClassLoader(java.base@21.0.8/ClassLoader.java:2010) at java.lang.System.initPhase3(java.base@21.0.8/System.java:2333) shutDownStatus=1 Stopping Derby server... Derby server stopped.
最新发布
09-06
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

添码星空

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值