是否仅在使用new
关键字时创建对象?一旦此代码到达评论,已创建了多少个对象?我说的是4个新对象,因为构造函数每次初始化new Exception()
时都会调用Car
。如何验证创建的对象数量?
class Car {
Car() {
try {
throw new Exception();
} catch (Exception ex) {
System.out.println("Do Nothing");
}
}
}
class Test {
public static void main(String[] args) {
Car carOne = new Car();
Car carTwo = new Car();
Car carThree = carTwo;
// how many objects have been created? 4?
}
}
答案 0 :(得分:8)
没有(至少不是我的知识)自动计算在java中创建了多少对象的方法。但是,在您的示例中,创建了4个对象,2个异常和两个汽车。
如果要计算给定类的对象数,可以使用每次创建对象时递增的静态计数器。
编辑:你可以使用jmap
计算创建的对象,正如安德烈亚斯所指出的那样,尽管这是一个不太实用的解决方案
答案 1 :(得分:4)
您可以使用jmap
和jhat
来获取JVM的内存转储。
在注释中添加Thread.sleep(20000)
将使程序等待20秒,以便您执行以下命令。如果需要,可以增加等待时间。
在一个命令提示符下,运行您的程序:
java -cp . Car
在另一个命令提示符中,在20秒等待期间,运行
jps
jmap -dump:file=C:/temp/x.dmp 99999
jhat C:/temp/x.dmp
99999
是jps
的输出中列出的进程ID。
jhat
程序在端口7000
上启动Web服务器,请转到:
http://localhost:7000/
点击"显示所有课程(不包括平台)"的实例计数,您只会看到2个对象:
2 instances of class Car
这是因为您从显示中排除了Exception
类。
如果你点击" ...(包括平台)"链接,你会看到很多对象,如下所示:
Total of 6214 instances occupying 8071681 bytes.
如果你实现自己的例外,e.q。 CarException
然后扔掉它,你会看到4" user"创建的对象:
2 instances of class Car
2 instances of class CarException
那么,哪个答案是正确的? 2,4或6214?
可能预期的答案是4,如" 你的程序创建了多少个对象?"。
关于是否仅在使用new
关键字时创建对象的问题,答案为否。还有很多其他方法(例如,在这个答案中列出:https://stackoverflow.com/a/2103578/5221149),这里有一些方法,对构造创建的对象数量进行注释:
// Using "new"
new MyObject() // 1 + number of objects created by constructor
new int[0] // 1
new int[10] // 1
new int[] {1,2,3,4} // 1
new int[10][] // 1
new int[10][20] // 11 (1 outer array + 10 inner arrays)
// Not using "new"
int[] x = {1,2,3,4} // 1
Integer x = 1 // 1 <-- autoboxing
printf("", i, j) // 3 (autobox of i + autobox of j + varargs array)
String x = "a" + i // 3 (StringBuilder + String + array backing String)
Integer[][] x = {{1111},{2222},{3333,4444},{},{}} // 10 (1 outer array + 5 inner arrays + 4 Integers)