【发布时间】: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");的对象,因此您可以轻松计算它们。