• -------------------------------------------------------------
  • ====================================

查看运行时某个java对象占用JVM大小及通过idea查看java的内存占用情况

技能 dewbay 5年前 (2019-09-18) 10789次浏览 已收录 1个评论 扫描二维码

一、如果想看运行时某个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/,大致可以看到一下的画面,这里列出对象,对象实例数量、总占用内存大小。点击进去之后可以看到“谁引用了这个对象,这个对象又引用了哪个”这些信息。不过因为展示的信息非常多,并没有想象中那样清晰可见。

查看运行时某个java对象占用JVM大小及通过idea查看java的内存占用情况

 


露水湾 , 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:查看运行时某个java对象占用JVM大小及通过idea查看java的内存占用情况
喜欢 (17)
[]
分享 (0)
关于作者:
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
(1)个小伙伴在吐槽
  1. 转成字节的压根就是错的。首先,头文件是需要占用空间的,指针也需要空间,还有padding也需要空间,你只是把内容转为字节而已,头文件和指针呢?
    e2021-05-12 11:03 回复 Windows 10 | Chrome 86.0.4240.198