package com.jvm.classloading; import java.io.IOException; import java.io.InputStream; /** * 类加载器在类相等判断中的影响 (); System.out.println(obj1.getClass()); System.out.println(obj1 instanceof com.jvm.classloading.ClassLoaderTest ); // 使用自定义类加载器加载本类 Object obj2 = myLoader.loadClass("com.jvm.classloading.ClassLoaderTest ); } } 输出结果: class com.jvm.classloading.ClassLoaderTest true class com.jvm.classloading.ClassLoaderTest 第二部分使用自定义的类加载器加载ClassLoaderTest,class com.jvm.classloading.ClassLoderTest显示,obj2确实是类com.jvm.classloading.ClassLoaderTest
本地查看类加载信息: 加载总数: java -jar cmdline-jmxclient-0.10.3.jar controlRole:tomcat 127.0.0.1:8090 java.lang:type=ClassLoading TotalLoadedClassCoun 已加载: java -jar cmdline-jmxclient-0.10.3.jar controlRole:tomcat 127.0.0.1:8090 java.lang:type=ClassLoading LoadedClassCount 已卸载: java -jar cmdline-jmxclient-0.10.3.jar controlRole:tomcat 127.0.0.1:8090 java.lang:type=ClassLoading UnloadedClassCount Zabbix监控类加载键值: 加载总数: jmx["java.lang:type=ClassLoading","TotalLoadedClassCount"] 已加载 : jmx["java.lang:type=ClassLoading","LoadedClassCount"] 已卸载: jmx["java.lang:type=ClassLoading","UnloadedClassCount
If you find that restarts are not quick enough for your applications or you encounter classloading issues However, it can sometimes cause classloading issues.
下面我们通过一个示例来演示自定义类加载器的流程: package com.paddx.test.classloading; import java.io.*; /** * Created by liuxp > testClass = null; try { testClass = classLoader.loadClass("com.paddx.test.classloading.Test 这里有几点需要注意: 1、这里传递的文件名需要是类的全限定性名称,即com.paddx.test.classloading.Test格式的,因为 defineClass 方法是按这种格式进行处理的。 3、这类 Test 类本身可以被 AppClassLoader 类加载,因此我们不能把 com/paddx/test/classloading/Test.class 放在类路径下。
1: 父类 package com.jimoer.classloading; /** * @author jimoer * @date Create in 2020/06/24 16:08 * ; } public static int value = 666; } 子类 package com.jimoer.classloading; public class SonClass 但是这段代码里面触发了另一个名为“[Lcom.jimoer.classloading.FatherClass”的类的初始化阶段,它是一个由虚拟机自动生成的、直接继承与java.lang.Object的子类
resolving field "DATETIME" of type javax.xml.namespace.QName, the class loader io.quarkus.bootstrap.classloading.QuarkusClassLoader @58fd1214 (instance of io.quarkus.bootstrap.classloading.QuarkusClassLoader, child of 'platform' jdk.internal.loader.ClassLoaders
static { System.out.println("arr初始化"); } } /* main方法所在的类初始化 */例子里包名为:org.fenixsoft.classloading 该例子没有触发类org.fenixsoft.classloading.Arr的初始化阶段,但触发了另外一个名为“[Lorg.fenixsoft.classloading.Arr”的类的初始化阶段,对于用户代码来说 这个类代表了一个元素类型为org.fenixsoft.classloading.Arr的一维数组,数组中应有的属性和方法(用户可直接使用的只有被修饰为public的length属性和clone()方法)
这里有几点需要注意: 这里传递的文件名需要是类的全限定性名称,即com.paddx.test.classloading.Test格式的,因为 defineClass 方法是按这种格式进行处理的。 这类Test 类本身可以被AppClassLoader类加载,因此我们不能把com/paddx/test/classloading/Test.class放在类路径下。
name.startsWith("io.github.dk900912.classloading")) { return super.loadClass(name); Thread.currentThread().getContextClassLoader()); Object test = specClassLoader.loadClass("io.github.dk900912.classloading.Test 而且在控制台也可以观察到类卸载日志: [27.601s][info][class,unload] unloading class io.github.dk900912.classloading.Test 3.3 开发时热重载 笔者写了一个工具 classloading-statistics-agent ,它可以分析出 Java 应用中类加载器相关统计信息,比如:存在哪些类加载器、每个类加载器有多少实例 https://github.com/dk900912/classloading-statistics-agent
OutputDirectory to integrate all jar-files into the main jar, but then you will need to add custom classloading
Checkpointing Monitoring Back Pressure Monitoring REST API Debugging Windows & Event Time Debugging Classloading
org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl$4.perform(EntityManagerFactoryBuilderImpl.java:850) at org.hibernate.boot.registry.classloading.internal.ClassLoaderServiceImpl.withTccl
. # # io.tmp.dirs: /tmp # The classloading resolve order. . # # Child first classloading allows users to use different dependency/library # versions in their application
SKIPPED [INFO] flink-parent-child-classloading-test-program ....... SKIPPED [INFO] flink-parent-child-classloading-test-lib-package ... SUCCESS [ 0.933 s] [INFO] flink-parent-child-classloading-test-program ....... SUCCESS [ 1.070 s] [INFO] flink-parent-child-classloading-test-lib-package ...
可以通过如下工具继续排查内存是否泄漏: 方法1:Flink Metric 通过采集上述指标到Prometheus,可以持续观察类的记载和卸载情况,如图所示: 方法2:JMX Metric 与方法1 类似,采集JDK MBean参数ClassLoading
integerFormat.format(this.usedNonHeapMemory / 1024L / 1024L) + " Mo" + " (Perm Gen, Code Cache)"; String classLoading osBean.getTotalSwapSpaceSize() / 1024L / 1024L) + " Mo"; } return nonHeapMemory + ",\n" + classLoading
SUCCESS [ 0.224 s][INFO] flink-parent-child-classloading-test-program ....... SUCCESS [ 0.214 s][INFO] flink-parent-child-classloading-test-lib-package ...
scope>test</scope> </dependency> <dependency> <groupId>org.powermock</groupId> <artifactId>powermock-classloading-xstream
假如说上面的SuperClass 所在的包名为 com.javam.classloading 它触发的是这样一个类的加载和初始化:Lcom.javam.classloading.SuperClass, 这个类是找不到的,因为包找不到,它是由虚拟机自动生成的,直接继承java.lang.Object的子类,创建动作由字节码newarray触发,它代表的是一个数组,一维数组,数组元素类型为:com.javam.classloading.SuperClass
org.springframework.context.weaving.LoadTimeWeaverAware; import org.springframework.core.io.ResourceLoader; import org.springframework.instrument.classloading.LoadTimeWeaver