Java 如何检查在堆内存中创建的对象数?
我想看看在运行程序时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
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”)我同意s1、s2和s3引用同一个对象,但我不相信从调试器中可以明显看出这一点,因为哈希代码基于内容,而不是内存位置。如果代码具有s4=新字符串(“hi”)
,则该字符串将具有相同的哈希代码,但具有不同的内存位置。