วิธีเดียวที่ Class สามารถยกเลิกการโหลดคือถ้า Classloader ใช้เป็นขยะที่รวบรวม ซึ่งหมายความว่าการอ้างอิงถึงทุก ๆ คลาสและตัวโหลดคลาสเองต้องไปตามทางของโดโด
ทางออกหนึ่งที่เป็นไปได้สำหรับปัญหาของคุณคือมี Classloader สำหรับไฟล์ jar ทุกไฟล์และ Classloader สำหรับ AppServers แต่ละตัวที่มอบหมายการโหลดคลาสจริงให้กับ Classloaders Jar เฉพาะ ด้วยวิธีนี้คุณสามารถชี้ไปที่ไฟล์ jar เวอร์ชันต่างๆสำหรับทุกเซิร์ฟเวอร์แอป
แม้ว่ามันจะไม่สำคัญก็ตาม แพลตฟอร์ม OSGi พยายามทำเช่นนี้เนื่องจากแต่ละบันเดิลมี classloader ที่แตกต่างกันและการพึ่งพาได้รับการแก้ไขโดยแพลตฟอร์ม บางทีทางออกที่ดีก็คือดูที่มัน
หากคุณไม่ต้องการใช้ OSGI การใช้งานที่เป็นไปได้หนึ่งอย่างคือการใช้JarClassloaderคลาสหนึ่งอินสแตนซ์สำหรับไฟล์ JAR ทุกไฟล์
และสร้างคลาส MultiClassloader ใหม่ที่ขยาย Classloader คลาสนี้ภายในจะมีอาร์เรย์ (หรือรายการ) ของ JarClassloaders และในเมธอด defineClass () จะวนซ้ำผ่าน classloaders ภายในทั้งหมดจนกว่าจะสามารถหาคำจำกัดความได้หรือ NoClassDefFoundException ถูกโยนทิ้ง สามารถให้เมธอด accessor สองวิธีเพื่อเพิ่ม JarClassloaders ใหม่ให้กับคลาส มีการใช้งานที่เป็นไปได้หลายอย่างในเน็ตสำหรับ MultiClassLoader ดังนั้นคุณอาจไม่จำเป็นต้องเขียนด้วยตัวเอง
หากคุณทำการติดตั้ง MultiClassloader สำหรับทุกการเชื่อมต่อกับเซิร์ฟเวอร์โดยหลักการแล้วเป็นไปได้ว่าเซิร์ฟเวอร์ทุกเครื่องจะใช้คลาสเดียวกันในเวอร์ชันที่แตกต่างกัน
ฉันใช้แนวคิด MultiClassloader ในโครงการที่มีคลาสที่มีสคริปต์ที่ผู้ใช้กำหนดเองต้องโหลดและยกเลิกการโหลดจากหน่วยความจำและทำงานได้ค่อนข้างดี