java io内存泄露_java内存泄露和OutOfMemory
1.內(nèi)存泄露:
Java的內(nèi)存泄漏是指某些對(duì)象不再被應(yīng)用程序使用,而垃圾收集器(Garbage Collector)卻沒(méi)能識(shí)別它們是“不再使用的”,所以沒(méi)有對(duì)這些對(duì)象進(jìn)行回收,或者由于某些原因無(wú)法回收或者回收不徹底!
舉例:
各種連接,比如數(shù)據(jù)庫(kù)連接(dataSourse.getConnection()),網(wǎng)絡(luò)連接(socket)和io連接,除非其顯式的調(diào)用了其close()方法將其連接關(guān)閉,否則是不會(huì)自動(dòng)被GC 回收的。
靜態(tài)集合類(lèi)沒(méi)有被釋放-對(duì)象沒(méi)有被釋放
遞歸調(diào)用層次太多
如果那些不使用的對(duì)象占用堆(heap)空間足夠大,使得應(yīng)用程序無(wú)法滿(mǎn)足下一次內(nèi)存分配需求,就會(huì)導(dǎo)致OutOfMemoryError錯(cuò)誤。
內(nèi)存泄漏和系統(tǒng)超負(fù)荷兩者是有區(qū)別的,雖然可能導(dǎo)致的最終結(jié)果是一樣的。
內(nèi)存泄漏是用完的資源沒(méi)有回收引起錯(cuò)誤,而系統(tǒng)超負(fù)荷則是系統(tǒng)確實(shí)沒(méi)有那么多資源可以分配了(其他的資源都在使用)。
內(nèi)存泄漏可以通過(guò)軟件調(diào)優(yōu)來(lái)解決,系統(tǒng)超負(fù)荷則只能通過(guò)更新硬件來(lái)解決。
2.內(nèi)存泄漏的表現(xiàn)
---內(nèi)存快被占滿(mǎn),但還沒(méi)被占滿(mǎn),處于臨界點(diǎn),這時(shí)候不會(huì)有報(bào)錯(cuò),但會(huì)影響性能
---日志里明確產(chǎn)生OOM等錯(cuò)誤。比如,下圖,回落點(diǎn)連起來(lái)基本水平則表示正常回收,反之回收不徹底。
3.內(nèi)存泄露的排查思路:
-----JVM和GC的關(guān)鍵參數(shù)設(shè)置(比如,-Xms -Xmx等都沒(méi)有設(shè)置,那么可能會(huì)出現(xiàn)內(nèi)存泄露)
-----排查代碼
4.OutOfMemory常見(jiàn)類(lèi)型
----棧溢出:java.lang.stackoverflowerror;fatal:stack size too small
排查:先看參數(shù)-Xss:每個(gè)線(xiàn)程的棧大小,用于保存函數(shù)調(diào)用、返回地址等,默認(rèn)1M,如果報(bào)錯(cuò),改為2M,如果還不行,捕獲快照,去排查代碼,有可能是遞歸調(diào)用的層次太多了。
----系統(tǒng)內(nèi)存被占滿(mǎn):java.lang.outofmemoryerror:unable to create new native thread
解決:升級(jí)硬件
5.java.lang.OutOfMemoryError錯(cuò)誤的可能原因,及排查思路:
---空間不足
---首先排查是不是硬件方面的問(wèn)題
---如果硬件不錯(cuò),再排查參數(shù),是不是設(shè)置的小了
---內(nèi)存泄漏
---如果硬件和參數(shù)都沒(méi)問(wèn)題,那么懷疑是內(nèi)存泄露,需要排查JVM和GC的參數(shù)設(shè)置,如果還不行,需要排查代碼
總結(jié)
以上是生活随笔為你收集整理的java io内存泄露_java内存泄露和OutOfMemory的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: java ML回归预测_ML之回归预测:
- 下一篇: java代码连接jdbc_纯JDBC代码