Java 性能优化实战记录(2)---句柄泄漏和监控
?
前言: Java不存在內(nèi)存泄漏, 但存在過期引用以及資源泄漏. (個人看法, 請大牛指正)?
這邊對文件句柄泄漏的場景進(jìn)行下模擬, 并對此做下簡單的分析.
如下代碼為模擬一個服務(wù)進(jìn)程, 忽略了句柄關(guān)閉, 造成不能繼續(xù)正常服務(wù)的小場景.
?
句柄泄漏導(dǎo)致, 進(jìn)程服務(wù)達(dá)到系統(tǒng)設(shè)置的上限, 進(jìn)而導(dǎo)致不可服務(wù)狀態(tài). 這就需要必要的監(jiān)控了.
如何監(jiān)控或者如何在測試階段能提前發(fā)現(xiàn)呢?
在linux中, 一切皆句柄, 比如file, socket都是, 每個進(jìn)程都有自己的上限, 一旦超過這個上限,系統(tǒng)就會限制并拒絕相應(yīng)的資源請求.
這個設(shè)定如下所示:
ulimit -a ? ? ? ? ? ? # ulimit -n 列出open file的個數(shù)
由此可見系統(tǒng)對于一般進(jìn)程的文件句柄上限為 1024.?
但對上面那個java進(jìn)程進(jìn)行觀察, 卻發(fā)現(xiàn)如下不一致的地方,如下所示:
jps ? #列出java進(jìn)程的pid列表
cd /proc/<pid>/fd ?#通過linux的虛擬文件系統(tǒng),進(jìn)入該java進(jìn)程的系統(tǒng)信息?
ls | wc -l ? ? ? ? ? ? ? ?#統(tǒng)計其總開打開的文件句柄數(shù)
其擁有的句柄個數(shù)4095與系統(tǒng)限制的句柄數(shù)上限1024相差太遠(yuǎn), 這是什么情況?
實(shí)際上系統(tǒng)的限制, 分為兩種,一種為soft limit, 另一種為hard limit, soft limit相當(dāng)于一個warning, 而hard limit系統(tǒng)則不允許超越.
執(zhí)行如下命令:
ulimit -a -H ? ? ? ? # ulimit -n -H 列出open file的句柄數(shù)
現(xiàn)在系統(tǒng)的open file 4096的上限與java進(jìn)程擁有的句柄數(shù)4095保持了一致.
關(guān)于soft limit和hard limit的區(qū)別, 請參閱如下鏈接:
http://blog.163.com/zhangjie_0303/blog/static/9908270620112233523316/
?
對于文件句柄數(shù), 還可以借用lsof命令來查閱
lsof -p <pid>
?
?
?
轉(zhuǎn)載于:https://www.cnblogs.com/mumuxinfei/p/3687217.html
總結(jié)
以上是生活随笔為你收集整理的Java 性能优化实战记录(2)---句柄泄漏和监控的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: HDUOJ---1754 I Hate
- 下一篇: Java里String.split需要注