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

一次tomcat自動關(guān)閉的bug解決

 更新時間:2019年08月15日 08:32:47   作者:alunbar  
這篇文章主要給大家介紹了一次關(guān)于tomcat自動關(guān)閉的bug的解決過程,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用tomcat具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧

前言

最近一個運行了4年的javaee web項目,經(jīng)常接到客戶反饋系統(tǒng)無法打開。登錄服務(wù)器查看服務(wù),發(fā)現(xiàn)是tomcat自動關(guān)閉了?;臼?到4天發(fā)生一次。

運維人員開始以為是其他服務(wù)殺死了tomcat服務(wù),沒放在心上,解決方法就是直接重啟tomcat。

最終捅了簍子,運維人員被客戶投訴,扣了一個月的績效。

解決這個bug兜兜轉(zhuǎn)轉(zhuǎn)來到了我這里。既然接到任務(wù),那就開干,沒有解決不了的bug。

系統(tǒng)的運行環(huán)境如下:

  • tomcat6.0
  • 32位jdk7.0
  • window server2003 32位,32G內(nèi)存。

查看日志,如果tomcat閃崩,都會在tomcat的bin目錄下生成以"hs_err"開頭的日志文件。打開最新的日志文件,首先看到的是下面一段話:

# There is insufficient memory for the Java Runtime Environment to continue.
# Native memory allocation (malloc) failed to allocate 32756 bytes for ChunkPool::allocate
# Possible reasons:
# The system is out of physical RAM or swap space
# In 32 bit mode, the process size limit was hit
# Possible solutions:
# Reduce memory load on the system
# Increase physical memory or swap space
# Check if swap backing store is full
# Use 64 bit Java on a 64 bit OS
# Decrease Java heap size (-Xmx/-Xms)
# Decrease number of Java threads
# Decrease Java thread stack sizes (-Xss)
# Set larger code cache with -XX:ReservedCodeCacheSize=
# This output file may be truncated or incomplete.
#
# Out of Memory Error (allocation.cpp:211), pid=7864, tid=6556
#
# JRE version: Java(TM) SE Runtime Environment (7.0_79-b15) (build 1.7.0_79-b15)
# Java VM: Java HotSpot(TM) Server VM (24.79-b02 mixed mode windows-x86 )
# Failed to write core dump. 

大概意思就是內(nèi)存不夠了,無法分配32756字節(jié)的空間。同時給出幾個解決方法:

1、減少系統(tǒng)內(nèi)存負(fù)載;

2、增加物理內(nèi)存或者交換空間;

3、在64位操作系統(tǒng)上使用64位jdk;

4、減少java heap大??;

5、減少java線程數(shù)量;

6、減少java線程堆棧大小。

通過上面的內(nèi)容可以得出,jvm無法分配32756 bytes的內(nèi)存空間。

從接到任務(wù)開始,我一直以為是jvm配置出錯,導(dǎo)致內(nèi)存不夠用,只需調(diào)整下新生代、老年代的配置即可。

繼續(xù)往下看日志文件,找到"GC Heap History (10 events):"這一行,這個記錄jvm最后10次垃圾回收時堆的變化情況。

