Java 如何检查在堆内存中创建的对象数?

Java 如何检查在堆内存中创建的对象数?,java,memory,Java,Memory,我想看看在运行程序时Java创建了多少个对象 我的意图是如果我使用代码strings=newstring(“Hi”)我想看看Java将创建多少对象。稍后我想尝试使用String news=“Hi” 这是我的示例程序: import java.util.Scanner; public class Test { public static void main(String[] args) { String str = new String("Hi"); S

我想看看在运行程序时Java创建了多少个对象

我的意图是如果我使用代码
strings=newstring(“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();
    }
}
我使用
扫描仪
只是为了避免程序终止

我已经阅读了这篇SO文章,并尝试使用
jvisualvm
,但该工具没有给出在我的类中创建的对象的计数。我也不明白如何根据下面的图片得到物体的实际数量

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

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


如果我使用EclipseDebug作为选项,那么我会发现这不是找到正在创建的对象数量的正确方法。

如果您查看调试器,您可以看到这一点


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

在2017版Intellij idea中,调试器页面中有一个名为“内存视图”的窗口。

实际上是这样的-实例列您创建的对象太少,几乎不重要。如果你想知道到底有多少个对象,我建议你使用调试器。如果有数百万或数十亿个对象,使用探查器更有用。顺便说一句,VisualVM在运行时每秒会创建数千个对象,因此任何小于此值的对象都可能在噪音中丢失。@Antoniosss,“实例”列的更改非常频繁。它还表示为字符串创建了20K个实例。那么,我如何知道为我的一行代码
newstring()
创建了多少个对象呢?你能告诉我吗me@PeterLawrey,谢谢,现在很清楚为什么我在JvisualVM中看到这么多对象。当你说debugger时,你是说我必须说“在eclipse中作为Java应用程序进行调试”吗?请您提供一些详细信息,因为我尝试了eclipse调试,这不是正确的答案。@user3181365当您在调试器中进入代码时,您可以看到创建的每个对象。有些方法它不会显示给您,但是如果您将它们放在变量中,您将能够看到所有的对象。因为您最多有3个对象具有
String s=new String(“hi”)s4=新字符串(“hi”)
,则该字符串将具有相同的哈希代码,但具有不同的内存位置。