最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

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

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

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

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

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

Tomcat的實現(xiàn)是通過WeakHashMap來實現(xiàn)弱引用的,只需將WebappClassLoader對象put到WeakHashMap中,例如weakMap.put(“a”,webappClassLoader),當(dāng)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)存泄漏之前會先強(qiáng)制調(diào)用System.gc();進(jìn)行一次垃圾回收,保證沒問題的WebappClassLoader都被回收掉,這時如果還有WebappClassLoader的狀態(tài)是非started(正常啟動的都為started,關(guān)閉了的則為非started)的,則是未被垃圾回收的WebappClassLoader,屬于內(nèi)存泄漏的。

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

相關(guān)文章

  • 一篇文章講透Tomcat的類加載機(jī)制

    一篇文章講透Tomcat的類加載機(jī)制

    Tomcat的類加載機(jī)制是違反了雙親委托原則的,對于一些未加載的非基礎(chǔ)類,各個web應(yīng)用自己的類加載器會優(yōu)先加載,加載不到時再交給commonClassLoader走雙親委托,這篇文章主要給大家介紹了如何通過一篇文章講透Tomcat的類加載機(jī)制的相關(guān)資料,需要的朋友可以參考下
    2021-11-11
  • 詳解tomcat各個端口的作用

    詳解tomcat各個端口的作用

    這篇文章主要介紹了詳解tomcat各個端口的作用,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-10-10
  • tomcat?啟動時卡住問題排查及解決方法

    tomcat?啟動時卡住問題排查及解決方法

    這篇文章主要介紹了tomcat?啟動時卡住問題排查,本文給大家分享完美解決方法,對tomcat?啟動卡住解決方法感興趣的朋友一起看看吧
    2023-03-03
  • 關(guān)于Tomcat?結(jié)合Atomikos?實現(xiàn)JTA的方法

    關(guān)于Tomcat?結(jié)合Atomikos?實現(xiàn)JTA的方法

    Tomcat作為一款經(jīng)典的Web服務(wù)器,在開發(fā)、測試和生產(chǎn)環(huán)境中得到了廣泛的使用。但Tomcat畢竟不是Java EE服務(wù)器,因此在EJB,JTA方面并沒有提供支持。本文講述了Tomcat使用Atomikos實現(xiàn)JTA的一種方法,需要的朋友可以參考下
    2021-11-11
  • 詳解Tomcat多域名的配置

    詳解Tomcat多域名的配置

    本篇文章主要介紹了Tomcat多域名的配置 ,幾個項目需要發(fā)布在同一個tomcat服務(wù)器上,每個項目有不同的域名,有興趣的可以了解一下
    2017-07-07
  • 一文告訴你如何解決Tomcat亂碼問題(很詳細(xì)!)

    一文告訴你如何解決Tomcat亂碼問題(很詳細(xì)!)

    這篇文章主要給大家介紹了關(guān)于如何解決Tomcat亂碼問題的相關(guān)資料,還給大家介紹了tomcat窗口中文亂碼的解決方法,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2022-03-03
  • web安全—tomcat禁用WebDAV或者禁止不需要的 HTTP 方法

    web安全—tomcat禁用WebDAV或者禁止不需要的 HTTP 方法

    現(xiàn)在主流的WEB服務(wù)器一般都支持WebDAV,使用WebDAV的方便性,呵呵,就不用多說了吧,用過VS.NET開發(fā)ASP.Net應(yīng)用的朋友就應(yīng)該 知道,新建/修改WEB項目,其實就是通過WebDAV+FrontPage擴(kuò)展做到的,下面我就較詳細(xì)的介紹一下
    2017-03-03
  • Tomcat服務(wù)器 安全設(shè)置

    Tomcat服務(wù)器 安全設(shè)置

    tomcat是一個開源Web服務(wù)器,基于Tomcat的Web運(yùn)行效率高,可以在一般的硬件平臺上流暢運(yùn)行,因此,頗受Web站長的青睞。不過,在默認(rèn)配置下其存在一定的安全隱患,可被惡意攻擊。
    2009-08-08
  • 詳解tomcat設(shè)置默認(rèn)路徑致使項目url沖突解決方法

    詳解tomcat設(shè)置默認(rèn)路徑致使項目url沖突解決方法

    這篇文章主要介紹了詳解tomcat設(shè)置默認(rèn)路徑致使項目url沖突解決方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-01-01
  • Tomcat安全設(shè)置 win2003 下tomcat權(quán)限限制

    Tomcat安全設(shè)置 win2003 下tomcat權(quán)限限制

    Tomcat安全設(shè)置 win2003 下tomcat權(quán)限限制,需要的朋友可以參考下。
    2011-03-03

最新評論

黔南| 眉山市| 当涂县| 天长市| 呼伦贝尔市| 安多县| 海兴县| 迁安市| 武清区| 通许县| 武汉市| 中牟县| 岐山县| 安龙县| 岳阳县| 枞阳县| 安塞县| 宜都市| 吴江市| 广宗县| 杂多县| 峨山| 三亚市| 长岛县| 廉江市| 孟连| 临城县| 仲巴县| 九龙县| 罗平县| 武鸣县| 京山县| 磐石市| 根河市| 翁牛特旗| 宣化县| 南乐县| 灵台县| 菏泽市| 雅江县| 大关县|