2015-12-18 7 views
5

newキーワードが使用されている場合にのみオブジェクトが作成されますか?このコードがコメントに達すると、いくつのオブジェクトが作成されましたか?私はCarが初期化されるたびにコンストラクタがnew Exception()を呼び出すので、4つの新しいオブジェクトを言っています。作成されるオブジェクトの数を確認するにはどうすればよいですか?Javaで作成されたオブジェクトの数を確認します

class Car { 
    Car() { 
     try { 
      throw new Exception(); 
     } catch (Exception ex) { 
      System.out.println("Do Nothing"); 
     } 
    } 
} 

class Test { 
    public static void main(String[] args) { 
     Car carOne = new Car(); 
     Car carTwo = new Car(); 
     Car carThree = carTwo; 
     // how many objects have been created? 4? 
    } 
} 
+2

ですか?私は前に検査でこれを見ました... –

+3

'new'はオブジェクトを作成する唯一の方法ではないため、信頼できるカウンタではありません:http://stackoverflow.com/questions/95419/what-are-all -the-different-ways-to-create-object-in-javaあなたの場合、それは動作しますが、はい、ここに4つのオブジェクトが作成されます。 – MC10

+0

例外はおそらく内部的にスタックトレースを作成し、任意の数のスタックトレース要素を作成する可能性があります。 –

答えて

8

Javaで作成されたオブジェクトの数を自動でカウントする方法はありません(少なくとも私の知識はありません)。ただし、あなたの例では、4つのオブジェクト、2つの例外、2つのCarsが作成されています。

特定のクラスに含まれるオブジェクトの数を数えたい場合は、オブジェクトが作成されるたびに増分される静的カウンタを持つことができます。

編集:アンドレアスで指摘したように、あなたはそれが

+0

* Java仮想マシン*を変更してmalloc操作の数などをカウントできます。 –

+2

@CommuSoftアップルパイを焼く宇宙... D –

+1

バーチャルマシンのアップグレードは、AspectJなどと呼ばれています。 –

3

非常に実用的ではない解決策ですが、あなたはJVMのメモリダンプを取得するためにjmapjhatを使用することができ、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) 
関連する問題