GC Heap History (10 events):
Event: 572312.299 GC heap before
{Heap before GC invocations=5046 (full 357):
PSYoungGen total 201472K, used 200685K [0x573c0000, 0x63bc0000, 0x63bc0000)
eden space 198144K, 100% used [0x573c0000,0x63540000,0x63540000)
from space 3328K, 76% used [0x63540000,0x637bb528,0x63880000)
to space 3328K, 0% used [0x63880000,0x63880000,0x63bc0000)
ParOldGen total 843776K, used 422602K [0x23bc0000, 0x573c0000, 0x573c0000)
object space 843776K, 50% used [0x23bc0000,0x3d872b18,0x573c0000)
PSPermGen total 262144K, used 51848K [0x03bc0000, 0x13bc0000, 0x23bc0000)
object space 262144K, 19% used [0x03bc0000,0x06e62138,0x13bc0000)
Event: 572312.305 GC heap after
Heap after GC invocations=5046 (full 357):
PSYoungGen total 201472K, used 1103K [0x573c0000, 0x63bc0000, 0x63bc0000)
eden space 198144K, 0% used [0x573c0000,0x573c0000,0x63540000)
from space 3328K, 33% used [0x63880000,0x63993c90,0x63bc0000)
to space 3328K, 0% used [0x63540000,0x63540000,0x63880000)
ParOldGen total 843776K, used 423618K [0x23bc0000, 0x573c0000, 0x573c0000)
object space 843776K, 50% used [0x23bc0000,0x3d970b18,0x573c0000)
PSPermGen total 262144K, used 51848K [0x03bc0000, 0x13bc0000, 0x23bc0000)
object space 262144K, 19% used [0x03bc0000,0x06e62138,0x13bc0000)
}
Event: 572351.132 GC heap before
{Heap before GC invocations=5047 (full 357):
PSYoungGen total 201472K, used 199247K [0x573c0000, 0x63bc0000, 0x63bc0000)
eden space 198144K, 100% used [0x573c0000,0x63540000,0x63540000)
from space 3328K, 33% used [0x63880000,0x63993c90,0x63bc0000)
to space 3328K, 0% used [0x63540000,0x63540000,0x63880000)
ParOldGen total 843776K, used 423618K [0x23bc0000, 0x573c0000, 0x573c0000)
object space 843776K, 50% used [0x23bc0000,0x3d970b18,0x573c0000)
PSPermGen total 262144K, used 51848K [0x03bc0000, 0x13bc0000, 0x23bc0000)
object space 262144K, 19% used [0x03bc0000,0x06e62138,0x13bc0000)
Event: 572351.137 GC heap after
Heap after GC invocations=5047 (full 357):
PSYoungGen total 201472K, used 1615K [0x573c0000, 0x63bc0000, 0x63bc0000)
eden space 198144K, 0% used [0x573c0000,0x573c0000,0x63540000)
from space 3328K, 48% used [0x63540000,0x636d3ec8,0x63880000)
to space 3328K, 0% used [0x63880000,0x63880000,0x63bc0000)
ParOldGen total 843776K, used 423674K [0x23bc0000, 0x573c0000, 0x573c0000)
object space 843776K, 50% used [0x23bc0000,0x3d97eb18,0x573c0000)
PSPermGen total 262144K, used 51848K [0x03bc0000, 0x13bc0000, 0x23bc0000)
object space 262144K, 19% used [0x03bc0000,0x06e62138,0x13bc0000)
}
Event: 572398.649 GC heap before
{Heap before GC invocations=5048 (full 357):
PSYoungGen total 201472K, used 199759K [0x573c0000, 0x63bc0000, 0x63bc0000)
eden space 198144K, 100% used [0x573c0000,0x63540000,0x63540000)
from space 3328K, 48% used [0x63540000,0x636d3ec8,0x63880000)
to space 3328K, 0% used [0x63880000,0x63880000,0x63bc0000)
ParOldGen total 843776K, used 423674K [0x23bc0000, 0x573c0000, 0x573c0000)
object space 843776K, 50% used [0x23bc0000,0x3d97eb18,0x573c0000)
PSPermGen total 262144K, used 51848K [0x03bc0000, 0x13bc0000, 0x23bc0000)
object space 262144K, 19% used [0x03bc0000,0x06e62138,0x13bc0000)
Event: 572398.655 GC heap after
Heap after GC invocations=5048 (full 357):
PSYoungGen total 201472K, used 1998K [0x573c0000, 0x63bc0000, 0x63bc0000)
eden space 198144K, 0% used [0x573c0000,0x573c0000,0x63540000)
from space 3328K, 60% used [0x63880000,0x63a73830,0x63bc0000)
to space 3328K, 0% used [0x63540000,0x63540000,0x63880000)
ParOldGen total 843776K, used 423703K [0x23bc0000, 0x573c0000, 0x573c0000)
object space 843776K, 50% used [0x23bc0000,0x3d985cc0,0x573c0000)
PSPermGen total 262144K, used 51848K [0x03bc0000, 0x13bc0000, 0x23bc0000)
object space 262144K, 19% used [0x03bc0000,0x06e62138,0x13bc0000)
}
Event: 576881.689 GC heap before
{Heap before GC invocations=5049 (full 357):
PSYoungGen total 201472K, used 200142K [0x573c0000, 0x63bc0000, 0x63bc0000)
eden space 198144K, 100% used [0x573c0000,0x63540000,0x63540000)
from space 3328K, 60% used [0x63880000,0x63a73830,0x63bc0000)
to space 3328K, 0% used [0x63540000,0x63540000,0x63880000)
ParOldGen total 843776K, used 423703K [0x23bc0000, 0x573c0000, 0x573c0000)
object space 843776K, 50% used [0x23bc0000,0x3d985cc0,0x573c0000)
PSPermGen total 262144K, used 51850K [0x03bc0000, 0x13bc0000, 0x23bc0000)
object space 262144K, 19% used [0x03bc0000,0x06e62850,0x13bc0000)
Event: 576881.696 GC heap after
Heap after GC invocations=5049 (full 357):
PSYoungGen total 201472K, used 3155K [0x573c0000, 0x63bc0000, 0x63bc0000)
eden space 198144K, 0% used [0x573c0000,0x573c0000,0x63540000)
from space 3328K, 94% used [0x63540000,0x63854cb0,0x63880000)
to space 3328K, 0% used [0x63880000,0x63880000,0x63bc0000)
ParOldGen total 843776K, used 423703K [0x23bc0000, 0x573c0000, 0x573c0000)
object space 843776K, 50% used [0x23bc0000,0x3d985cc0,0x573c0000)
PSPermGen total 262144K, used 51850K [0x03bc0000, 0x13bc0000, 0x23bc0000)
object space 262144K, 19% used [0x03bc0000,0x06e62850,0x13bc0000)
}
Event: 580535.452 GC heap before
{Heap before GC invocations=5050 (full 357):
PSYoungGen total 201472K, used 201299K [0x573c0000, 0x63bc0000, 0x63bc0000)
eden space 198144K, 100% used [0x573c0000,0x63540000,0x63540000)
from space 3328K, 94% used [0x63540000,0x63854cb0,0x63880000)
to space 3328K, 0% used [0x63880000,0x63880000,0x63bc0000)
ParOldGen total 843776K, used 423703K [0x23bc0000, 0x573c0000, 0x573c0000)
object space 843776K, 50% used [0x23bc0000,0x3d985cc0,0x573c0000)
PSPermGen total 262144K, used 51856K [0x03bc0000, 0x13bc0000, 0x23bc0000)
object space 262144K, 19% used [0x03bc0000,0x06e64228,0x13bc0000)
Event: 580535.459 GC heap after
Heap after GC invocations=5050 (full 357):
PSYoungGen total 200960K, used 1858K [0x573c0000, 0x63bc0000, 0x63bc0000)
eden space 197632K, 0% used [0x573c0000,0x573c0000,0x634c0000)
from space 3328K, 55% used [0x63880000,0x63a50be0,0x63bc0000)
to space 3584K, 0% used [0x634c0000,0x634c0000,0x63840000)
ParOldGen total 843776K, used 423703K [0x23bc0000, 0x573c0000, 0x573c0000)
object space 843776K, 50% used [0x23bc0000,0x3d985cc0,0x573c0000)
PSPermGen total 262144K, used 51856K [0x03bc0000, 0x13bc0000, 0x23bc0000)
object space 262144K, 19% used [0x03bc0000,0x06e64228,0x13bc0000)
}

