websphere内存设置_WebSphere Classloader内存泄漏预防
生活随笔
收集整理的這篇文章主要介紹了
websphere内存设置_WebSphere Classloader内存泄漏预防
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
websphere內(nèi)存設(shè)置
解決應(yīng)用程序類加載器泄漏應(yīng)用領(lǐng)域 傾向于:
- 使用應(yīng)用程序類加載器中的Runnable實現(xiàn)啟動新線程。 即使JEE編程模型不支持此功能,客戶也經(jīng)常直接創(chuàng)建新線程或通過使用間接創(chuàng)建它們 計時器 客戶必須確保在停止相應(yīng)的應(yīng)用程序(或WAR模塊)時停止這些線程:
- 可以在停止WAR進行清理時使用javax.servlet.ServletContextListener.contextDestroyed進行通知。
- 使用ThreadLocal的 ( 靜態(tài)存儲一個ThreadLocal)。 ThreadLocal值有效地存儲為每個Thread中的 WeakHashMap 。 由于這些值通常包含應(yīng)用程序?qū)ο?#xff0c;因此該應(yīng)用程序?qū)ο笠闷銫lass ,該Class引用其ClassLoader ,該ClassLoader引用包含ThreadLocal的Class ,弱引用永遠不會中斷,并且會發(fā)生泄漏。
鼓勵客戶避免使用 ThreadLocal ,或者在模塊停止時清除對ThreadLocal的引用(請參見上文),或確保在每次請求后都調(diào)用remove() 。
- 向JMX服務(wù)器注冊JMX MBean或NotificationListener 。 客戶必須確保在停止相應(yīng)的應(yīng)用程序(或WAR模塊)時取消注冊。
任意組件
這包括JDBC提供程序,第三方軟件和本身想要實現(xiàn)以下目的的應(yīng)用程序:- 啟動新線程,包括由java.util.Timer構(gòu)造函數(shù)創(chuàng)建的“定時器線程”。 創(chuàng)建線程時 ,將從原始線程復(fù)制兩條信息:
- 上下文類加載器( getContextClassLoader() )。 當(dāng)應(yīng)用程序正在執(zhí)行時,容器將上下文類加載器設(shè)置為模塊類加載器,因此新創(chuàng)建的線程將在上下文類加載器存在期間保持其活動狀態(tài)。 可以通過在啟動計時器之前調(diào)用setContextClassLoader到非應(yīng)用程序類加載器來避免這種情況,然后再將其重置。
- 調(diào)用線程的AccessControlContext (如AccessController所述 )。 如果線程是由于來自應(yīng)用程序的API調(diào)用而正在啟動,則應(yīng)用程序的ProtectionDomain將位于AccessControlContext中 ,并且應(yīng)用程序類的ProtectionDomain將包括對其ClassLoader的引用。 通過使用doPrivileged創(chuà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
websphere內(nèi)存設(shè)置
總結(jié)
以上是生活随笔為你收集整理的websphere内存设置_WebSphere Classloader内存泄漏预防的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 女朋友用英语怎么说 女朋友英文简介
- 下一篇: 年迈反义词是什么? 年迈的反义词介绍