結(jié)合實(shí)際業(yè)務(wù)的Java程序內(nèi)存分析(一)

背景

近期線上web服務(wù)內(nèi)存占用較大,空間資源消耗很多??紤]到后續(xù)訪問壓力會越來越大,防止GC頻繁,OOM等內(nèi)存問題爆發(fā),提前分析內(nèi)存使用情況。

思路

思路1:重點(diǎn)對象進(jìn)行評估,預(yù)估其真實(shí)大小值,內(nèi)存可占大小。--探路

思路2:全局觀察數(shù)據(jù),分析堆中對象的大小,數(shù)目。--全局思考

思路3:結(jié)合思路1,思路2,理清業(yè)務(wù)邏輯,推斷內(nèi)存過大原因。--分析總結(jié)

步驟

1,探路

系統(tǒng)主要對外提供數(shù)據(jù)訪問服務(wù)。數(shù)據(jù)的讀取,計(jì)算和封裝等操作,經(jīng)驗(yàn)來說就是內(nèi)存占用的最大“元兄”。

簡單的計(jì)算數(shù)據(jù)對象大小的方法:對象序列化操作,計(jì)算值和真實(shí)值的比值約在0.5到2之間。

核心代碼:

ByteArrayOutputStream baos = new ByteArrayOutputStream();

ObjectOutputStream oos = new ObjectOutputStream(baos);

oos.writeObject(movie.toRecResultVideo().toJSON().toString());

byte[] bs = baos.toByteArray();

m_bytes+=bs.length;

oos.close();

數(shù)量預(yù)估:

使用:jmap -histo $PID | head -n 對象關(guān)鍵字符串

獲得線索對象總量,此時的內(nèi)存大小僅供參考,它依賴的對象是不會計(jì)算在內(nèi)的,不準(zhǔn)確。

結(jié)合實(shí)際業(yè)務(wù)場景,預(yù)估核心數(shù)據(jù)占內(nèi)存的使用大小。

2,全局思考

jmap是個不錯的jdk自帶的實(shí)時java進(jìn)程內(nèi)存分析工具。

使用:jmap -histo $PID | head -n 20

前20條最大內(nèi)存使用對象。

參考數(shù)據(jù):

num? ? #instances? ? ? ? #bytes? class name

----------------------------------------------

1:? ? ? 23576457? ? ? 977320576? [C

2:? ? ? 22579841? ? ? 541916184? java.lang.String

3:? ? ? 7314642? ? ? 234068544? java.util.HashMap$Node

4:? ? ? 1700093? ? ? 132600320? [Ljava.util.HashMap$Node;

5:? ? ? ? 329053? ? ? 122648832? [B

6:? ? ? 1741893? ? ? 83610864? java.util.HashMap

7:? ? ? ? 40426? ? ? 65754792? [Ljava.lang.String;

8:? ? ? ? 818186? ? ? 41559272? [Ljava.lang.Object;

9:? ? ? ? 793279? ? ? 31731160? java.util.HashMap$KeyIterator

10:? ? ? 1489661? ? ? 23834576? org.json.JSONObject

11:? ? ? ? 811144? ? ? 19467456? java.util.ArrayList

12:? ? ? ? 281120? ? ? 17991680? java.net.URL

13:? ? ? ? 49129? ? ? 17498424? [I

14:? ? ? ? 574117? ? ? 13778808? java.lang.StringBuffer

15:? ? ? ? 213742? ? ? 10259616? com.firedata.brain.er.dict.DictElement

16:? ? ? ? 406102? ? ? ? 9746448? com.firedata.brain.er.util.PrefixTrie$Node

17:? ? ? ? 565584? ? ? ? 9049344? org.json.JSONArray

其中:字符數(shù)組,字符串對象,hashmap節(jié)點(diǎn),字節(jié)數(shù)據(jù),jsonobject,arraylist,url等占的對象較大。

3,分析總結(jié)

結(jié)合業(yè)務(wù)特點(diǎn)(具體業(yè)務(wù)需要保密),核心機(jī)制包括兩點(diǎn):

a,數(shù)據(jù)讀取,轉(zhuǎn)換,占用大量字符數(shù)組,字符串對象,json對象。

b,數(shù)據(jù)計(jì)算,占用大量的HashMap,ArrayList。

總結(jié):

1,優(yōu)化方向一,優(yōu)化數(shù)據(jù)對象的大小和數(shù)目,使之和當(dāng)前進(jìn)程配置參數(shù)“和諧共處”,避免oom,避免gc頻繁;后續(xù)繼續(xù)使用工具觀察gc情況;

2,優(yōu)化方向二,計(jì)算模塊不要亂用容器類,相當(dāng)占資源。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • (一)Java部分 1、列舉出JAVA中6個比較常用的包【天威誠信面試題】 【參考答案】 java.lang;ja...
    獨(dú)云閱讀 7,257評論 0 62
  • jstack-- 如果java程序崩潰生成core文件,jstack工具可以用來獲得core文件的java sta...
    not_null閱讀 8,216評論 2 62
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法,內(nèi)部類的語法,繼承相關(guān)的語法,異常的語法,線程的語...
    子非魚_t_閱讀 34,692評論 18 399
  • 杜甫的一首《茅屋為秋風(fēng)所破歌》紅遍了大江南北,成了童叟皆知的流行歌曲,如同當(dāng)年鳥叔的江南style一樣,很多人...
    云在天上飄閱讀 610評論 0 0
  • 五月黃昏路上來了場癡情的雨 雨不大卻如此纏綿我開了傘路上沉浸在一片久違的寂靜 傘也單薄雨也單薄卻足以飄濕我的眼還有...
    有理性思想的浪漫詩人閱讀 188評論 2 3

友情鏈接更多精彩內(nèi)容