一位在我们公司接受过培训的java培训师声称,我们创建了380个对象来运行最简单的"Hello World“程序。这是正确的吗?我如何验证它?
发布于 2012-07-24 16:43:17
这是正确的吗?
很有可能。there是Java每次启动的大量基础设施,并且/或者必须在那里。
如何验证?
内存分析器。
这并不重要-大多数都是非常小的或基线的基础设施元素。你现在发现的是Java并不是什么都不做的。谁在乎?大多数Java程序都不是那么简单。
发布于 2012-07-24 16:45:51
编辑
为了了解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-24 16:44:23
标准库中的类中的初始化代码创建对象。例如,您可以使用VisualVM验证这一点。
没有弄清楚的是,这是创建的对象总数,还是保留的对象总数(不符合GC条件),这是非常重要的差异。如果这是创建的对象总数,那么我只能说这是一个真正优化的初始化过程的标志。380个短暂的对象分配实际上什么都不是。
https://stackoverflow.com/questions/11627180
复制相似问题