看了上面的內(nèi)容,并沒有發(fā)現(xiàn)tomcat閃崩是由于老年代,持久代,新生代空間不足引起的。有好幾次因為eden區(qū)空間使用到100%引起的full gc,但是垃圾回收過后eden區(qū)的空間都恢復(fù)到正常的水平。

日志中還記錄了tomcat閃崩時heap堆的使用情況:

Heap
PSYoungGen total 200960K, used 95671K [0x573c0000, 0x63bc0000, 0x63bc0000)
eden space 197632K, 47% used [0x573c0000,0x5cf5d230,0x634c0000)
from space 3328K, 55% used [0x63880000,0x63a50be0,0x63bc0000)
to space 3584K, 0% used [0x634c0000,0x634c0000,0x63840000)
ParOldGen total 843776K, used 423703K [0x23bc0000, 0x573c0000, 0x573c0000)
object space 843776K, 50% used [0x23bc0000,0x3d985cc0,0x573c0000)
PSPermGen total 262144K, used 51856K [0x03bc0000, 0x13bc0000, 0x23bc0000)
object space 262144K, 19% used [0x03bc0000,0x06e64228,0x13bc0000)

一切都那么正常,同時又那么詭異。

翻看了之前發(fā)生日志,內(nèi)容都是大同小異。

