一、如果想看運行時某個java對象占用JVM內存大小,可以先將對象轉換成字節類型,然后計算:
List<BizGroupRelatedEventInfo> bizGroupRelatedEventInfos = bizEventVersionMapper.selectRelatedEventInfoByGroupIdsAndType(bizSdkGroupIds,
GroupPlatformType.SDK.getType());
System.out.println("bizGroupRelatedEventInfos集合內容轉換成字符串:" + Arrays.toString(bizGroupRelatedEventInfos.toArray()));
System.out.println("bizGroupRelatedEventInfos集合大小:" + (Arrays.toString(bizGroupRelatedEventInfos.toArray()).getBytes().length/1024) + "KB");
打印出的字節數值,即為占用的JVM內存大小,可以通過除以1024進行單位轉換
二、通過dump出內存信息到本地文件,並將文件解析通過瀏覽器訪問:
1,打開idea的命令行窗口:點擊底部選項欄中的“Terminal",即可切換到命令行窗口
2,在命令行中輸入:jps,即可查看當前已啟動的進程和對應的PID,如下
E:\CompanyProject\dongjian-ms-internal>jps
1536 RemoteMavenServer
12164 Launcher
12996 DongjianMsApplication
3828
5868 Jps
因為當前idea運行的項目是DongjianMsApplication(程序入口main方法所在類的類名),所以對就的PID就是12996
3,執行命令:jmap -dump:format=b,file=heap.bin <pid>
E:\CompanyProject\dongjian-ms-internal>jmap -dump:format=b,file=heap.bin 12996
Dumping heap to E:\CompanyProject\dongjian-ms-internal\heap.bin ...
Heap dump file created
jmap 能查看jvm內存中,對象占用內存的情況,還提供非常方便的命令將jvm的內存信息導出的文件。
format=b是通過二進制的意思,-dump:format=b,file=heap.bin意思是:把內存結構全部dump到二進制文件heap.bin中。
4,執行命令:jhat -J-Xmx512m heap.bin ,(ha指IBM的HeapAnalyzer)
E:\CompanyProject\dongjian-ms-internal>jhat -J-Xmx512m heap.bin
Reading from heap.bin...
Dump file created Tue Dec 11 10:37:54 CST 2018
Snapshot read, resolving...
Resolving 1630228 objects...
Chasing references, expect 326 dots..............................................................................................................................................................................
........................................................................................................................................................
Eliminating duplicate references.................................................................................................................................................................................
.....................................................................................................................................................
Snapshot resolved.
Started HTTP server on port 7000
Server is ready.
就可以將我們剛剛使用jmap導出的內存信息交給jhat解析了。默認的情況下,它會監聽7000端口。我在本機的地址就是,http://localhost:7000/。
訪問http://localhost:7000/histo/,大致可以看到一下的畫面,這里列出對象,對象實例數量、總占用內存大小。點擊進去之后可以看到“誰引用了這個對象,這個對象又引用了哪個”這些信息。不過因為展示的信息非常多,並沒有想象中那樣清晰可見。
————————————————
版權聲明:本文為CSDN博主「未名who」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/qq_2300688967/article/details/84951123