2

誰かが私にこれについていくつかのアドバイスを与えることができますか?Javaで複数のスレッドを使用する場合は、ガベージコレクション用の特別なプログラムを作成する必要があるという古いテキストと先生からのメモを読んでいます。

これはJavaSE6以降にも適用されますか?もしそうなら、誰かがこれを行うための標準的な方法を提供することができます。

4

5 に答える 5

2

私の知る限り、オブジェクトを指しているものがない限り、そのオブジェクトはガベージコレクターによって解放されます。

Javaのガベージコレクターは循環参照の点で非常に堅牢です。同時に実行されている複数のスレッドで動作しない理由がわかりません。

したがって、Javaが非常に効果的に実行するため、ガベージコレクション用の特別なプログラムを作成する必要はないと想定しても安全です。

Javaでオブジェクトを解放する場合は、オブジェクトを参照している変数がないことを確認してください。(Javaコレクションまたは他のライブラリからの構造(リスト、配列など)を含む)

于 2012-06-18T17:26:55.587 に答える
2

ガベージコレクターを使用すると、マルチスレッドコードの記述が容易になります。これは、マルチスレッドコンテキストでリソースを手動で解放するのが難しいためです。GCを使用すると、ほとんどの場合、心配する必要はありません。

複数のスレッドを使用する場合は、ガベージコレクション用の特別なプログラムを作成する必要があることを読んでいます。

私はこれが事実だったとは思わない。

これはSE6以降でも適用されますか?適用される場合は、これを行うための標準的な方法があります。

これを行う標準的な方法は、不要なオブジェクトを参照しないことです。たとえば、不要なローカル変数がある場合は、スコープから外します。

複雑にする必要はありません。

于 2012-06-18T18:25:12.343 に答える
1

2003年のJavaWorldからのこの記事、J2SE 1.4.1はガベージコレクションを強化し、J2SE1.4.1より前のJavaガベージコレクションについて次のように述べています。

マークアンドスイープは、「世界を止める」ガベージコレクション手法です。つまり、すべてのアプリケーションスレッドは、ガベージコレクションが完了するまで、または優先度の高いスレッドがガベージコレクタに割り込むまで停止します。ガベージコレクターが中断された場合は、再起動する必要があります。これにより、アプリケーションがスラッシングし、明らかな結果がほとんど得られない可能性があります。マークアンドスイープのもう1つの問題は、多くの種類のアプリケーションがその世界停止の性質に耐えられないことです。これは、ほぼリアルタイムの動作を必要とするアプリケーションや、多数のトランザクション指向のクライアントにサービスを提供するアプリケーションに特に当てはまります。

2009年のDr.Dobbsの記事、G1:Javaのガベージファーストガベージコレクターには、SE6より前のJavaガベージコレクターについての記述があります。

最近まで、Java SEには2つの主要なコレクターが付属していました。並列コレクターとconcurrent-mark-sweep(CMS)コレクターです。サイドバーのParallelismとConcurrencyを参照してください。最新のJavaSE6アップデートリリースの時点で、G1コレクターは別のオプションです。計画では、G1が最終的にCMSを低ポーズのソフトリアルタイムコレクターとして置き換える予定です。それがどのように機能するかを見てみましょう。

したがって、SE 6より前は、Javaガベージコレクションを支援するためのいくつかの追加の予防措置が、特に収集が必要なガベージを生成するかなりの量の一時変数を持つマルチスレッドアプリケーションで役立つ可能性があります。ただし、これには、遅い時間帯にガベージコレクターを明示的に呼び出す必要があります。何か特別なことを書くのは非常に珍しいようです。

しかし、物事は以前よりもはるかに改善されています。さらに、ガベージコレクションは、Java仮想マシンのバージョンによって異なる場合があります。

したがって、何年も前に真実であったかもしれないことは、現在の技術ではほぼ間違いなく真実ではありません。

この投稿、Javaメモリ使用量を監視する方法は?は、Javaメモリ使用量の監視と、ガベージコレクタを明示的に呼び出すことの長所と短所について説明しています。

Oracleには、JavaSE7ホットスポットJVMをカバーするJavaガベージコレクションの基本チュートリアルがあります。

于 2016-06-09T02:43:37.443 に答える
0

次のコードを使用して、ガベージコレクターを明示的に呼び出します

Runtime runtime = Runtime.getRuntime(); 
runtime.gc();

ただし、これは必須ではありません。jvmはGCの正しいタイムリーな実行を自動的に処理します。

于 2012-06-18T17:38:51.683 に答える
0

ほぼ確実に、インストラクターのメモには、Javaはマルチスレッド環境であるため、Javaランタイム環境内にガベージコレクターを実装する場合は、単一のスレッドのみが関与する場合よりも注意が必要であると(正しく)記載されています。これは、すべてのマルチスレッド環境に当てはまります

他の人が言っているように、あなたのプログラマーはこの複雑さのどれも見ていません。これは、gcが提供する自動メモリ管理の賜物です。

于 2012-06-18T17:58:13.953 に答える