2
ประสิทธิภาพของ FactoryFinder / การแคชไม่ดี
ฉันมีแอปพลิเคชัน Java ee ค่อนข้างใหญ่ที่มี classpath ขนาดใหญ่ที่ทำการประมวลผล xml จำนวนมาก ขณะนี้ฉันกำลังพยายามเพิ่มความเร็วฟังก์ชั่นบางอย่างของฉันและค้นหาเส้นทางของรหัสที่ช้าโดยใช้เครื่องมือเก็บตัวอย่าง สิ่งหนึ่งที่ฉันสังเกตเห็นคือโดยเฉพาะอย่างยิ่งส่วนต่าง ๆ ของรหัสของเราที่เรามีการเรียกเช่นTransformerFactory.newInstance(...)ช้ามาก ฉันติดตามสิ่งนี้เป็นFactoryFinderวิธีfindServiceProviderการสร้างServiceLoaderอินสแตนซ์ใหม่เสมอ ในServiceLoader javadocฉันพบบันทึกย่อต่อไปนี้เกี่ยวกับการแคช: ผู้ให้บริการตั้งอยู่และยกตัวอย่างขี้เกียจนั่นคือตามความต้องการ ตัวโหลดเซอร์วิสรักษาแคชของตัวให้บริการที่ถูกโหลดไปแล้ว การร้องขอเมธอด iterator แต่ละครั้งจะส่งคืนตัววนซ้ำที่ให้องค์ประกอบทั้งหมดของแคชตามลำดับการเริ่มต้นจากนั้นหาตำแหน่งอย่างเกียจคร้านแล้วค้นหาตำแหน่งของผู้ให้บริการที่เหลืออยู่อย่างเกียจคร้าน แคชสามารถล้างได้ด้วยวิธีการโหลดซ้ำ จนถึงตอนนี้ดีมาก นี่เป็นส่วนหนึ่งของFactoryFinder#findServiceProviderวิธีการOpenJDKs : private static <T> T findServiceProvider(final Class<T> type) throws TransformerFactoryConfigurationError { try { return AccessController.doPrivileged(new PrivilegedAction<T>() { public T run() { final ServiceLoader<T> serviceLoader = ServiceLoader.load(type); final …