确定在Java中创建的对象数

时间:2015-12-18 23:03:36

标签: java

是否仅在使用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?
    }
}

2 个答案:

答案 0 :(得分:8)

没有(至少不是我的知识)自动计算在java中创建了多少对象的方法。但是,在您的示例中,创建了4个对象,2个异常和两个汽车。

如果要计算给定类的对象数,可以使用每次创建对象时递增的静态计数器。

编辑:你可以使用jmap计算创建的对象,正如安德烈亚斯所指出的那样,尽管这是一个不太实用的解决方案

答案 1 :(得分:4)

您可以使用jmapjhat来获取JVM的内存转储。

在注释中添加Thread.sleep(20000)将使程序等待20秒,以便您执行以下命令。如果需要,可以增加等待时间。

在一个命令提示符下,运行您的程序:

java -cp . Car

在另一个命令提示符中,在20秒等待期间,运行

jps
jmap -dump:file=C:/temp/x.dmp 99999
jhat C:/temp/x.dmp

99999jps的输出中列出的进程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)