亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Tomcat 檢測內(nèi)存泄漏實例詳解

 更新時間:2016年12月31日 10:17:47   投稿:lqh  
這篇文章主要介紹了 Tomcat 檢測內(nèi)存泄漏實例詳解的相關(guān)資料,需要的朋友可以參考下

 Tomcat如何檢測內(nèi)存泄漏

一般情況下,如果我們重啟web應用是通過重啟tomcat的話,則不存在內(nèi)存泄漏問題。但如果不重啟tomcat而對web應用進行重加載則可能會導致內(nèi)存泄漏,因為重加載后有可能會導致原來的某些內(nèi)存無法讓GC回收,例如web應用使用了JDBC,驅(qū)動會進行注冊,當web應用停止時沒有反注冊就會導致內(nèi)存泄漏。

看看是什么原因?qū)е聇omcat內(nèi)存泄漏的。這個要從熱部署開始說起,因為tomcat提供了不必重啟容器而只需重啟web應用以達到熱部署的功能,其實現(xiàn)是通過定義一個WebappClassLoader類加載器,當熱部署時就將原來的類加載器廢棄并重新實例化一個WebappClassLoader類加載器。但這種方式可能存在內(nèi)存泄漏問題,因為ClassLoader是一個結(jié)構(gòu)復雜的對象,導致它不能被GC回收的可能性比較多,除了對ClassLoader對象有引用可能導致其無法回收,還可能對其加載的元數(shù)據(jù)(方法、類、字段等)有引用都會導致無法被GC回收。

如上圖,tomcat的資源由不同類加載器加載,這里只看BootstrapClassLoader和WebappClassLoader兩個類加載器,BootstrapClassLoader負責加載rt.jar包的Java.sql.DriverManager,WebappClassLoader負責加載web應用中的MySQL驅(qū)動包,其中有一個很重要的步驟是mysql的驅(qū)動類需要注冊到DriverManager中,即DriverManager.registerDriver(new Driver()),它由mysql驅(qū)動包自動完成。這樣一來當web應用進行熱部署操作時,沒有將mysql的Driver從DriverManager中反注冊掉的話,則會導致整個WebappClassLoader回收不了,造成內(nèi)存泄漏。

接著看tomcat如何對此內(nèi)存泄漏進行監(jiān)控的,要判斷WebappClassLoader會不會導致內(nèi)存泄漏只需判斷WebappClassLoader有沒有被GC回收即可。在Java中有一種引用叫弱引用,它能很好判斷WebappClassLoader有沒有被GC回收,被弱引用關(guān)聯(lián)的對象只能生存到下一次垃圾回收發(fā)生之前,即如果某WebappClassLoader對象只被某弱引用關(guān)聯(lián),則它會在下次垃圾回收時被回收,但如果WebappClassLoader對象除了被弱引用關(guān)聯(lián)外還被其他對象強引用,那么WebappClassLoader對象是不會被回收的,根據(jù)這些條件就可以判斷是否有WebappClassLoader內(nèi)存泄漏了。

Tomcat的實現(xiàn)是通過WeakHashMap來實現(xiàn)弱引用的,只需將WebappClassLoader對象put到WeakHashMap中,例如weakMap.put(“a”,webappClassLoader),當webappClassLoader及其包含的元素沒有被其它任何類加載器中的元素引用到時,JVM發(fā)生垃圾回收時則會把webappClassLoader對象回收。

簡單的實現(xiàn)代碼大致如下:

public class MemoryLeakTest{
private Map<ClassLoader, String> childClassLoaders = new WeakHashMap<ClassLoader, String>();
public String[] findReloadedContextMemoryLeaks() {
    System.gc();
    List<String> result = new ArrayList<String>();
    for (Map.Entry<ClassLoader, String> entry : childClassLoaders.entrySet()) {
      ClassLoader cl = entry.getKey();
      if (!((WebappClassLoader) cl).isStarted()) {
        result.add(entry.getValue());
      }
    }
    return result.toArray(new String[result.size()]);
  }
}