重新翻看了幾遍日志,這次把重點放在日志中建議的解決方案上:

# Reduce memory load on the system
# Increase physical memory or swap space
# Check if swap backing store is full
# Use 64 bit Java on a 64 bit OS
# Decrease Java heap size (-Xmx/-Xms)
# Decrease number of Java threads
# Decrease Java thread stack sizes (-Xss)

其中下面幾個解決方案不采用:

  • Reduce memory load on the system。 系統(tǒng)內(nèi)存夠用,32G的內(nèi)存,還剩20G沒用,無需減少內(nèi)存。
  • Increase physical memory or swap space。 系統(tǒng)內(nèi)存夠用,32G的內(nèi)存,還剩20G沒用,無需增加物理內(nèi)存。
  • Use 64 bit Java on a 64 bit OS。 32位操作系統(tǒng),無法使用64位jdk。

只剩下下面的三個解決方案了:

  • Decrease Java heap size (-Xmx/-Xms)。 heap堆設(shè)置過大,就會影響剩余內(nèi)存。
  • Decrease number of Java threads
  • Decrease Java thread stack sizes (-Xss)

而減少java線程的數(shù)量,需要修改代碼,這個也不實際。

最后只剩下

  • Decrease Java heap size (-Xmx/-Xms)
  • Decrease Java thread stack sizes (-Xss)

這兩個解決方案了,就從這里入手,曙光就在前方。

先看 Decrease Java thread stack sizes (-Xss) 解決方案

java線程運行也是需要內(nèi)存空間的,-Xss參數(shù)指定每個線程堆棧的大小,為jvm啟動的每個線程分配的內(nèi)存大小。在jdk1.4版本中是256K,JDK1.5及以上版本是1M。

tomcat jvm的參數(shù)設(shè)置如下:

JAVA_OPTS=%JAVA_OPTS% -server -Xms1024m -Xmx1024m -Xmn200M -XX:PermSize=256M -XX:MaxPermSize=512m -XX:SurvivorRatio=1 -Xss256k

已經(jīng)通過-Xss設(shè)置每個java線程堆棧的大小為256K。

在java語言里, 當(dāng)你創(chuàng)建一個線程的時候,虛擬機會在JVM內(nèi)存創(chuàng)建一個Thread對象同時創(chuàng)建一個操作系統(tǒng)線程,而這個系統(tǒng)線程的內(nèi)存用的不是JVMMemory,而是系統(tǒng)中剩下的內(nèi)存(MaxProcessMemory - JVMMemory - ReservedOsMemory)。

當(dāng)需要創(chuàng)建線程,而操作系統(tǒng)剩余內(nèi)存不夠分配給一個java線程時,就會報Out of Memory Error的錯誤。

由于已經(jīng)設(shè)置通過-Xss設(shè)置java線程棧的大小為256K,因此也決定不采用這個解決方案。

現(xiàn)在只剩 下Decrease Java heap size (-Xmx/-Xms) 這個解決方案了。通過減少堆的大小,而留出足夠的內(nèi)存空間給java線程堆棧使用。

32位的window操作系統(tǒng)給每個進程分配的內(nèi)存空間是2G,減去堆的最大容量和PermSize的最大容量,剩下的容量就留給java線程棧使用。

經(jīng)過分析代碼和之前錯誤的日志,發(fā)現(xiàn)一般在350個線程這樣就出現(xiàn)Out of Memory Error的錯誤。
在出現(xiàn)錯誤時,heap空間才用了不到40%。因此決定將java heap的從1G減少到768M。

修改的jvm參數(shù)如下:

JAVA_OPTS=%JAVA_OPTS% -server -Xms768m -Xmx768m -Xmn200M -XX:PermSize=256M -XX:MaxPermSize=512m -XX:SurvivorRatio=1 -Xss256k

到目前為止,系統(tǒng)已經(jīng)穩(wěn)定運行1個月,各個參數(shù)指標(biāo)都在正常范圍內(nèi)。heap使用率最高才70%。

總結(jié):

1、經(jīng)過這次解決bug,加深了對java虛擬機的了解,特別是線程棧,內(nèi)存堆,持久代,新生代等概念。

