【问题标题】:How to check the number of objects created in heap memory?如何检查堆内存中创建的对象数量?
【发布时间】:2015-12-19 12:58:51
【问题描述】:

我想看看当我运行我的程序时有多少对象是由 Java 创建的。

我的意图是如果我使用代码String s = new String("Hi"); 我想看看Java 将创建多少对象。稍后我想试试String news = "Hi";

这是我的示例程序:

import java.util.Scanner;

public class Test { 
    public static void main(String[] args) {
        String str = new String("Hi");
        Scanner s = new Scanner(System.in);
        s.nextLine();
    }
}

我使用Scanner 只是为了避免程序终止。

我浏览了这篇 SO 帖子 How to find the number of objects in the heap 并尝试使用 jvisualvm,但该工具没有给出我在班级中创建的对象的数量。我也不明白如何根据下图获取对象的实际数量。

当我尝试使用命令jmap -heap <pid> 时出现以下错误:

正在附加到进程 ID 15101,请稍候...附加到错误 进程:sun.jvm.hotspot.debugger.DebuggerException:无法附加到 过程

如果我使用 eclipse Debug 作为选项,那么我发现它不是找出正在创建的对象数量的正确方法。

【问题讨论】:

  • 确实如此 - 实例列
  • 你创建的对象太少了,这几乎无关紧要。如果您想确切知道有多少对象,我建议您使用调试器。如果您有数百万或数十亿个对象,则使用分析器会更有用。顺便说一句,VisualVM 在运行时每秒会创建数千个对象,因此任何低于此值的对象都可能会在噪音中消失。
  • @Antoniossss,instances 列的变化非常频繁。它还说为 String 创建了 20K 个实例。那么我如何知道为我的单行代码new String() 创建了多少对象?你能告诉我吗
  • @PeterLawrey,谢谢,现在很清楚为什么我在 JvisualVM 中看到这么多对象了。当您说调试器时,您是在说我必须说“在 Eclipse 中调试为 Java 应用程序”吗?您能否提供更多详细信息,因为我已经尝试过 eclipse 调试,这不是正确的答案。
  • @user3181365 当您在调试器中单步执行代码时,您可以看到创建的每个对象。有些方法它不会向您显示,但如果您将它们放在变量中,您将能够看到所有对象。由于您最多有 3 个带有String s = new String("hi"); 的对象,因此您可以轻松计算它们。

标签: java memory


【解决方案1】:

如果您查看调试器,您会看到

String@437 对象在 s1 s2 s3 中是相同的,但这指的是另一个对象 char[2]@438。因此你有两个对象。

【讨论】:

  • 我同意 s1、s2 和 s3 引用同一个对象,但我不认为从调试器中可以看出这一点,因为哈希码基于内容,而不是内存位置。如果代码有s4 = new String("hi"),那将有相同的哈希码但不同的内存位置。
【解决方案2】:

Intellij IDEA 2017版在debugger页面有一个名为“memory view”的窗口。

【讨论】:

    猜你喜欢
    • 2014-11-12
    • 1970-01-01
    • 2011-09-26
    • 2010-09-27
    • 1970-01-01
    • 2014-07-04
    • 2013-08-21
    • 2013-04-12
    • 2011-01-16
    相关资源
    最近更新 更多