的数据这是我的Java项目的一天内存曲线。我如何找出哪个类或方法使用了大量内存?
oyt4ldly1#
你需要一个可以做JVM allocation profiling的工具。Java Flight Recorder(JFR)可以帮助您进行低开销分配分析(1,2-旧版本的文档,UI现在看起来很不一样,但“分配”和“TLAB”仍然是用来查找东西的单词).确保在您使用的设置中配置is enabled。这是OpenJDK 11之前的商业功能。他们说其他一些工具可以做到这一点。现在它的开销也很低(例如async-profiler)。如果你不关心你的应用程序变得非常慢,并且使用JDK < 11(?),VisualVM以前可以显示分配的堆栈跟踪,我在最新版本中找不到(1.4.2截至目前),但是可以在我的Oracle JDK 8-something附带的JVisualVM中找到它。“Profiler”>检查“Settings”>“Memory Settings”>检查“Record allocation stack traces”.开始分析,等待,确定最大的分配,右键单击“拍摄快照并显示分配堆栈跟踪”。它看起来像YourKit does basically the same,以及JProfiler(他们称之为“分配记录”)。再次:减慢应用程序很多,所以不要在prod中使用它。
bcs8qyzn2#
你需要定期进行堆转储,并使用MAT-内存分析工具(https://www.eclipse.org/mat/)等工具进行分析。该工具提供了哪个对象/类占用更多内存,以及它是从哪个线程创建的。如何找到特定对象是从哪个线程创建的?1.在MAT中,单击Histogram -它将显示转储中可用的类列表。x1c 0d1x的数据1.右键单击任意类名,在弹出窗口中选择列出对象->带输出引用
的1.上面的步骤列出了所选类的所有示例。右键单击任何一个类名,然后从弹出窗口中选择Merge Shortest Paths to GC Roots-> with all references
的1.完成上述步骤后,您可以查看创建特定对象的Thread类。
的
cwxwcias3#
如果你只需要heap,你可以运行jmap -histo:live <YOUR PID>并解析(相当简洁的)输出。ref
jmap -histo:live <YOUR PID>
3条答案
按热度按时间oyt4ldly1#
你需要一个可以做JVM allocation profiling的工具。
Java Flight Recorder(JFR)可以帮助您进行低开销分配分析(1,2-旧版本的文档,UI现在看起来很不一样,但“分配”和“TLAB”仍然是用来查找东西的单词).确保在您使用的设置中配置is enabled。这是OpenJDK 11之前的商业功能。他们说其他一些工具可以做到这一点。现在它的开销也很低(例如async-profiler)。
如果你不关心你的应用程序变得非常慢,并且使用JDK < 11(?),VisualVM以前可以显示分配的堆栈跟踪,我在最新版本中找不到(1.4.2截至目前),但是可以在我的Oracle JDK 8-something附带的JVisualVM中找到它。“Profiler”>检查“Settings”>“Memory Settings”>检查“Record allocation stack traces”.开始分析,等待,确定最大的分配,右键单击“拍摄快照并显示分配堆栈跟踪”。它看起来像YourKit does basically the same,以及JProfiler(他们称之为“分配记录”)。再次:减慢应用程序很多,所以不要在prod中使用它。
bcs8qyzn2#
你需要定期进行堆转储,并使用MAT-内存分析工具(https://www.eclipse.org/mat/)等工具进行分析。该工具提供了哪个对象/类占用更多内存,以及它是从哪个线程创建的。
如何找到特定对象是从哪个线程创建的?
1.在MAT中,单击Histogram -它将显示转储中可用的类列表。
x1c 0d1x的数据
1.右键单击任意类名,在弹出窗口中选择列出对象->带输出引用
的
1.上面的步骤列出了所选类的所有示例。右键单击任何一个类名,然后从弹出窗口中选择Merge Shortest Paths to GC Roots-> with all references
的
1.完成上述步骤后,您可以查看创建特定对象的Thread类。
的
cwxwcias3#
如果你只需要heap,你可以运行
jmap -histo:live <YOUR PID>
并解析(相当简洁的)输出。ref