分析JVM堆中的对象
最后修改时间:2023年1月11日调试工具窗口:查看 | 工具窗口 | 调试或Alt05
调试时,可以使用“内存”选项卡查看堆中所有对象的详细信息。IntelliJ IDEA 允许您跟踪实例并分析导致对象生成或保留的条件。
此信息对于检测内存泄漏及其原因非常有用。仅仅靠代码检查可能无法提供任何线索,因为有些错误很容易被忽视。例如,内部类可能会阻止外部类进行垃圾恢复,这最终可能会导致OutOfMemoryError
。这种情况下,将“内存”选项卡与“显示引用对象”选项相结合可以让您轻松找到泄漏。
此外,检查内存使用情况可以帮助您更好地了解幕后发生的情况,并通过最大程度地减少不必要的对象来创建优化程序。
隐藏/显示内存选项卡
单击 调试工具窗口右上角的,然后单击内存。
内存选项卡显示以下信息:
套件: 套件名称
Count:堆中类实例(对象)的数量
Diff:两个执行点之间实例数的差异
获取有关对象数量的信息
排序并查找类别
要对降类进行排序,请单击相应的标题(Class、Count或Diff)。单击已选择的条件会更改顺序(升序/序)。
要更换课程,请开始输入其名称。名称过滤器将在您键入时动态应用。
获取两个执行点之间的差异
有时,了解自已创建了多少对象以来的某个时刻是很有用的。因此,您可以收集多个信息并使用内置的Diff函数进行比较。
查看实例
双击“内存”选项卡上的类。
将打开一个对话框,其中列出了所选类的所有活动实例。您可以浏览每个对象的内容并使用条件过滤列表。
例如,要获取所有空
String
对象的列表,请双击“内存”选项卡上的“字符串” ,然后在“条件”字段中输入。this.isEmpty()
计算保留大小
对于每个类实例,您可以计算其保留大小。保留大小是对象本身及其引用的所有对象以及未被其他对象引用的所有对象所占用的内存量。
在估计大量单例或从磁盘读取的数据(例如复杂的 JSON)的内存占用量时,这非常有用。此外,在决定使用哪种数据结构(例如,ArrayList
与LinkedList
)时,这也很有用。
在运行应用程序之前,请确保在“设置”| “附加内存代理”选项已启用。构建、执行、部署 | 调试器。
查看类的实例时,右键单击实例,然后单击计算保留大小。
跟踪新实例
除了获取实例数量之外,您还可以记录创建了哪些特定实例以及在调用堆栈中发生的位置。
右键单击一个类并选择“跟踪新实例”。
“内存”选项卡现在将存储在此之后创建的所选类的实例的信息。当有新实例时,它们的数量将显示在Diff列的括号中。
要查看新实例的列表,请单击“差异”列中的数字。在打开的对话框中,您可以浏览每个对象的内容,并查看调用相应构造函数的线程的堆栈跟踪。
笔记
为了让“内存”选项卡跟踪实例,它必须保持打开状态。
自定义视图
内存视图设置 中的选项允许您自定义内存选项卡的操作方式:
要隐藏没有任何实例的类,请使用“仅显示实例”选项。默认情况下,“内存”选项卡显示所有加载的类,无论它们是否已在程序中使用。
如果您只对实例数量已更改的对象感兴趣,请单击 并选择仅显示非零差异。这将删除总数保持不变的所有对象。
要隐藏您未跟踪其新实例的类,请使用仅显示跟踪的类选项。
要允许“内存”选项卡跟踪所选类的新实例(即使它处于隐藏状态),请使用“启用隐藏内存视图跟踪”选项。此选项可能会使调试的应用程序增加一些开销。
如果您希望“内存”选项卡在每次程序挂起时收集数据(无需单击“加载类”),请使用“调试器时更新加载类”选项。此功能可能会增加开销,从而影响停止机芯性能。
感谢您的反馈意见!