java 内存溢出快速定位
背景:線上數(shù)據(jù)傳輸功能開啟一段時間后就會出現(xiàn)內(nèi)存溢出
個人理解:內(nèi)存溢出,說明要不然獲取到大量數(shù)據(jù)導(dǎo)致內(nèi)存溢出,要不然就是數(shù)據(jù)無法釋放,隨著時間堆積越來越多。
?
日志:查看日志定位是數(shù)據(jù)傳輸處的內(nèi)存溢出導(dǎo)致的,該模塊并非使用的定時任務(wù),而是項目啟動時運行,while(true)循環(huán)推送數(shù)據(jù),推送完成后sleep5秒。初步以為是里面的對象未釋放,但檢查后發(fā)現(xiàn)所有對象使用完以后都置為null了。
檢查方式:使用jdk的工具jconsole.exe,jvisualvm.exe進行檢查
本地程序運行以后,從jconsole里面看到堆內(nèi)存在緩慢增加,最后達到上限,內(nèi)存溢出。查看jvisualvm 定位溢出點。
個人理解就是接收端接收速度沒有發(fā)送端發(fā)送的快,導(dǎo)致發(fā)送端數(shù)據(jù)累積發(fā)送不過去,越來越多導(dǎo)致數(shù)據(jù)溢出。查看接收端發(fā)現(xiàn)30個線程處理的情況下,5秒鐘只能夠處理約1000條數(shù)據(jù),而發(fā)送端是設(shè)置的沒5秒發(fā)送5000條數(shù)據(jù)。
處理方案:開線程。多套服務(wù)接收。修改接收端方法一次接受多條數(shù)據(jù)(本次不行,限制了一次只能接受一條)
jconsole.exe 和jvisualvm.exe 都在jdk的bin目錄下。jconsole.exe打開后直接點擊對應(yīng)的程序,就可以查看了
點擊內(nèi)存可以看到內(nèi)存的使用情況。
jvisualvm.exe點開后選擇對應(yīng)的程序右側(cè)抽樣-內(nèi)存就可以查看內(nèi)存的使用情況了
PS : jconsole.exe的內(nèi)存頁面很適合用來學(xué)習(xí)內(nèi)存的。堆內(nèi)存分3個部分,Eden space ,Survivor Space,Tenured Gen。
新建的對象在Eden Space,滿了回收,不能回收的到Survivor Space,多次回收都無法回收的到 Tenured Gen
總結(jié)
以上是生活随笔為你收集整理的java 内存溢出快速定位的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: c语言数组截取,C# 字符串按数组截取方
- 下一篇: 都知道面向对象了,那么面向切面呢!通俗易