类加载-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
启动 WebLogic Server 时出现 `java.lang.ClassNotFoundException: com.oracle.classloader.weblogic.LaunchClassLoader` 错误,通常是由于类路径配置问题、JAR 文件缺失或损坏、WebLogic 安装不完整等原因导致。以下是一些可能的解决办法: #### 检查类路径配置 确保 WebLogic 启动脚本中的类路径配置正确,包含了所需的 JAR 文件。WebLogic 的启动脚本(如 `startWebLogic.sh` 或 `startWebLogic.cmd`)会设置类路径。可以检查这些脚本中是否正确引用了相关的 JAR 文件。 例如,在 `startWebLogic.sh` 中,可能会有类似以下的类路径设置: ```bash CLASSPATH=$CLASSPATH:/path/to/weblogic.jar:/path/to/other.jar ``` 确保 `com.oracle.classloader.weblogic.LaunchClassLoader` 所在的 JAR 文件在类路径中。 #### 检查 JAR 文件是否存在和完整 确认包含 `com.oracle.classloader.weblogic.LaunchClassLoader` 类的 JAR 文件是否存在于指定的路径,并且文件没有损坏。可以通过以下命令检查 JAR 文件是否可以正常解压: ```bash jar tf /path/to/your.jar | grep LaunchClassLoader ``` 如果没有输出,说明 JAR 文件可能不包含该类,或者文件损坏。可以尝试重新下载或复制正确的 JAR 文件到相应的目录。 #### 重新安装 WebLogic 如果上述方法都无法解决问题,可能是 WebLogic 安装不完整或损坏。可以尝试卸载并重新安装 WebLogic Server,确保安装过程中没有出现错误。 #### 检查环境变量 确保所有与 WebLogic 相关的环境变量(如 `JAVA_HOME`、`MW_HOME` 等)都正确设置。这些环境变量会影响 WebLogic 的启动和类加载。 ```bash echo $JAVA_HOME echo $MW_HOME ``` #### 检查 Java 版本兼容性 确保使用的 Java 版本与 WebLogic Server 兼容。不同版本的 WebLogic 对 Java 版本有不同的要求,可以参考 WebLogic 的官方文档来确认兼容性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

添码星空

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

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

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

打赏作者

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

抵扣说明:

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

余额充值