WebSphere Classloader内存泄漏预防
生活随笔
收集整理的這篇文章主要介紹了
WebSphere Classloader内存泄漏预防
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
解決應(yīng)用程序類加載器泄漏 具有明確的生命周期API。 在這種情況下,必須調(diào)用生命周期API。 如果代碼是由客戶介紹的,則客戶負(fù)責(zé)添加JMX偵聽器。 如果代碼是由WAS prereq引入的,則所有者必須使用WAS應(yīng)用程序偵聽器API。 如果代碼屬于JDK,則運(yùn)行時(shí)團(tuán)隊(duì)將承擔(dān)調(diào)用它的責(zé)任(例如ResourceBundle.clearCache和Introspector.flushCaches )。 成為WeakHashMap以允許對(duì)ClassLoader鍵進(jìn)行垃圾收集。 請(qǐng)注意,該值不得包含對(duì)從該ClassLoader創(chuàng)建的類或?qū)ο蟮姆侨跻?#xff0c;否則該條目將永遠(yuǎn)不會(huì)被刪除。 WeakHashMap <ClassLoader,WeakReference <Class >>或WeakHashMap <ClassLoader,Tuple>,其中Tuple包含從類實(shí)例化的對(duì)象的WeakReference <Class>和WeakReference <Object>。 在這兩種情況下,Class的保持都很弱,這仍然允許ClassLoader的收集。 在后一種情況下,如果發(fā)生GC,將清除對(duì)實(shí)例化對(duì)象的引用,但假定可以廉價(jià)地重新實(shí)例化它。
這些提示由WAS專家Brett Kail提供
應(yīng)用領(lǐng)域 傾向于:
- 使用應(yīng)用程序類加載器中的Runnable實(shí)現(xiàn)啟動(dòng)新線程。 即使JEE編程模型不支持此功能,客戶也經(jīng)常直接創(chuàng)建新線程或通過使用間接創(chuàng)建它們 計(jì)時(shí)器 客戶必須確保在停止相應(yīng)的應(yīng)用程序(或WAR模塊)時(shí)停止這些線程:
- 可以在停止WAR進(jìn)行清理時(shí)使用javax.servlet.ServletContextListener.contextDestroyed進(jìn)行通知。
- 使用ThreadLocal的 ( 靜態(tài)存儲(chǔ)一個(gè)ThreadLocal)。 ThreadLocal值有效地作為WeakHashMap存儲(chǔ)在每個(gè)Thread中 。 由于這些值通常包括應(yīng)用程序?qū)ο?#xff0c;因此該應(yīng)用程序?qū)ο笠闷銫lass ,該Class引用其ClassLoader ,該ClassLoader引用包含ThreadLocal的Class ,弱引用永遠(yuǎn)不會(huì)中斷,并且會(huì)發(fā)生泄漏。
鼓勵(lì)客戶避免使用 ThreadLocal ,或者在模塊停止時(shí)清除對(duì)ThreadLocal的引用(請(qǐng)參見上文),或者確保在每次請(qǐng)求后都調(diào)用remove() 。
- 向JMX服務(wù)器注冊(cè)JMX MBean或NotificationListener 。 客戶必須確保在停止相應(yīng)的應(yīng)用程序(或WAR模塊)時(shí)取消注冊(cè)。
任意組件
這包括JDBC提供程序,第三方軟件和本身想要實(shí)現(xiàn)以下目的的應(yīng)用程序:- 啟動(dòng)新線程,包括由java.util.Timer構(gòu)造函數(shù)創(chuàng)建的“定時(shí)器線程”。 創(chuàng)建線程時(shí) ,將從原始線程復(fù)制兩條信息:
- 上下文類加載器( getContextClassLoader() )。 當(dāng)應(yīng)用程序正在執(zhí)行時(shí),容器將上下文類加載器設(shè)置為模塊類加載器,因此新創(chuàng)建的線程將在上下文類加載器存在期間保持其活動(dòng)狀態(tài)。 可以通過在啟動(dòng)計(jì)時(shí)器之前調(diào)用setContextClassLoader到非應(yīng)用程序類加載器來避免這種情況,然后再將其重置。
- 調(diào)用線程的AccessControlContext (如AccessController所述 )。 如果線程是由于來自應(yīng)用程序的API調(diào)用而啟動(dòng)的,則應(yīng)用程序的ProtectionDomain將位于AccessControlContext中 ,并且應(yīng)用程序類的ProtectionDomain將包括對(duì)其ClassLoader的引用。 通過使用doPrivileged創(chuàng)建線程可以避免這種情況。 請(qǐng)注意,必須注意確保使用doPrivileged不允許非特權(quán)應(yīng)用程序創(chuàng)建線程。
- 將數(shù)據(jù)與當(dāng)前上下文類加載器關(guān)聯(lián)。 這通常是通過Map <classloader Value> </ classloader完成的 。 此地圖必須:
例如:
// doPrivileged fixes the AccessControlContext leak, and it is also required // for calls to Thread.get/setContextClassLoader. Timer timer = AccessController.doPrivileged(new PrivilegedAction() {public void run() {Thread thread = Thread.currentThread();ClassLoader savedCL = thread.getContextClassLoader();thread.setContextClassLoader(null);try {// The Timer constructor will create a Thread, which will copy the// context class loader from the current thread, which is now null.return new Timer(true);} finally {thread.setContextClassLoader(savedCL);}} });這些提示由WAS專家Brett Kail提供
參考:來自JCG合作伙伴的 WebSphere Classloader內(nèi)存泄漏預(yù)防 ? All Things WebSphere博客上的Rohit Kelapure。
翻譯自: https://www.javacodegeeks.com/2012/03/websphere-classloader-memory-leak.html
總結(jié)
以上是生活随笔為你收集整理的WebSphere Classloader内存泄漏预防的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 低端电脑如何超频内存(电脑怎么内存超频)
- 下一篇: 摩托罗拉edge X30价格详细介绍