日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關咨詢
選擇下列產(chǎn)品馬上在線溝通
服務時間:8:30-17:00
你可能遇到了下面的問題
關閉右側工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
Tomcat與內(nèi)存泄露處理

似乎從 Java 入門的時候,就有這樣的說法來考查 Java開發(fā)者:

創(chuàng)新互聯(lián)建站是一家集網(wǎng)站建設,嵐皋企業(yè)網(wǎng)站建設,嵐皋品牌網(wǎng)站建設,網(wǎng)站定制,嵐皋網(wǎng)站建設報價,網(wǎng)絡營銷,網(wǎng)絡優(yōu)化,嵐皋網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強企業(yè)競爭力??沙浞譂M足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時我們時刻保持專業(yè)、時尚、前沿,時刻以成就客戶成長自我,堅持不斷學習、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實用型網(wǎng)站。

Java 不像 C++ 那樣自己管理內(nèi)存,有Java 虛擬機負責進行垃圾回收,再也沒有內(nèi)存泄露的問題了。

但是隨著開發(fā)經(jīng)歷的增長,已經(jīng)開發(fā)過應用的增多,應用內(nèi)需要加載的 class 增多,經(jīng)常就會遇到內(nèi)存溢出(OOM)?;蛘吒_切的說,因為加載 class 的增多導致的內(nèi)存溢出是

 
 
 
 
  1. java.lang.OutOfMemoryError: PermGen space 

此時,解決OOM的方式一般是:

1. 分析應用的代碼寫的是否有問題,可以通過一些工具觀察應用內(nèi)占用內(nèi)存較多的 class 類型 (比如通過 JVisualVM 來分析Java七武器系列多情環(huán) --多功能Profiling工具 JVisual VM,或者通過MAT來分析)

2. 修改 JVM啟動參數(shù),增大關于 Perm Gen 的配置。

在 Tomcat 這一類的 應用服務器中,由于其做為應用的容器運行,可能自身的Perm Gen 占用并不多,但需要考慮部署到容器中的應用占用。有些應用依賴了大量的第三方類庫,也有一些應用會在運行時動態(tài)生成大量的 class,這些內(nèi)容的加載,都容易導致 Perm Gen 的 OOM。

對于 OOM 的處理,內(nèi)部會在啟動時占用一小塊內(nèi)存,在 OOM 產(chǎn)生的時候釋放掉來臨時緩解一下,這種稱為oomParachute。

除此之外,Tomcat 在 manager 應用中還提供了發(fā)現(xiàn)內(nèi)存泄漏的功能。

圖上說明寫的明白,該功能主要用于分析在應用停止、重部署、解除部署時是否造成了內(nèi)存泄漏。

在請求后,manager的上方信息顯示區(qū)域會提示當前是否有應用造成的內(nèi)存泄漏。

但需要注意的是此功能會觸發(fā)一次 Full GC 的執(zhí)行,代碼中使用的是 System.gc(),在生產(chǎn)環(huán)境中如果使用需要謹慎。

那么,在什么情況下會導致所謂的應用內(nèi)存泄漏呢?

我們都知道, 為了實現(xiàn)應用間的 class 隔離, Tomcat 對于每個應用,都會單獨使用一個 WebappClassLoader,這樣,多個應用間即使都使用到一個 類庫的不同版本,也不會相互影響造成沖突。

但是,在這種情況下,當一個應用已經(jīng)執(zhí)行了停止操作,或者執(zhí)行了重部署操作,此時是會生成一個新的 classLoader 來加載新部署的應用類信息。

我們知道,在 Java 中,類與類之間是存在引用關系的,類似于強引用,弱引用,幻影引用,用來在GC時將一些不需要的 class 回收掉,騰出空間。按理說之前的 classLoader 本應該被垃圾回收,但在某些時候,由于一些類之前的引用關系導致該 classLoader,以及其加載的一系列 class 文件, 都不能被標識為垃圾,此時這些 class 依然駐留在 Perm Gen,隨著應用多次啟停,多次重部署之后,出現(xiàn)了 Perm Gen 的 OOM。

一般以下類庫的使用容易導致 class loader 逃過垃圾回收,產(chǎn)生內(nèi)存泄漏:

  • JDBC driver 注冊
  • 一些 logging 框架
  • 沒有移除的 ThreadLocal的使用
  • 未停止的 Thread

此外,一些 Java API 的使用也容易導致此問題,例如

  • javax.imageio API
  • XML 解析
  • RMI 使用

由于這些容易占用 classLoader,導致其不能被回收,如果這些 class 交給各個應用的類加載器進行加載,就會使得 Perm Gen 中這些類越來越多,從而產(chǎn)生泄漏。

為此,在 Tomcat 中引入了JreMemoryLeakPreventionListener 這個組件。實現(xiàn)思路是在 Tomcat 啟動時,通過 System class Loader 來加載這些類。 由于類加載器的加載原理(默認父優(yōu)先,而且這些系統(tǒng)的類,都會委托給系統(tǒng)類加載器進行加載),這些類不會再被 WebclassLoader 重新加載,從而減小內(nèi)存泄漏的產(chǎn)生。

默認在 Tomcat 的配置 server.xml 中已經(jīng)開啟了該組件,所以這些功能你已經(jīng)不知不覺中在使用。

【本文為專欄作者“侯樹成”的原創(chuàng)稿件,轉(zhuǎn)載請通過作者微信公眾號『Tomcat那些事兒』獲取授權】

戳這里,看該作者更多好文


文章題目:Tomcat與內(nèi)存泄露處理
標題路徑:http://www.5511xx.com/article/copdhse.html