WebSphere Classloader內存泄漏預防

解決應用程序類加載器泄漏

應用領域 傾向于:

  • 使用應用程序類加載器中的Runnable實現啟動新線程。 即使JEE編程模型不支持此功能,客戶也經常直接創建新線程或通過使用間接創建它們 計時器 客戶必須確保在停止相應的應用程序(或WAR模塊)時停止這些線程:
    • 可以在停止WAR進行清理時使用javax.servlet.ServletContextListener.contextDestroyed進行通知。
  • 使用ThreadLocal的靜態存儲一個ThreadLocal)。 ThreadLocal值有效地作為WeakHashMap存儲在每個Thread中 。 由于這些值通常包括應用程序對象,因此該應用程序對象引用其Class ,該Class引用其ClassLoader ,該ClassLoader引用包含ThreadLocalClass ,弱引用永遠不會中斷,并且會發生泄漏。

    鼓勵客戶避免使用 ThreadLocal ,或者在模塊停止時清除對ThreadLocal的引用(請參見上文),或者確保在每次請求后都調用remove()

  • 向JMX服務器注冊JMX MBean或NotificationListener 。 客戶必須確保在停止相應的應用程序(或WAR模塊)時取消注冊。

任意組件

這包括JDBC提供程序,第三方軟件和本身想要實現以下目的的應用程序:
  • 啟動新線程,包括由java.util.Timer構造函數創建的“定時器線程”。 創建線程時 ,將從原始線程復制兩條信息:
    1. 上下文類加載器( getContextClassLoader() )。 當應用程序正在執行時,容器將上下文類加載器設置為模塊類加載器,因此新創建的線程將在上下文類加載器存在期間保持其活動狀態。 可以通過在啟動計時器之前調用setContextClassLoader到非應用程序類加載器來避免這種情況,然后再將其重置。
    2. 調用線程的AccessControlContext (如AccessController所述 )。 如果線程是由于來自應用程序的API調用而啟動的,則應用程序的ProtectionDomain將位于AccessControlContext中 ,并且應用程序類的ProtectionDomain將包括對其ClassLoader的引用。 通過使用doPrivileged創建線程可以避免這種情況。 請注意,必須注意確保使用doPrivileged不允許非特權應用程序創建線程。

    例如:

    // 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);}}
    });
  • 將數據與當前上下文類加載器關聯。 這通常是通過Map <classloader Value> </ classloader完成的 。 此地圖必須:
    1. 具有明確的生命周期API。 在這種情況下,必須調用生命周期API。 如果代碼是由客戶介紹的,則客戶負責添加JMX偵聽器。 如果代碼是由WAS prereq引入的,則所有者必須使用WAS應用程序偵聽器API。 如果代碼屬于JDK,則運行時團隊將承擔調用它的責任(例如ResourceBundle.clearCacheIntrospector.flushCaches )。
    2. 成為WeakHashMap以允許對ClassLoader鍵進行垃圾收集。 請注意,該值不得包含對從該ClassLoader創建的類或對象的非弱引用,否則該條目將永遠不會被刪除。 WeakHashMap <ClassLoader,WeakReference <Class >>或WeakHashMap <ClassLoader,Tuple>,其中Tuple包含從類實例化的對象的WeakReference <Class>和WeakReference <Object>。 在這兩種情況下,Class的保持都很弱,這仍然允許ClassLoader的收集。 在后一種情況下,如果發生GC,將清除對實例化對象的引用,但假定可以廉價地重新實例化它。

    這些提示由WAS專家Brett Kail提供

    參考:來自JCG合作伙伴的 WebSphere Classloader內存泄漏預防 ? All Things WebSphere博客上的Rohit Kelapure。


    翻譯自: https://www.javacodegeeks.com/2012/03/websphere-classloader-memory-leak.html

    本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
    如若轉載,請注明出處:http://www.pswp.cn/news/373459.shtml
    繁體地址,請注明出處:http://hk.pswp.cn/news/373459.shtml
    英文地址,請注明出處:http://en.pswp.cn/news/373459.shtml

    如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

    相關文章

    airflow sql_alchemy_conn mysql_airflow使用mysql數據庫,LocalExecutor并發調度

    mysql-airflow在mysql上執行create database airflow; —— 創建數據庫GRANT all privileges on airflow.* TO airflow% IDENTIFIED BY 123456; —— 將數據庫airflow的所有權限授權airflow用戶&#xff0c;密碼123456且該用戶可在任何IP段登錄操作FLUSH PRIVILEGES; —— 刷新…

    【SAP業務模式】之ICS(四):組織單元的配置

    SAP的ICS業務后臺配置主要有以下幾個配置點&#xff1a; 1、組織單元的配置&#xff08;公司代碼、銷售組織、工廠、采購組織等&#xff09;&#xff1b; 2、主數據的部分&#xff1b; 3、訂單和開票的定價過程&#xff1b; 4、開票輸出類型&#xff1b; 5、公司間發票的配置&a…

    poj-2478 Farey Sequence(dp,歐拉函數)

    題目鏈接&#xff1a; Farey Sequence Time Limit: 1000MS Memory Limit: 65536KTotal Submissions: 14230 Accepted: 5624Description The Farey Sequence Fn for any integer n with n > 2 is the set of irreducible rational numbers a/b with 0 < a < b < n a…

    Twitter4j和Esper:在Twitter上跟蹤用戶情緒

    對于復雜事件處理和Twitter API的新手&#xff0c;我希望這是一個簡短的教程&#xff0c;可以幫助他們Swift起步。 管理大數據并從中挖掘有用的信息是當前技術中最熱門的討論主題。 來自Twitter&#xff0c;Facebook和Linkedin等社交網絡的半結構化數據的爆炸式增長使Hadoop&am…

    webase crud查看所有表_Laravel-Gii 可視化代碼生成工具 CRUD +GUI

    Laravel-Gii 可視化代碼生成工具 CRUD GUI適用于快速B端后臺開發&#xff0c;根據MySQL的表結構生成對應的Model、Observer、Controller、View、Route等相關項目文件[TOC]注意因為是解析MySQL的表結構&#xff0c;并且根據字段生成模板&#xff0c;所以目前生成的Model類時只支…

    20145231第二周Java學習筆記

    20145231 《Java程序設計》第2周學習總結 教材學習內容總結 本周的學習采用的依然是先看課本&#xff0c;再看視頻&#xff0c;然后實踐敲代碼&#xff0c;最后根據學習筆記總結完成博客。 第三章&#xff1a;基礎語法 知識點比較多比較零碎&#xff0c;整理的都是實際操作中可…

    JavaFX 2.0和Scala,像牛奶和餅干

    JavaFX 2.0和Scala都是很好的技術&#xff0c;但是一起使用時效果會更好。 JavaFX 2.0是一種功能強大的富客戶端技術&#xff0c;具有先進的圖形&#xff0c;動畫和媒體功能。 Scala是一種簡單但功能強大的語言&#xff0c;具有用于編寫特定于域的語言&#xff08;DSL&#xff…

    ASP.NET WebAPi之斷點續傳下載(上)

    前言 之前一直感覺斷點續傳比較神秘&#xff0c;于是想去一探究竟&#xff0c;不知從何入手&#xff0c;以為就寫寫邏輯就行&#xff0c;結果搜索一番&#xff0c;還得了解相關http協議知識&#xff0c;又花了許久功夫去看http協議中有關斷點續傳知識&#xff0c;有時候發覺東西…

    貪吃蛇(C++實現,VC6.0編譯,使用了EasyX圖形庫)

    程序效果&#xff1a; 代碼&#xff1a; //main.cpp 1 #include <iostream>2 #include<fstream>3 #include <graphics.h>4 #include <conio.h>5 #include<ctime>6 #include<windows.h>7 #include<mmsystem.h>8 #pragma comment(lib…

    3.0 C++遠征:is a

    4-4is_a 0.派生類Soldier繼承自基類Person //Person.h class Person { public:Person(string name "Jim");~Person();void play(); protected:string m_strName; };//Soldier.h class Soldier : public Person { public:Soldier(string name "James", in…

    python中sorted的用法append_python sorted()排序詳解

    排序&#xff0c;在編程中經常遇到的算法&#xff0c;我也在幾篇文章中介紹了一些關于排序的算法。有的高級語言內置了一些排序函數。本文講述Python在這方面的工作。供使用內置函數sorted()/list.sort()的使用簡單應用python對list有一個內置函數&#xff1a;>>> a[5…

    云上的播放框架變得簡單:Openshift模塊

    僅僅幾年前&#xff0c;找到一個負擔得起的Java Web應用程序托管解決方案是一項艱巨的任務&#xff0c;而尋找免費的托管解決方案是一項不可能的任務。 更不用說甚至考慮自動縮放&#xff0c;單命令部署&#xff0c;持續集成等事情&#xff0c;這都是科幻小說。 去年見證了云計…

    C#中的yield return與Unity中的Coroutine(協程)(下)

    Unity中的Coroutine&#xff08;協程&#xff09; 估計熟悉Unity的人看過或者用過StartCoroutine() 假設我們在場景中有一個UGUI組件&#xff0c; Image&#xff1a; 將以下代碼綁定到Image 1 using UnityEngine;2 using System.Collections;3 using System.Threading;4 using …

    字節流轉化為文件流_C#文件轉換為字節流及字節流轉換為文件

    本文講解了C#實現文件轉換為字節流的方法。文件轉換為字節流的步驟如下1、通過文件流打開指定文件(FileStream fs)&#xff1b;2、定義字節流(byte[] fileBytenew byte[fs.Length])&#xff1b;3、把文件讀取到字節流(fs.Read(fileByte,0,fileByte.Length))&#xff1b;4、關閉…

    Spring和JSF集成:導航

    我希望這是有關我在Spring和JavaServer Faces之間提供深度集成的努力的一系列博客中的第一篇。 這里提到的所有內容都是“正在進行中的工作”&#xff0c;因此&#xff0c;如果您簽出代碼&#xff0c;請注意它是一個不斷變化的目標。 期待一些粗糙的邊緣&#xff0c;如果有時會…

    【CSS3動畫】transform對文字及圖片的旋轉、縮放、傾斜和移動

    前言&#xff1a;之前我有寫過CSS3的transform這一這特性&#xff0c;對于它的用法&#xff0c;還不是很透徹&#xff0c;今天補充補充&#xff0c;呵呵 你懂的&#xff0c;小司機準備開車了。 a)再提一提transform的四個屬性 ①旋轉--->rotate(參數a)&#xff0c;單位deg&a…

    宏的用法與簡介

    預處理指令&#xff1a;例如&#xff1a;#include<stdio.h> #include<stdlib.h> #define MAX 20 ............. 因為他們由預處理器解釋的&#xff0c;所以稱作預處理指令。預處理器讀取源代碼&#xff0c;然后對其修改&#xff0c;并把修改過的…

    django 日志寫入mysql_如何將django orm模型 寫入數據庫

    1、指定連接pymysql(python3.x)先配置_init_.pyimport pymysqlpymysql.install_as_MySQLdb()2、配置連接mysql文件信息settings.pyDATABASES {default: {ENGINE: django.db.backends.mysql,NAME: django_orm, #你的數據庫名稱USER: root, #你的數據庫用戶名PASSWORD: , #你的數…

    ORM的問題第2部分–查詢

    在我以前關于對象關系映射工具&#xff08;ORM&#xff09;的帖子中&#xff0c;我討論了在處理當今常見的ORM&#xff08;包括Hibernate&#xff09;時遇到的各種問題。 其中包括與從POJO生成架構有關的問題&#xff0c;實際性能和不斷出現的維護問題。 本質上&#xff0c;結論…

    【轉】如何減少接口響應時間

    Premature optimization is the root of all evil. — Donald Knuth 對于程序優化&#xff0c;我一直采取保守的態度&#xff0c;除非萬不得已。但是隨著業務的不斷發展&#xff0c;程序越來越復雜&#xff0c;代碼越寫越多&#xff0c;優化似乎是終有一天會到來的事情。 那么對…