当社でトレーニングを受けた Java トレーナーは、最も単純な「Hello World」プログラムを実行するために作成された 380 個のオブジェクトがあると主張しています。これは正しいです ?どうすれば確認できますか?
3 に答える
これは正しいです ?
可能性が非常に高い。Java が毎回起動するインフラストラクチャや、そこになければならないインフラストラクチャがたくさんあります。
どうすれば確認できますか?
メモリ プロファイラー。
それは問題ではありません - ほとんどは非常に小さいか、ベースラインのインフラストラクチャ要素になります。ここでわかったことは、Java は何もしないというほどスリムではないということです。誰も気にしない?ほとんどの Java プログラムはそれほど単純ではありません。
編集
JVM によって何が行われるかを理解するには、単純なプログラムを実行するためにロードされるクラスの数を調べることができます。これらはロードされたクラスであり、インスタンスではありません (これについては、プログラムをプロファイリングする必要があります) が、一般的なアイデアを得るための簡単な方法です。
単純な HelloWorld クラスを記述します (メイン メソッドが空の場合でも)
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
標準ライブラリのクラスの初期化コードは、オブジェクトを作成します。これは、たとえば VisualVM を使用して確認できます。
明確にされていないのは、これが作成されたオブジェクトの合計なのか、保持されたオブジェクトの合計なのか(GC の対象外) であり、これは非常に重要な違いです。これが作成されたオブジェクトの総数である場合、これは本当に適切に最適化された初期化手順の兆候であるとしか言えません。380 の短期間のオブジェクト割り当ては事実上何もありません。