2、一定要仔細(xì)閱讀日志文件,一步一步排除掉潛在的解決方案。綜合系統(tǒng)的運行環(huán)境,找出合理的解決方案。

好了,以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,謝謝大家對腳本之家的支持。

相關(guān)文章

  • Mac環(huán)境下配置tomcat的步驟詳解

    Mac環(huán)境下配置tomcat的步驟詳解

    我們在MAC系統(tǒng)中查看網(wǎng)頁時,一般都要使用到tomcat,這是因為appache只支持靜態(tài)網(wǎng)頁,但像asp,php,cgi,jsp等動態(tài)就需要tomcat來處理。那么該怎么在自己的MAC中安裝tomcat呢?現(xiàn)在小編就教大家安裝的方法,有需要的朋友們可以參考借鑒。
    2016-10-10
  • 修改Tomcat服務(wù)器默認(rèn)端口號的實現(xiàn)方法

    修改Tomcat服務(wù)器默認(rèn)端口號的實現(xiàn)方法

    這篇文章主要介紹了修改Tomcat服務(wù)器默認(rèn)端口號的實現(xiàn)方法的相關(guān)資料,需要的朋友可以參考下
    2017-09-09
  • tomcat部署web應(yīng)用的4種方法總結(jié)(推薦)

    tomcat部署web應(yīng)用的4種方法總結(jié)(推薦)

    本篇文章主要介紹了tomcat部署web應(yīng)用的方法,主要有4中方法,包括Tomcat自動部署、控制臺進行部署、增加自定義的Web部署文件、手動修改%Tomcat_Home%\conf\server.xml文件來部署web應(yīng)用,有興趣的可以了解一下。
    2016-11-11
  • 詳解windows 10中Tomcat安裝和部署的教程

    詳解windows 10中Tomcat安裝和部署的教程

    這篇文章主要介紹了windows 10中Tomcat安裝和部署教程,本文圖文并茂給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-11-11
  • Tomcat 5.5 數(shù)據(jù)庫連接池配置

    Tomcat 5.5 數(shù)據(jù)庫連接池配置

    我用的數(shù)據(jù)庫是MySQL5.5,所以首先要把MySQL的JDBC驅(qū)動程序拷貝到Tomcat安裝目錄的/common/lib下和你自己網(wǎng)站的/WEB-INF/lib下。
    2009-08-08
  • IIS6.0+Tomcat7.0整合總結(jié)(推薦)

    IIS6.0+Tomcat7.0整合總結(jié)(推薦)

    這篇文章主要介紹了IIS6.0+Tomcat7.0整合配置方法,需要的朋友可以參考下
    2014-07-07
  • 詳解從源碼分析tomcat如何調(diào)用Servlet的初始化

    詳解從源碼分析tomcat如何調(diào)用Servlet的初始化

    這篇文章主要介紹了詳解從源碼分析tomcat如何調(diào)用Servlet的初始化,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • Tomcat 熱部署的實現(xiàn)原理詳解

    Tomcat 熱部署的實現(xiàn)原理詳解

    這篇文章主要介紹了Tomcat 熱部署的實現(xiàn)原理詳解的相關(guān)資料,需要的朋友可以參考下
    2017-01-01
  • 使用Maven tomcat:run命令啟動web項目時修改默認(rèn)端口的方法

    使用Maven tomcat:run命令啟動web項目時修改默認(rèn)端口的方法

    今天小編就為大家分享一篇使用Maven tomcat:run命令啟動web項目時修改默認(rèn)端口的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-05-05
  • tomcat啟動報錯jar not loaded的問題

    tomcat啟動報錯jar not loaded的問題

    這篇文章主要介紹了tomcat啟動報錯jar not loaded的問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-09-09

最新評論

晋江市| 昌宁县| 长寿区| 淮北市| 岳池县| 长岛县| 信宜市| 兖州市| 天水市| 盘锦市| 陈巴尔虎旗| 商丘市| 自贡市| 涿州市| 娄底市| 平顺县| 威海市| 麻阳| 嘉义县| 太和县| 开阳县| 大洼县| 新巴尔虎左旗| 洛扎县| 峨眉山市| 金塔县| 嘉兴市| 秦皇岛市| 扶余县| 河源市| 防城港市| 江北区| 石屏县| 兰州市| 岗巴县| 曲麻莱县| 铜鼓县| 连山| 太康县| 义乌市| 会同县|