3

Javaでは、を呼び出すと、new Constructor()毎回新しいオブジェクトが作成されます。新しいメモリが割り当てられるか、参照のないクラス用に作成されたオブジェクトがすでに多数あると仮定します。

したがって、Javaは、割り当て解除のマークが付けられたオブジェクトを返すことができますか、または新しいコンストラクター()が呼び出されるたびにJavaが新しいオブジェクトを作成します。

この質問をする私の基本的な意図は、そのようなことが起こった場合、新しいメモリを作成し、参照されていないオブジェクトを破棄するコストが削減されるため、パフォーマンスを向上させることができるということです。

4

6 に答える 6

5

はい。

Java はオブジェクトを再利用しません。

于 2012-09-25T13:35:19.973 に答える
4

Java は常に新しいオブジェクトを作成します。newoperator は Java では非常に高速であることに注意してください。割り当てはありません。通常の JVM は、ヒープ上のポインターを 1 つだけインクリメントします。ヒープがいっぱいになると、古くて不要なオブジェクトが削除され、ライブが圧縮されます。しかし、ガベージ コレクションは別の話です。

あなたのアイデアは賢いですが、実際にはパフォーマンスが低下します。JVM は、実行していないデッド オブジェクト (GC の対象) を追跡する必要があるだけではありません。しかし、古いオブジェクトをどうにかクリーンアップして、新鮮に見えるようにする必要もあります。それは自明ではなく、多くの時間がかかります。newより速く、よりシンプルです。

ただし、問題が 1 つあります。

Integer answer = 42;

42Integerオブジェクトに変換する必要があるリテラルです。ただし、JVM は単に呼び出すのではnew Integer(42)なく、Integer.valueOf(42)代わりに呼び出します。後者の場合、キャッシュされたvalueOf()値を返すことがあります (たとえば for になります)。42

于 2012-09-25T13:37:22.937 に答える
2

はい、newJava で使用すると、常に新しいオブジェクトが作成されます。

ただし、これは必ずしも JVM がオペレーティング システムにメモリの割り当てを要求する必要があることを意味するわけではありません。JVM がメモリを正確に割り当てる方法は、特定の JVM 実装次第であり、多くの場合、高速かつ効率的にするための多くの最適化が含まれています。

オブジェクトの割り当ては、Java では一般に安価な操作と見なされます。通常は、気にする必要はありません。

現在のバージョンの Oracle の Java に実装されている高度な最適化の一例は、エスケープ解析です。

于 2012-09-25T13:36:54.763 に答える
1

オブジェクトを作成し、参照されていないオブジェクトを破棄するコストはわずかです。時間がかかるのは

  • オブジェクトが参照されなくなったことを検出します。これを行うには、すべての強い参照をチェックする必要があります。
  • ある世代から別の世代に保持されているオブジェクトをコピーし、世代を最適化します。
  • メソッドを実装するオブジェクトをファイナライズしますfinalize()

Eden のサイズが 8 MB であろうと 8 GB であろうと、存続期間の短い一時オブジェクトを作成する場合、マイナー コレクションの実行にかかる時間はほぼ同じです。

于 2012-09-25T13:43:40.050 に答える
1

flyweight と呼ばれるデザイン パターンがあり、その主な利点はオブジェクトを再利用できることです。Java はそれを文字列自体の作成に使用します。

詳細については、こちらをご覧ください: http://en.wikipedia.org/wiki/Flyweight_pattern

于 2012-09-25T13:50:40.963 に答える
0

どこを見new()ても、new object is being created..それと同じくらい簡単..

于 2012-09-25T13:39:55.977 に答える