กำลังโหลดคลาสด้วย classloaders ที่แตกต่างกันเพื่อยกเลิกการโหลดจาก JVM เมื่อไม่ต้องการ

ในแอปพลิเคชันของฉันฉันใช้ ServiceLoader เพื่อโหลดโมดูล (คลาสจากไฟล์ .jar) ด้วย ClassLoaders ที่แตกต่างกันเพื่อยกเลิกการโหลดอย่างสมบูรณ์เมื่อไม่ต้องการจากบริบทของแอปพลิเคชันและจาก JVM เอง ฉันรู้ว่าอาจไม่ใช่หัวข้อทั่วไป "ยกเลิกการโหลดคลาสจาก JVM" มีเงื่อนไขบางประการที่จะเกิดขึ้น ดังนั้นฉันจึงพยายามอย่างเต็มที่ เพื่อให้แน่ใจว่าทุกอย่างทำงานตามที่คาดไว้ ฉันกำลังติดตามโหลดและยกเลิกการโหลดคลาสด้วย -XX:+TraceClassLoading และ -XX:+TraceClassUnloading ข้อมูลจากพารามิเตอร์นี้แสดงให้ฉันเห็นว่าฉันสามารถทำการยกเลิกการโหลดโมดูลใด ๆ ได้อย่างสมบูรณ์จาก mi และจาก JVM เอง (การยกเลิกการโหลดจาก JVM เกิดขึ้นระหว่าง GC ที่สมบูรณ์) ทั้งหมดนี้ดูเหมือนว่าจะทำงานได้ดี ... แต่คำถามของฉันคือเหตุใดไฟล์ .jar จากที่ที่โหลดคลาสโมดูลถูกเปิดโดย JVM ต่อไป ซึ่ง .jars ไม่สามารถลบออกได้ แต่ JVM บอกว่าได้ยกเลิกการโหลดคลาสจากพวกเขา . แน่นอนว่านี่คือระหว่างการดำเนินการ JVM แต่ทำไมต้องเปิดไฟล์ .jar นั้นต่อไปถ้า JVM ไม่มีคลาสที่โหลดจากพวกเขา มีสิ่งใดบ้างที่ฉันสามารถทำได้เพื่อบังคับให้ JVM ปล่อยไฟล์ .jar นั้น


person Wyvern666    schedule 08.09.2011    source แหล่งที่มา


คำตอบ (1)


ควรศึกษาปัญหาการโหลด/ยกเลิกการโหลดคลาสอย่างละเอียดภายในเว็บคอนเทนเนอร์ต่างๆ

googling บางตัวแสดงให้เห็นว่า Tomcat 6.x มีตัวเลือก antiJARLocking ซึ่งตัวเลือกนั้นใช้ในแหล่ง Tomcat ที่ http://svn.apache.org/repos/asf/tomcat/tc6.0.x/trunk/java/org/apache/catalina/loader/

โปรดอ่านแหล่งที่มาแล้วคุณจะได้รับตัวอย่างโค้ดโหลด / ยกเลิกการโหลดที่นั่น

person ya_pulser    schedule 08.09.2011
comment
ข้อมูลเกี่ยวกับ antiJARLocking ระบุว่า: หากเป็นจริง Tomcat classloader จะใช้มาตรการเพิ่มเติมเพื่อหลีกเลี่ยงการล็อกไฟล์ JAR เมื่อมีการเข้าถึงทรัพยากรภายใน JAR ผ่าน URL สิ่งนี้จะส่งผลกระทบต่อเวลาเริ่มต้นของแอปพลิเคชัน แต่อาจพิสูจน์ได้ว่ามีประโยชน์บนแพลตฟอร์มหรือการกำหนดค่าที่อาจเกิดการล็อคไฟล์ได้ ดังนั้นคุณแนะนำให้ทำแบบเดียวกันกับ Tomcat หรือไม่ และ JVM ไม่ฉลาดพอที่จะปล่อยไฟล์ใช่ไหม - person Wyvern666; 09.09.2011