一位在我们公司接受过培训的 Java 培训师声称创建了 380 个对象来运行最简单的“Hello World”程序。这个对吗 ?我如何验证它?
问问题
183 次
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 回答