分析 JVM 堆中的对象
在调试时,您可以使用 内存 选项卡查看堆中的对象。 IntelliJ IDEA 允许您跟踪单个类实例并分析导致对象生成或保留的条件。
这些信息对于检测内存泄漏及其原因非常有用。 有时,仅通过代码检查可能无法提供线索,因为某些错误很容易被忽略。 例如,内部类可能会阻止外部类变为可进行垃圾回收,从而可能最终导致 OutOfMemoryError。 在这种情况下,结合 内存 选项卡与 显示引用对象选项,您可以轻松发现泄漏。
此外,检查内存使用情况可以帮助您更好地了解底层的运行情况,并通过最小化不必要对象的创建来优化程序。
隐藏/显示 Memory 选项卡
点击
,在 调试 工具窗口的右上角,然后点击 内存。

内存 选项卡显示以下信息:
类 :类的名称
计数 :堆中类实例(对象)的 数量
Diff: 两个执行点之间的实例数量差异
获取有关对象数量的信息
排序和查找类
若要对类进行排序,请点击相应的标题(类、 计数 或 Diff)。 点击已选择的标准可更改顺序(升序/降序)。
若要查找类,请开始输入其名称。 输入时,过滤器会动态应用。
获取两个执行点之间的差异
有时知道自某个时间点以来创建了多少对象是有用的。 为此,您可以收集两次信息,并使用内置的 Diff 功能进行比较。
查看实例
双击 内存 选项卡上的类。
一个对话框将打开,列出所选类的所有活动实例。 您可以浏览每个对象的内容,并使用条件筛选列表。
例如,要获取所有空
String对象的列表,请在 内存 页签上双击 String 并在 条件 字段中输入this.isEmpty()。
计算保留大小
对于每个类实例,您可以计算其保留大小。 Retained size 是对象本身占用的内存量,加上它引用且未被其他对象引用的所有对象的内存量。
这在估算类或其特定实例的内存占用时非常有用。 此外,这在决定使用哪种数据结构时可能会很有用(例如, ArrayList 与 LinkedList)。
在运行应用程序之前,请确保在 附加内存代理 中启用了 选项。
当 查看类的实例时,右键点击实例,然后点击 计算保留大小。
跟踪新实例
除了获取实例数量,您还可以记录创建的特定实例及其在调用堆栈中的位置。
右键点击类并选择 跟踪新实例。
内存 选项卡现在将存储从此刻起创建的所选类实例的信息。 当有新实例时,它们的数量将会出现在 Diff 列的括号中。
要查看新实例的列表,请点击 Diff 列中的数字。 在打开的对话框中,您可以浏览每个对象的内容,并查看调用相应构造函数的线程的堆栈跟踪。
自定义视图
内存视图设置 中的选项可以让您自定义 内存 选项卡的操作方式:
要隐藏没有实例的类,请使用 仅显示实例 选项。 默认情况下, 内存 选项卡显示所有已加载的类,无论它们是否已被实例化。
如果您只对实例数量发生变化的对象感兴趣,请点击并选择 仅显示非零差异。 这会移除所有总数不变的对象。
要隐藏您不跟踪其新实例的类,请使用 仅显示跟踪的类 选项。
为了使 内存 选项卡在隐藏时也能跟踪所选类的新实例,请使用 启用隐藏内存视图追踪 选项。 此选项可能会增加被调试应用程序的一些开销。
如果您希望每次程序挂起时 内存 选项卡都能收集数据(无需点击 加载类 ),请使用 调试器停止时更新已加载的类 选项。 此功能可能会增加开销,从而影响单步执行性能。
