私はブログ投稿を読みました(申し訳ありませんが中国語で書かれています) 著者は次のように述べています:
これは Web 関連のアプリです。いくつかのプライベート変数を宣言します。ユーザーが何らかの操作を行うと、これらの変数は後で使用するために何らかの値に設定されます。
通常、アプリは正常に動作していますが、重い JavaScript を使用して Web サイトを開くと、アプリケーションが正しく動作せず、予期しない (アクティビティの切り替えなしで) 動作し始めます。その理由はわかりません。
最後に、これは整数変数がゼロに設定されていることが原因であることがわかりました。しかし、私たちのコードがそれをゼロにリセットしないことは確実なので、「WebView が必要とするリソースを満たすために、ガベージ コレクターが変数を収集した」という 1 つの結論しかありません。最後に、この変数を静的変数として宣言して、この問題を回避します。
率直に言って、この「GC が int をゼロに設定する」という引数は、私の Java の知識に完全に反しています。
私が知る限り:
- Java GC のコレクション単位はオブジェクトであり、プリミティブ型 int は Java ではオブジェクトではありません。
- インスタンス変数の存続時間は、所有者オブジェクトの存続時間と同じであり、そのオブジェクトが GC によって収集されると、そのインスタンス変数によって使用されたメモリが解放されます。
- その変数は、プリミティブ int ではなく Integer オブジェクトであるため、収集できますが、その変数への到達可能な参照がある限り、収集されません。
- WeakReference を使用して Integer オブジェクトを収集可能にするために Integer 参照を格納しても、Integer オブジェクトが収集された後は、すでに解放されているオブジェクトのメモリにアクセスできませんでした。
でも、思いもよらなかったことがないか心配です。
だから私は次の質問に非常に興味があります:
- ガベージ コレクションが原因で int または Integer オブジェクトがゼロにリセットされる可能性がある状況はありますか?
- 完全なオブジェクトではなく、オブジェクトが取る部分的なメモリ空間(1つのインスタンス変数のみなど)のみをGCが解放する可能性はありますか?
- ガベージ コレクション済みのオブジェクトを参照することは可能ですか?逆参照するとどうなりますか?
- 変数がランダムにゼロにリセットされ、コードが原因ではないと仮定すると、この場合の最も可能性の高いシナリオは何ですか。VM のバグ?GC バグ?JITのバグか何か?