非常に実用的ではない解決策ですが、あなたはJVMのメモリダンプを取得するためにjmap
とjhat
を使用することができ、jmap
を使用して作成したオブジェクトをカウントすることができます。
コメントにThread.sleep(20000)
を追加すると、プログラムは20秒待ってから次のコマンドを実行します。必要に応じて待ち時間を増やしてください。
1つのコマンドプロンプトでは、あなたのプログラムを実行します、20秒の待機中に別のコマンドプロンプトで
java -cp . Car
を、実行99999
がに記載されているプロセスIDです
jps
jmap -dump:file=C:/temp/x.dmp 99999
jhat C:/temp/x.dmp
jps
からの出力。
jhat
プログラムがポート7000
上のWebサーバーを起動しますので、に行く:上
http://localhost:7000/
クリックして「表示インスタンスは、(プラットフォームを除く)すべてのクラスのカウント」、そしてあなただけの2つのオブジェクトが表示されます:
2 instances of class Car
これは、Exception
クラスを表示から除外したためです。
あなたは...「(プラットフォームを含む)」リンクを、あなたはこのようなもので、多数のオブジェクトを参照してくださいね上でクリックした場合:あなたがあなた自身の例外を実装する場合
Total of 6214 instances occupying 8071681 bytes.
、e.q. CarException
、代わりに、あなたが作成した4「ユーザー」オブジェクト表示されますスロー:その答えが正しいか、そう
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)
ですか?私は前に検査でこれを見ました... –
'new'はオブジェクトを作成する唯一の方法ではないため、信頼できるカウンタではありません:http://stackoverflow.com/questions/95419/what-are-all -the-different-ways-to-create-object-in-javaあなたの場合、それは動作しますが、はい、ここに4つのオブジェクトが作成されます。 – MC10
例外はおそらく内部的にスタックトレースを作成し、任意の数のスタックトレース要素を作成する可能性があります。 –