4

一位在我们公司接受过培训的 Java 培训师声称创建了 380 个对象来运行最简单的“Hello World”程序。这个对吗 ?我如何验证它?

4

3 回答 3

8

这个对吗 ?

很可能。Java 每次都会启动很多基础架构和/或必须存在。

我如何验证它?

内存分析器。

没关系 - 大多数将是非常小的或基线基础设施元素。您现在发现的是,Java 不是很苗条,什么都不做。谁在乎?大多数 Java 程序并不是那么简单。

于 2012-07-24T08:43:17.200 回答
4

编辑

很可能,要了解 JVM 所做的工作,您可以查看为执行简单程序而加载的类的数量。这些将是加载的类,而不是实例(为此,您需要分析您的程序),但这是获得总体思路的快速方法。

编写一个简单的 HelloWorld 类(即使使用空的 main 方法)

public class HelloWorld {

    public static void main(String [] arguments) {
    }

}

编译它并使用-verbose选项执行它。JVM 会告诉你加载了哪些类

$ javac HelloWorld.java
$ java -verbose HelloWorld
[Opened /System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Classes/classes.jar]
[Loaded java.lang.Object from    /System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Classes/classes.jar]
[Loaded java.io.Serializable from /System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Classes/classes.jar]
[Loaded java.lang.Comparable from /System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Classes/classes.jar]
[Loaded java.lang.CharSequence from /System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Classes/classes.jar]
[Loaded java.lang.String from /System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Classes/classes.jar]

如果您在 Unix 环境中,grep您可以计算行数wc

$ java -verbose HelloWorld | grep Loaded | wc -l
588
于 2012-07-24T08:45:51.247 回答
1

标准库类中的初始化代码创建对象。例如,您可以使用 VisualVM 验证这一点。

不清楚的是这是创建的对象总数,还是保留的对象总数(不符合 GC 条件),这是一个非常重要的区别。如果这是创建的对象总数,那么我只能说这是真正优化初始化过程的标志。380 个短暂的对象分配几乎没有。

于 2012-07-24T08:44:23.023 回答