一.前言
在開發過程中,有時候需要動態加載各種jar/class到程序中,然而又只使用一次,或者加載的jar/class中有改動需要持續升級。程序一直在運行,每次加載進去的jar/class如果過多,對系統會造成很大的壓力,而且已經加載進去的jar/class不能覆蓋,從而造成得不到想要的結果。此時就需要考慮對加載進去的jar/class進行卸載。
二.思路
我們知道,當一個java類的完整的生命週期會經歷 加載、連接、初始化、使用、和卸載 五個階段,當該類的class對象不再被引用之後,該類的生命週期也就結束了,那麼該類會被GC回收,從而達到卸載的功能。
三.案例編寫
編寫一個簡單的自定義classLoad,繼承 URLClassLoader 。
此處特別注意 MyClassLoad 構造函數中調用父級構造的第二個參數
package com.vae.classLoader.loader;
import com.vae.classLoader.Application;
import java.io.File;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLClassLoader;
/**
* 自定義的ClassLader
*/
public class MyClassLoad extends URLClassLoader {
public MyClassLoad(String pathName) {
/**
* 第一個參數爲jar/class地址
* 第二個參數是父級classLoader,此處是spring boot 的classLoader,意味着繼承了spring boot
* 的classLoader,在MyClassLoad中可使用到spring boot的jvm
*/
super(getMyURLs(pathName), Application.class.getClassLoader());
}
private static URL[] getMyURLs(String pathName) {
URL url = null;
try {
url = new File(pathName).toURI().toURL();
} catch (MalformedURLException e) {
e.printStackTrace();
}
return new URL[]{url};
}
@Override
protected Class<?> findClass(String name) throws ClassNotFoundException {
return super.findClass(name);
}
@Override
public Class<?> loadClass(String name) throws ClassNotFoundException {
return super.loadClass(name, false);
}
@Override
public URL[] getURLs() {
return super.getURLs();
}
@Override
public void addURL(URL url) {
super.addURL(url);
}
}
四、測試
新建一個簡單的project工程,只編寫一個main方法,代碼結構如下圖,打成jar包後放在 F:/v/test.jar,修改打印部分數字爲2再打一個jar包放在 F:/v/v/test.jar(注意目錄層次)
編寫測試方法
package com.vae.classLoader.loader;
import com.vae.classLoader.Application;
import java.lang.reflect.Method;
import java.net.URL;
import java.net.URLClassLoader;
public class ClassUnLoadTest {
/**
* 測試class的加載與卸載情況。
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception {
printSupJvm();
MyClassLoad loader1 = new MyClassLoad("f:/v/test.jar");
Class<?> clazz1 = loader1.loadClass("com.vae.Test");
Object a1 = clazz1.newInstance();
Method method = clazz1.getMethod("main", String[].class);
method.invoke(null, (Object) new String[]{"2019"});
for (URL url : loader1.getURLs()){
System.out.println(url.toString());
}
// 清除相關引用,等待gc回收
a1 = null;
clazz1 = null;
loader1 = null;
printSupJvm();
MyClassLoad loader2 = new MyClassLoad("f:/v/v/test.jar");
Class<?> clazz2 = loader2.loadClass("com.vae.Test");
Object a2 = clazz2.newInstance();
Method method2 = clazz2.getMethod("main", String[].class);
method2.invoke(null, (Object) new String[]{"2019"});
for (URL url : loader2.getURLs()){
System.out.println(url.toString());
}
a2 = null;
clazz2 = null;
loader2 = null;
printSupJvm();
}
/**
* 打印輸出父級SpringBoot中的className
*/
private static void printSupJvm(){
URLClassLoader load = (URLClassLoader)Application.class.getClassLoader();
System.out.println(load.getClass().getName() + "===================================");
for (URL url : load.getURLs()){
System.out.println(url.toString());
}
System.out.println("================================================================");
}
}
運行輸出打印結果如下
打印輸出結構:
"C:\Program Files\Java\jdk1.8.0_144\bin\java.exe" ...
sun.misc.Launcher$AppClassLoader===================================
Application的classLoad中所有的jar/class列表......
================================================================
Hello World!__ 1 __
file:/f:/v/test.jar
sun.misc.Launcher$AppClassLoader===================================
Application的classLoad中所有的jar/class列表......
================================================================
Hello World!__ 2 __
file:/f:/v/v/test.jar
sun.misc.Launcher$AppClassLoader===================================
Application的classLoad中所有的jar/class列表......
================================================================Process finished with exit code 0
"C:\Program Files\Java\jdk1.8.0_144\bin\java.exe" "-javaagent:D:\Program Files\JetBrains\IntelliJ IDEA Community Edition 2018.3.6\lib\idea_rt.jar=52595:D:\Program Files\JetBrains\IntelliJ IDEA Community Edition 2018.3.6\bin" -Dfile.encoding=UTF-8 -classpath "C:\Program Files\Java\jdk1.8.0_144\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\rt.jar;D:\workRepository\example\case-classLoader\target\classes;D:\maven\repository\idea\org\springframework\boot\spring-boot-starter\2.0.1.RELEASE\spring-boot-starter-2.0.1.RELEASE.jar;D:\maven\repository\idea\org\springframework\boot\spring-boot\2.0.1.RELEASE\spring-boot-2.0.1.RELEASE.jar;D:\maven\repository\idea\org\springframework\spring-context\5.0.5.RELEASE\spring-context-5.0.5.RELEASE.jar;D:\maven\repository\idea\org\springframework\spring-aop\5.0.5.RELEASE\spring-aop-5.0.5.RELEASE.jar;D:\maven\repository\idea\org\springframework\spring-beans\5.0.5.RELEASE\spring-beans-5.0.5.RELEASE.jar;D:\maven\repository\idea\org\springframework\spring-expression\5.0.5.RELEASE\spring-expression-5.0.5.RELEASE.jar;D:\maven\repository\idea\org\springframework\boot\spring-boot-autoconfigure\2.0.1.RELEASE\spring-boot-autoconfigure-2.0.1.RELEASE.jar;D:\maven\repository\idea\org\springframework\boot\spring-boot-starter-logging\2.0.1.RELEASE\spring-boot-starter-logging-2.0.1.RELEASE.jar;D:\maven\repository\idea\ch\qos\logback\logback-classic\1.2.3\logback-classic-1.2.3.jar;D:\maven\repository\idea\ch\qos\logback\logback-core\1.2.3\logback-core-1.2.3.jar;D:\maven\repository\idea\org\apache\logging\log4j\log4j-to-slf4j\2.10.0\log4j-to-slf4j-2.10.0.jar;D:\maven\repository\idea\org\apache\logging\log4j\log4j-api\2.10.0\log4j-api-2.10.0.jar;D:\maven\repository\idea\org\slf4j\jul-to-slf4j\1.7.25\jul-to-slf4j-1.7.25.jar;D:\maven\repository\idea\javax\annotation\javax.annotation-api\1.3.2\javax.annotation-api-1.3.2.jar;D:\maven\repository\idea\org\springframework\spring-core\5.0.5.RELEASE\spring-core-5.0.5.RELEASE.jar;D:\maven\repository\idea\org\springframework\spring-jcl\5.0.5.RELEASE\spring-jcl-5.0.5.RELEASE.jar;D:\maven\repository\idea\org\yaml\snakeyaml\1.19\snakeyaml-1.19.jar;D:\maven\repository\idea\org\apache\commons\commons-lang3\3.5\commons-lang3-3.5.jar;D:\maven\repository\idea\org\apache\tomcat\embed\tomcat-embed-core\8.5.29\tomcat-embed-core-8.5.29.jar;D:\maven\repository\idea\org\apache\tomcat\tomcat-annotations-api\8.5.29\tomcat-annotations-api-8.5.29.jar;D:\maven\repository\idea\org\slf4j\slf4j-api\1.7.25\slf4j-api-1.7.25.jar;D:\maven\repository\idea\log4j\log4j\1.2.17\log4j-1.2.17.jar" com.vae.classLoader.loader.ClassUnLoadTest
sun.misc.Launcher$AppClassLoader===================================
file:/C:/Program%20Files/Java/jdk1.8.0_144/jre/lib/charsets.jar
file:/C:/Program%20Files/Java/jdk1.8.0_144/jre/lib/deploy.jar
file:/C:/Program%20Files/Java/jdk1.8.0_144/jre/lib/ext/access-bridge-64.jar
file:/C:/Program%20Files/Java/jdk1.8.0_144/jre/lib/ext/cldrdata.jar
file:/C:/Program%20Files/Java/jdk1.8.0_144/jre/lib/ext/dnsns.jar
file:/C:/Program%20Files/Java/jdk1.8.0_144/jre/lib/ext/jaccess.jar
file:/C:/Program%20Files/Java/jdk1.8.0_144/jre/lib/ext/jfxrt.jar
file:/C:/Program%20Files/Java/jdk1.8.0_144/jre/lib/ext/localedata.jar
file:/C:/Program%20Files/Java/jdk1.8.0_144/jre/lib/ext/nashorn.jar
file:/C:/Program%20Files/Java/jdk1.8.0_144/jre/lib/ext/sunec.jar
file:/C:/Program%20Files/Java/jdk1.8.0_144/jre/lib/ext/sunjce_provider.jar
file:/C:/Program%20Files/Java/jdk1.8.0_144/jre/lib/ext/sunmscapi.jar
file:/C:/Program%20Files/Java/jdk1.8.0_144/jre/lib/ext/sunpkcs11.jar
file:/C:/Program%20Files/Java/jdk1.8.0_144/jre/lib/ext/zipfs.jar
file:/C:/Program%20Files/Java/jdk1.8.0_144/jre/lib/javaws.jar
file:/C:/Program%20Files/Java/jdk1.8.0_144/jre/lib/jce.jar
file:/C:/Program%20Files/Java/jdk1.8.0_144/jre/lib/jfr.jar
file:/C:/Program%20Files/Java/jdk1.8.0_144/jre/lib/jfxswt.jar
file:/C:/Program%20Files/Java/jdk1.8.0_144/jre/lib/jsse.jar
file:/C:/Program%20Files/Java/jdk1.8.0_144/jre/lib/management-agent.jar
file:/C:/Program%20Files/Java/jdk1.8.0_144/jre/lib/plugin.jar
file:/C:/Program%20Files/Java/jdk1.8.0_144/jre/lib/resources.jar
file:/C:/Program%20Files/Java/jdk1.8.0_144/jre/lib/rt.jar
file:/D:/workRepository/example/case-classLoader/target/classes/
file:/D:/maven/repository/idea/org/springframework/boot/spring-boot-starter/2.0.1.RELEASE/spring-boot-starter-2.0.1.RELEASE.jar
file:/D:/maven/repository/idea/org/springframework/boot/spring-boot/2.0.1.RELEASE/spring-boot-2.0.1.RELEASE.jar
file:/D:/maven/repository/idea/org/springframework/spring-context/5.0.5.RELEASE/spring-context-5.0.5.RELEASE.jar
file:/D:/maven/repository/idea/org/springframework/spring-aop/5.0.5.RELEASE/spring-aop-5.0.5.RELEASE.jar
file:/D:/maven/repository/idea/org/springframework/spring-beans/5.0.5.RELEASE/spring-beans-5.0.5.RELEASE.jar
file:/D:/maven/repository/idea/org/springframework/spring-expression/5.0.5.RELEASE/spring-expression-5.0.5.RELEASE.jar
file:/D:/maven/repository/idea/org/springframework/boot/spring-boot-autoconfigure/2.0.1.RELEASE/spring-boot-autoconfigure-2.0.1.RELEASE.jar
file:/D:/maven/repository/idea/org/springframework/boot/spring-boot-starter-logging/2.0.1.RELEASE/spring-boot-starter-logging-2.0.1.RELEASE.jar
file:/D:/maven/repository/idea/ch/qos/logback/logback-classic/1.2.3/logback-classic-1.2.3.jar
file:/D:/maven/repository/idea/ch/qos/logback/logback-core/1.2.3/logback-core-1.2.3.jar
file:/D:/maven/repository/idea/org/apache/logging/log4j/log4j-to-slf4j/2.10.0/log4j-to-slf4j-2.10.0.jar
file:/D:/maven/repository/idea/org/apache/logging/log4j/log4j-api/2.10.0/log4j-api-2.10.0.jar
file:/D:/maven/repository/idea/org/slf4j/jul-to-slf4j/1.7.25/jul-to-slf4j-1.7.25.jar
file:/D:/maven/repository/idea/javax/annotation/javax.annotation-api/1.3.2/javax.annotation-api-1.3.2.jar
file:/D:/maven/repository/idea/org/springframework/spring-core/5.0.5.RELEASE/spring-core-5.0.5.RELEASE.jar
file:/D:/maven/repository/idea/org/springframework/spring-jcl/5.0.5.RELEASE/spring-jcl-5.0.5.RELEASE.jar
file:/D:/maven/repository/idea/org/yaml/snakeyaml/1.19/snakeyaml-1.19.jar
file:/D:/maven/repository/idea/org/apache/commons/commons-lang3/3.5/commons-lang3-3.5.jar
file:/D:/maven/repository/idea/org/apache/tomcat/embed/tomcat-embed-core/8.5.29/tomcat-embed-core-8.5.29.jar
file:/D:/maven/repository/idea/org/apache/tomcat/tomcat-annotations-api/8.5.29/tomcat-annotations-api-8.5.29.jar
file:/D:/maven/repository/idea/org/slf4j/slf4j-api/1.7.25/slf4j-api-1.7.25.jar
file:/D:/maven/repository/idea/log4j/log4j/1.2.17/log4j-1.2.17.jar
file:/D:/Program%20Files/JetBrains/IntelliJ%20IDEA%20Community%20Edition%202018.3.6/lib/idea_rt.jar
================================================================
Hello World!__ 1 __
file:/f:/v/test.jar
sun.misc.Launcher$AppClassLoader===================================
file:/C:/Program%20Files/Java/jdk1.8.0_144/jre/lib/charsets.jar
file:/C:/Program%20Files/Java/jdk1.8.0_144/jre/lib/deploy.jar
file:/C:/Program%20Files/Java/jdk1.8.0_144/jre/lib/ext/access-bridge-64.jar
file:/C:/Program%20Files/Java/jdk1.8.0_144/jre/lib/ext/cldrdata.jar
file:/C:/Program%20Files/Java/jdk1.8.0_144/jre/lib/ext/dnsns.jar
file:/C:/Program%20Files/Java/jdk1.8.0_144/jre/lib/ext/jaccess.jar
file:/C:/Program%20Files/Java/jdk1.8.0_144/jre/lib/ext/jfxrt.jar
file:/C:/Program%20Files/Java/jdk1.8.0_144/jre/lib/ext/localedata.jar
file:/C:/Program%20Files/Java/jdk1.8.0_144/jre/lib/ext/nashorn.jar
file:/C:/Program%20Files/Java/jdk1.8.0_144/jre/lib/ext/sunec.jar
file:/C:/Program%20Files/Java/jdk1.8.0_144/jre/lib/ext/sunjce_provider.jar
file:/C:/Program%20Files/Java/jdk1.8.0_144/jre/lib/ext/sunmscapi.jar
file:/C:/Program%20Files/Java/jdk1.8.0_144/jre/lib/ext/sunpkcs11.jar
file:/C:/Program%20Files/Java/jdk1.8.0_144/jre/lib/ext/zipfs.jar
file:/C:/Program%20Files/Java/jdk1.8.0_144/jre/lib/javaws.jar
file:/C:/Program%20Files/Java/jdk1.8.0_144/jre/lib/jce.jar
file:/C:/Program%20Files/Java/jdk1.8.0_144/jre/lib/jfr.jar
file:/C:/Program%20Files/Java/jdk1.8.0_144/jre/lib/jfxswt.jar
file:/C:/Program%20Files/Java/jdk1.8.0_144/jre/lib/jsse.jar
file:/C:/Program%20Files/Java/jdk1.8.0_144/jre/lib/management-agent.jar
file:/C:/Program%20Files/Java/jdk1.8.0_144/jre/lib/plugin.jar
file:/C:/Program%20Files/Java/jdk1.8.0_144/jre/lib/resources.jar
file:/C:/Program%20Files/Java/jdk1.8.0_144/jre/lib/rt.jar
file:/D:/workRepository/example/case-classLoader/target/classes/
file:/D:/maven/repository/idea/org/springframework/boot/spring-boot-starter/2.0.1.RELEASE/spring-boot-starter-2.0.1.RELEASE.jar
file:/D:/maven/repository/idea/org/springframework/boot/spring-boot/2.0.1.RELEASE/spring-boot-2.0.1.RELEASE.jar
file:/D:/maven/repository/idea/org/springframework/spring-context/5.0.5.RELEASE/spring-context-5.0.5.RELEASE.jar
file:/D:/maven/repository/idea/org/springframework/spring-aop/5.0.5.RELEASE/spring-aop-5.0.5.RELEASE.jar
file:/D:/maven/repository/idea/org/springframework/spring-beans/5.0.5.RELEASE/spring-beans-5.0.5.RELEASE.jar
file:/D:/maven/repository/idea/org/springframework/spring-expression/5.0.5.RELEASE/spring-expression-5.0.5.RELEASE.jar
file:/D:/maven/repository/idea/org/springframework/boot/spring-boot-autoconfigure/2.0.1.RELEASE/spring-boot-autoconfigure-2.0.1.RELEASE.jar
file:/D:/maven/repository/idea/org/springframework/boot/spring-boot-starter-logging/2.0.1.RELEASE/spring-boot-starter-logging-2.0.1.RELEASE.jar
file:/D:/maven/repository/idea/ch/qos/logback/logback-classic/1.2.3/logback-classic-1.2.3.jar
file:/D:/maven/repository/idea/ch/qos/logback/logback-core/1.2.3/logback-core-1.2.3.jar
file:/D:/maven/repository/idea/org/apache/logging/log4j/log4j-to-slf4j/2.10.0/log4j-to-slf4j-2.10.0.jar
file:/D:/maven/repository/idea/org/apache/logging/log4j/log4j-api/2.10.0/log4j-api-2.10.0.jar
file:/D:/maven/repository/idea/org/slf4j/jul-to-slf4j/1.7.25/jul-to-slf4j-1.7.25.jar
file:/D:/maven/repository/idea/javax/annotation/javax.annotation-api/1.3.2/javax.annotation-api-1.3.2.jar
file:/D:/maven/repository/idea/org/springframework/spring-core/5.0.5.RELEASE/spring-core-5.0.5.RELEASE.jar
file:/D:/maven/repository/idea/org/springframework/spring-jcl/5.0.5.RELEASE/spring-jcl-5.0.5.RELEASE.jar
file:/D:/maven/repository/idea/org/yaml/snakeyaml/1.19/snakeyaml-1.19.jar
file:/D:/maven/repository/idea/org/apache/commons/commons-lang3/3.5/commons-lang3-3.5.jar
file:/D:/maven/repository/idea/org/apache/tomcat/embed/tomcat-embed-core/8.5.29/tomcat-embed-core-8.5.29.jar
file:/D:/maven/repository/idea/org/apache/tomcat/tomcat-annotations-api/8.5.29/tomcat-annotations-api-8.5.29.jar
file:/D:/maven/repository/idea/org/slf4j/slf4j-api/1.7.25/slf4j-api-1.7.25.jar
file:/D:/maven/repository/idea/log4j/log4j/1.2.17/log4j-1.2.17.jar
file:/D:/Program%20Files/JetBrains/IntelliJ%20IDEA%20Community%20Edition%202018.3.6/lib/idea_rt.jar
================================================================
Hello World!__ 2 __
file:/f:/v/v/test.jar
sun.misc.Launcher$AppClassLoader===================================
file:/C:/Program%20Files/Java/jdk1.8.0_144/jre/lib/charsets.jar
file:/C:/Program%20Files/Java/jdk1.8.0_144/jre/lib/deploy.jar
file:/C:/Program%20Files/Java/jdk1.8.0_144/jre/lib/ext/access-bridge-64.jar
file:/C:/Program%20Files/Java/jdk1.8.0_144/jre/lib/ext/cldrdata.jar
file:/C:/Program%20Files/Java/jdk1.8.0_144/jre/lib/ext/dnsns.jar
file:/C:/Program%20Files/Java/jdk1.8.0_144/jre/lib/ext/jaccess.jar
file:/C:/Program%20Files/Java/jdk1.8.0_144/jre/lib/ext/jfxrt.jar
file:/C:/Program%20Files/Java/jdk1.8.0_144/jre/lib/ext/localedata.jar
file:/C:/Program%20Files/Java/jdk1.8.0_144/jre/lib/ext/nashorn.jar
file:/C:/Program%20Files/Java/jdk1.8.0_144/jre/lib/ext/sunec.jar
file:/C:/Program%20Files/Java/jdk1.8.0_144/jre/lib/ext/sunjce_provider.jar
file:/C:/Program%20Files/Java/jdk1.8.0_144/jre/lib/ext/sunmscapi.jar
file:/C:/Program%20Files/Java/jdk1.8.0_144/jre/lib/ext/sunpkcs11.jar
file:/C:/Program%20Files/Java/jdk1.8.0_144/jre/lib/ext/zipfs.jar
file:/C:/Program%20Files/Java/jdk1.8.0_144/jre/lib/javaws.jar
file:/C:/Program%20Files/Java/jdk1.8.0_144/jre/lib/jce.jar
file:/C:/Program%20Files/Java/jdk1.8.0_144/jre/lib/jfr.jar
file:/C:/Program%20Files/Java/jdk1.8.0_144/jre/lib/jfxswt.jar
file:/C:/Program%20Files/Java/jdk1.8.0_144/jre/lib/jsse.jar
file:/C:/Program%20Files/Java/jdk1.8.0_144/jre/lib/management-agent.jar
file:/C:/Program%20Files/Java/jdk1.8.0_144/jre/lib/plugin.jar
file:/C:/Program%20Files/Java/jdk1.8.0_144/jre/lib/resources.jar
file:/C:/Program%20Files/Java/jdk1.8.0_144/jre/lib/rt.jar
file:/D:/workRepository/example/case-classLoader/target/classes/
file:/D:/maven/repository/idea/org/springframework/boot/spring-boot-starter/2.0.1.RELEASE/spring-boot-starter-2.0.1.RELEASE.jar
file:/D:/maven/repository/idea/org/springframework/boot/spring-boot/2.0.1.RELEASE/spring-boot-2.0.1.RELEASE.jar
file:/D:/maven/repository/idea/org/springframework/spring-context/5.0.5.RELEASE/spring-context-5.0.5.RELEASE.jar
file:/D:/maven/repository/idea/org/springframework/spring-aop/5.0.5.RELEASE/spring-aop-5.0.5.RELEASE.jar
file:/D:/maven/repository/idea/org/springframework/spring-beans/5.0.5.RELEASE/spring-beans-5.0.5.RELEASE.jar
file:/D:/maven/repository/idea/org/springframework/spring-expression/5.0.5.RELEASE/spring-expression-5.0.5.RELEASE.jar
file:/D:/maven/repository/idea/org/springframework/boot/spring-boot-autoconfigure/2.0.1.RELEASE/spring-boot-autoconfigure-2.0.1.RELEASE.jar
file:/D:/maven/repository/idea/org/springframework/boot/spring-boot-starter-logging/2.0.1.RELEASE/spring-boot-starter-logging-2.0.1.RELEASE.jar
file:/D:/maven/repository/idea/ch/qos/logback/logback-classic/1.2.3/logback-classic-1.2.3.jar
file:/D:/maven/repository/idea/ch/qos/logback/logback-core/1.2.3/logback-core-1.2.3.jar
file:/D:/maven/repository/idea/org/apache/logging/log4j/log4j-to-slf4j/2.10.0/log4j-to-slf4j-2.10.0.jar
file:/D:/maven/repository/idea/org/apache/logging/log4j/log4j-api/2.10.0/log4j-api-2.10.0.jar
file:/D:/maven/repository/idea/org/slf4j/jul-to-slf4j/1.7.25/jul-to-slf4j-1.7.25.jar
file:/D:/maven/repository/idea/javax/annotation/javax.annotation-api/1.3.2/javax.annotation-api-1.3.2.jar
file:/D:/maven/repository/idea/org/springframework/spring-core/5.0.5.RELEASE/spring-core-5.0.5.RELEASE.jar
file:/D:/maven/repository/idea/org/springframework/spring-jcl/5.0.5.RELEASE/spring-jcl-5.0.5.RELEASE.jar
file:/D:/maven/repository/idea/org/yaml/snakeyaml/1.19/snakeyaml-1.19.jar
file:/D:/maven/repository/idea/org/apache/commons/commons-lang3/3.5/commons-lang3-3.5.jar
file:/D:/maven/repository/idea/org/apache/tomcat/embed/tomcat-embed-core/8.5.29/tomcat-embed-core-8.5.29.jar
file:/D:/maven/repository/idea/org/apache/tomcat/tomcat-annotations-api/8.5.29/tomcat-annotations-api-8.5.29.jar
file:/D:/maven/repository/idea/org/slf4j/slf4j-api/1.7.25/slf4j-api-1.7.25.jar
file:/D:/maven/repository/idea/log4j/log4j/1.2.17/log4j-1.2.17.jar
file:/D:/Program%20Files/JetBrains/IntelliJ%20IDEA%20Community%20Edition%202018.3.6/lib/idea_rt.jar
================================================================
Process finished with exit code 0
由上述可以看出,每次加載進去的jar,與父級SpringBoot的Application的classLoad中的jar是隔離的,每次new出來的MyClassLaoder都是一個新的classLoad,把每次new出來的自定義的classLoad置爲null,等待GC回收,實現卸載jar/class功能。