使用一個WeakHashMap用于跟蹤WebappClassLoader,在查找內(nèi)存泄漏之前會先強制調(diào)用System.gc();進行一次垃圾回收,保證沒問題的WebappClassLoader都被回收掉,這時如果還有WebappClassLoader的狀態(tài)是非started(正常啟動的都為started,關(guān)閉了的則為非started)的,則是未被垃圾回收的WebappClassLoader,屬于內(nèi)存泄漏的。

感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!

相關(guān)文章

  • 關(guān)于如何將tomcat卸載干凈記錄

    關(guān)于如何將tomcat卸載干凈記錄

    Tomcat軟件自帶卸載工具無法將自身卸載干凈,卸載后注冊表、服務項仍然存在,導致后續(xù)安裝的新版本Tomcat無法正常使用,這篇文章主要給大家介紹了關(guān)于如何將tomcat卸載干凈的相關(guān)資料,需要的朋友可以參考下
    2023-06-06
  • 如何在mac的terminal安裝Apache Tomcat

    如何在mac的terminal安裝Apache Tomcat

    這篇文章主要介紹了在mac的terminal安裝Apache Tomcat 的方法,需要的朋友參考下吧
    2017-05-05
  • tomcat部署jenkins項目的實現(xiàn)示例

    tomcat部署jenkins項目的實現(xiàn)示例

    Jenkins自動化部署可以解決集成、測試、部署等重復性的工作,本文主要介紹了tomcat部署jenkins項目,具有一定的參考價值,感興趣的可以了解一下
    2023-11-11
  • tomcat服務器安全設置方法

    tomcat服務器安全設置方法

    這篇文章主要介紹了tomcat服務器安全設置方法,需要的朋友可以參考下
    2019-11-11
  • tomcat的catalina.out日志按自定義時間格式進行分割的操作方法

    tomcat的catalina.out日志按自定義時間格式進行分割的操作方法

    這篇文章主要介紹了tomcat的catalina.out日志按自定義時間格式進行分割,包括安裝Cronolog,修改Tomcat下bin/catalina.sh文件,shell利用crontab自動清除日志的相關(guān)知識,需要的朋友可以參考下
    2022-04-04
  • 圖解Linux下安裝Tomcat服務器

    圖解Linux下安裝Tomcat服務器

    這篇文章主要以圖文結(jié)合的方式為大家詳細介紹了Linux下安裝Tomcat服務器的詳細過程,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-10-10
  • Tomcat報錯: JDBC unregister 解決辦法

    Tomcat報錯: JDBC unregister 解決辦法

    這篇文章主要介紹了Tomcat報錯: JDBC unregister 解決辦法的相關(guān)資料,需要的朋友可以參考下
    2017-05-05
  • Linux小技巧分享之如何重新啟動tomcat

    Linux小技巧分享之如何重新啟動tomcat

    在Linux系統(tǒng)下,如何重啟Tomcat呢?答曰:使用命令操作的!咳咳,這不是廢話嗎。其實tomcat的安裝目錄有關(guān)閉,重啟的腳本的,只要執(zhí)行他們就可以了,下面我們來詳細說明下
    2014-08-08
  • 解決運行Tomcat之后仍然出現(xiàn)404的問題

    解決運行Tomcat之后仍然出現(xiàn)404的問題

    這篇文章主要介紹了解決運行Tomcat之后仍然出現(xiàn)404的問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • tomcat設置開機自啟的幾種方法(包含無service.bat文件設置)

    tomcat設置開機自啟的幾種方法(包含無service.bat文件設置)

    工作中需要設置windows系統(tǒng)下的tomcat開機自啟,本文主要介紹了tomcat設置開機自啟的幾種方法,包含正常安裝版本tomcat和免安裝tomcat(無service.bat)兩種情況,具有一定的參考價值,感興趣的可以了解一下
    2024-06-06

最新評論