我想用Java Profiler VisualVM检测我的java代码中的memeory泄漏。我想在修复内存泄漏之前和之后报告最大内存使用情况。在运行VisualVM或其他Java分析器时,是否有无法找到Memeory使用的高峰?谢谢!跟踪java profiler中的最大内存使用情况
回答
你可以用VisualVM来做到这一点。首先,安装VisualVM-MBeans插件,然后重新启动VisualVM。之后,在新的MBeans选项卡上选择java.lang.Memory.HeapMemoryUsage。最大值将为您提供最大的分配内存。
更新:
我双重检查它,HeapMemoryUsage.max是不是峰值堆的使用情况确实如此。幸运的是,在java.lang.MemoryPool中有每代高峰使用统计信息。 <代号> .PeakUsage.used。为了验证它,我写了一个小程序,分配一些内存,PeakUsage.max用于Eden Space加Old Gen加幸存者空间给出了所需的峰值堆用量。
因此,这里是你可以做什么:
您可以使用这些每代的统计数据。您还可以编写一些小工具,通过JMX计算并打印给定进程的每个代的峰值使用总和。
如果您只需要一些近似值,您可以检查VisualVM中的Monitor选项卡,Heap图表上的紫色区域是使用Heap的,因此您可以对高峰使用情况有所了解。
如果您需要这样做来消除内存泄漏,您真正需要的是长时间内存分配模式,并且可以在VisualVM的堆图上找到它。 This是一个好的开始。
嗨,我检查了java.lang.Memory.HeapMemoryUsage,它只告诉你分配的最大堆内存,而不是从开始到结束运行你的应用程序的内存使用高峰。 – flyingfromchina 2009-11-20 14:47:42
哦,你是对的,对不起。检查我更新的答案,我希望这可以帮助。 – candiru 2009-11-21 09:58:12
您可以调用Runtime.maxMemory()
了解VM分配了多少内存(通常不会缩小)。如果你在关机钩子中这样做,那么该值应该非常准确。
使用jmap或-XX:+ HeapDumpOnCtrlBreak在任何给定时间准确测量应用程序中使用的内存。这两种机制都会在获取内存快照时触发GC,因此它更准确地反映了堆的内容和大小。您可以使用jhat来打开堆转储。
- 1. 通过Python函数跟踪*最大*内存使用情况
- 2. 跟踪javascript内存使用情况
- 3. Java GC和内存使用情况跟踪
- 4. 如何跟踪C++中的内存使用情况
- 5. 如何跟踪C中的内存使用情况?
- 6. 跟踪tomcat webapp中的内存使用情况
- 7. 如何跟踪linux中进程的cpu /内存使用情况?
- 8. 如何跟踪visual studio 2017(C++)中的内存使用情况?
- 9. 使用valgrind跟踪管道命令的内存使用情况
- 10. RSS使用情况跟踪
- 11. 如何在bash中跟踪内存使用情况
- 12. 使用VADump来跟踪内存使用情况 - OpenProcess失败c0000034
- 13. 使用Google Analytics(分析)跟踪CPU和内存使用情况
- 14. 如何使用EASTL跟踪内存使用情况?
- 15. 在ubuntu上跟踪详细的MATLAB内存使用情况14.04
- 16. 跟踪与MAT的Android内存使用情况
- 17. 跟踪内存使用情况的方法
- 18. 跟踪C++中的内存使用情况并评估内存消耗
- 19. 在heroku上跟踪应用程序内存使用情况
- 20. Xcode和仪器跟踪内存使用情况
- 21. Java内存使用情况
- 22. java内存使用情况
- 23. 跟踪Android应用的使用情况
- 24. 跟踪页面的CSS使用情况
- 25. 跟踪iPhone的数据使用情况
- 26. 在Java中跟踪webservice的使用情况
- 27. 如何跟踪C#中的内存分配情况
- 28. 跟踪最坏情况执行时间
- 29. 在R中跟踪内存使用情况和垃圾回收内容
- 30. Flash总内存使用情况和TaskManager内存使用情况不一样?
什么时候你要采取足迹? – 2009-11-19 15:48:04
我需要从应用程序的开始到结束找出内存使用的高峰。 – flyingfromchina 2009-11-19 16:47:53