weblogic占用java_weblogic内存占用过大调优
WebLogic Server Hang產(chǎn)生的原因一般為:
系統(tǒng)內(nèi)存不足
系統(tǒng)cpu忙
系統(tǒng)文件描述符數(shù)目不足
線程死鎖
JVM有GC方面的bug
對于一些特定的情況可以使用truss命令跟蹤系統(tǒng)調(diào)用來進(jìn)行分析
系統(tǒng)內(nèi)存不足
出現(xiàn)OutOfMemoryError或是觀察到內(nèi)存吃緊
操作系統(tǒng)本身的剩余內(nèi)存
通過top或是vmstat觀察
操作系統(tǒng)的swap區(qū)
Swap區(qū)太小可能導(dǎo)致編譯jsp時報“Not enough space”的錯
操作系統(tǒng)kernel參數(shù)中maxdsiz的大小
如果觀測到數(shù)據(jù)庫連接池里的連接泄漏,極可能是內(nèi)存泄漏的先兆
系統(tǒng)內(nèi)存不足
JVM的heap區(qū)大小
通過java命令行中的-Xms,-Xmx指定,建議最小值和最大值設(shè)成一樣
可以通過weblogic console上server/monitor/performance來觀察其使用情況
建議生產(chǎn)系統(tǒng)最少256M,一般情況下可以設(shè)置為系統(tǒng)剩余物理內(nèi)存的80%
Heap size太大在一些jvm上會有問題
對于sun和hp的jvm,permanent size太小也會出OutOfMemoryError
在java命令行上加-XX:MaxPermSize=128m
系統(tǒng)內(nèi)存不足
盡量減少內(nèi)存消耗
Session中不要放大的數(shù)據(jù),并盡量在不再需要的時候remove掉;如果可以調(diào)整session timeout到較小的值
避免在J2EE server端應(yīng)用里邊調(diào)用awt/swing作圖
調(diào)整ejb的cache/pool設(shè)置
系統(tǒng)內(nèi)存不足
內(nèi)存泄漏
可以通過weblogic console來觀察jvm的heap memory使用情況來獲知是否有內(nèi)存泄漏情況
采用第三方輔助工具來獲取更詳細(xì)信息
Jprobe/OptimizeIt
有可能是weblogic的bug,但絕大部分情況是由用戶的應(yīng)用引起的
最常見的代碼問題是數(shù)據(jù)庫連接沒正常關(guān)閉
比較好的寫法是:
Connection conn = null;
Statement stmt = null;
ResultSet rset= null;
try
{
conn = getConnection()…
}
catch(SQLException sqle)
{
}
finally
{
try{rset.close();}catch(Exception e){}
try{stmt.close();}catch(Exception e){}
try{conn.close();}catch(Exception e){}
}
系統(tǒng)cpu忙
如果用戶訪問量很大,cpu占用很高(user態(tài))并不是異常
如果是kernel態(tài)很多,需要OS廠商調(diào)整操作系統(tǒng)
采用top找到占用cpu很多的進(jìn)程
如果是非weblogic進(jìn)程,應(yīng)該考慮將其移到另外的server上運行
如果是運行weblogic的java進(jìn)程,通過做thread dump(詳細(xì)信息后邊會介紹到)來確認(rèn)是那段代碼導(dǎo)致了這么高的cpu使用(也有可能是os/jvm本身不正常)
系統(tǒng)文件描述符數(shù)目不足
Log中有“too many open files”的錯誤
表示達(dá)到了系統(tǒng)對一個進(jìn)程能同時打開的文件數(shù)的限制
ulimit ?Ca ?CH 可以查看當(dāng)前限制
ulimit ?Cn number可以來更改當(dāng)前環(huán)境的設(shè)置,建議至少設(shè)到4096
Solaris上可以通過/usr/proc/bin/pfiles pid來查看指定進(jìn)程的限制和當(dāng)前使用的file descriptor數(shù)目
Solaris上root用戶可以通過/usr/proc/bin/plimit -n soft,hard pid 來動態(tài)更改進(jìn)程的文件描述符的限制
線程死鎖
對于原因不明的hang或是響應(yīng)慢,最根本的方法就是獲取thread dump信息
對于windows系統(tǒng),在運行java的窗口按Ctrl+Break
對于unix系統(tǒng),首先用ps找到運行weblogic的java進(jìn)程的pid,然后執(zhí)行kill ?C3 pid
JVM將負(fù)責(zé)將所有java進(jìn)程的狀態(tài)、執(zhí)行堆棧dump到其標(biāo)準(zhǔn)輸出
為了方便獲取thread dump信息,在weblogic啟動的時候,最好將其標(biāo)準(zhǔn)輸出重定向到一個文件
為了反映線程狀態(tài)的動態(tài)變化,需要接連多次做thread dump,每次間隔10-20s
線程死鎖
對于thread dump信息,主要關(guān)注的是線程的狀態(tài)和其執(zhí)行堆棧
線程的狀態(tài)一般為三類
Runnable(R):當(dāng)前可以運行的線程
Waiting on monitor(CW):線程主動wait
Waiting for monitor entry(MW):線程等鎖
一般關(guān)注的都是第一和第三種狀態(tài)的線程
Cpu很忙則關(guān)注runnable的線程
Cpu閑則關(guān)注waiting for monitor entry的線程
一種典型的死鎖是由于在server端應(yīng)用(比如servlet)中請求由同一weblogic實例serve的資源
解決辦法就是將該servlet放到另外的執(zhí)行隊列里去執(zhí)行
JVM有GC方面的bug
打開jvm的gc log
在java命令行上加上-verbose:gc
GC的log輸出在java進(jìn)程的標(biāo)準(zhǔn)輸出里
在hp的jvm上,可以通過在java命令行上加
-Xverbosegc:file=gcfilename來將gc log寫到指定的文件
其輸出類似:
[GC 15639K->13700K(65280K), 0.0068439 secs]
調(diào)整jvm的內(nèi)存設(shè)置和gc算法
升級jvm或是os patch
mit ?Cn number可以來更改當(dāng)前環(huán)境的設(shè)置,建議至少設(shè)到4096
Solaris上可以通過/usr/proc/bin/pfiles pid來查看指定進(jìn)程的限制和當(dāng)前使用的file descriptor數(shù)目
Solaris上root用戶可以通過/usr/proc/bin/plimit -n soft,hard pid 來動態(tài)更改進(jìn)程的文件描述符的限制
線程死鎖
對于原因不明的hang或是響應(yīng)慢,最根本的方法就是獲取thread dump信息
對于windows系統(tǒng),在運行java的窗口按Ctrl+Break
對于unix系統(tǒng),首先用ps找到運行weblogic的java進(jìn)程的pid,然后執(zhí)行kill ?C3 pid
JVM將負(fù)責(zé)將所有java進(jìn)程的
總結(jié)
以上是生活随笔為你收集整理的weblogic占用java_weblogic内存占用过大调优的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: markdown mysql高亮_修改博
- 下一篇: java如何保证mq一定被消费_消费端如