[解決済み] Javaで変数にfinalを使用するとガベージコレクションが改善されますか?
質問
今日、同僚と一緒に
final
キーワードの使用について議論しました。
例えば、こんなメソッドを書いたとします。
public Double doCalc(final Double value)
{
final Double maxWeight = 1000.0;
final Double totalWeight = maxWeight * value;
return totalWeight;
}
メソッド内の変数を宣言する
final
で宣言しておくと、メソッド終了後にガベージコレクションがメソッド内の未使用の変数からメモリを一掃するのに役立ちます。
これは本当でしょうか?
どのように解決するのですか?
ここでは、最終値型のローカル変数ではなく、最終参照型のフィールドを使った少し変わった例を紹介します。
public class MyClass {
public final MyOtherObject obj;
}
MyClass のインスタンスを作成するたびに、MyOtherObject インスタンスへの外部参照を作成することになり、GC はライブオブジェクトを探すためにそのリンクをたどらなければならなくなるのです。
JVMはマークスイープGCアルゴリズムを使用し、GC "root"ロケーション(現在のコールスタック内のすべてのオブジェクトのように)内のすべてのライブリファレンスを検査しなければなりません。各ライブオブジェクトは生きているとして"mark"され、ライブオブジェクトによって参照される任意のオブジェクトはまた生きているとしてマークされます。
マーク段階の完了後、GC はヒープを一掃し、マークされていないすべてのオブジェクトのメモリを解放します (そして、残りの生きているオブジェクトのメモリをコンパクトにします)。
また、Javaヒープメモリがquot;若い世代とquot;古い世代に分割されることを認識することが重要です。すべてのオブジェクトは、最初に若い世代に割り当てられます(「苗床」とも呼ばれます)。ほとんどのオブジェクトは短命なので、GCは若い世代から最近のゴミをより積極的に解放します。オブジェクトが若い世代の収集サイクルを生き残った場合、それは古い世代 (時として "tenured generation") に移動され、処理頻度が低くなります。
つまり、頭から、"いいえ、'final' modifer は GC の作業負荷を減らすのに役立ちません" と言うつもりです。
私の意見では、Java でメモリ管理を最適化するための最良の戦略は、偽の参照を可能な限り迅速に排除することです。それを行うには、使用を終えたらすぐにオブジェクトの参照に "null" を代入することです。
あるいは、もっと良い方法は、各宣言スコープのサイズを最小にすることです。例えば、1000行のメソッドの冒頭でオブジェクトを宣言し、そのメソッドのスコープ(最後の閉じ中括弧)が閉じるまでオブジェクトが生き続ける場合、オブジェクトは実際に必要な時間よりもはるかに長く生き続けるかもしれません。
もし、十数行のコードしかない小さなメソッドを使用するなら、そのメソッド内で宣言されたオブジェクトはより迅速にスコープから外れ、GC ははるかに効率的な若い世代の中でその仕事のほとんどを行うことができます。絶対に必要でない限り、オブジェクトを古い世代に移動させたくはないでしょう。
関連
-
[解決済み] Javaはパラメータのデフォルト値をサポートしていますか?
-
[解決済み] ランダムな文字列を使用するこのコードは、なぜ "hello world" と表示されるのですか?
-
[解決済み] Javaの「for each」ループはどのように機能するのですか?
-
[解決済み] なぜJavaにはtransientフィールドがあるのですか?
-
[解決済み] Javaにおける "final class "の意味とは?
-
[解決済み] Javaの "final "キーワードはどのように機能するのでしょうか?(オブジェクトを修正することは可能です。)
-
[解決済み】Javaではfinallyブロックは必ず実行されるのですか?
-
[解決済み】Javaの「ダブルブレース初期化」の効率化?
-
[解決済み】Javaでfinalキーワードを使用するとパフォーマンスが向上しますか?
-
[解決済み] Javaでオブジェクトをnullに代入するとガベージコレクションに影響があるのか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Eclipse の問題 アクセス制限。タイプ 'jfxrt' はAPI解決されていません。
-
executeQuery()でデータ操作文が発行できない。解決方法
-
javaの非静的メソッドを静的に参照することができない
-
java マイクロソフト払い戻し予期せぬサーバーからのファイルの終了
-
Junitのユニットテストエラー
-
Web Project JavaでPropertiesファイルを読み込むと、「指定されたファイルがシステムで見つかりません」というソリューションが表示されます。
-
Java Runtime Environmentを継続するためのメモリが不足しています。
-
テストが空であるかどうかを判断するためのオプションの処理
-
htmlとwordの相互変換の実装(画像あり)
-
WeChat小プログラム Bluetooth通信 Bluetoothモジュールデモ