3

Activity コンポーネントと Service コンポーネントの両方を持つ Android アプリを作成しています。さらに、アクティビティとサービスの両方でいくつかの場所で共有しているリソースをカプセル化するクラスがあります。私の質問は、リソースをいつ解放するかをどのように把握できるかです。私が理解しているように、Javaにはデストラクタの概念がないため、オブジェクトへの参照がなくなったときに呼び出される共有オブジェクトにデストラクタを作成することはできません。Android には、アクティビティ用の onPause やサービス用の onDestroy などの関数がありますが、技術的には、これらの関数のいずれかがすべての可能なシャットダウン状況で呼び出されるという保証はありません (たとえば、低メモリ キラーはこれらの関数を呼び出さないなど)。そしていずれにせよ、

Javaにはデストラクタがないため、独自の「close()」タイプの関数を作成して手動で呼び出すという情報源もあります。しかし、これが機能するには、独自の参照カウント方式を維持する必要があるように思われます。これは、Java がそのような方式の必要性を排除する GC を既に持っていることを考えると、かなり奇妙に思えます。

ここで適切な解決策は何ですか?

4

3 に答える 3

2

答えはノーだ。

自分でファイルを閉じるなどのクリーンアップを覚えておく必要がありますが、適切なクリーンアップを行わないオブジェクトでさえ、GC がそれらを一掃した場合にアクションを実行したりスペースを占有したりできないため、メモリ リークを引き起こすことはめったにありません。それを生かし続けるために明示的に何かをしない限り、それはそうなるでしょう。

私の考えでは、懸念できる唯一の場所は静的オブジェクトであり、C コードを呼び出し、クラス間で巨大なオブジェクトを渡します。かなりの量のスパゲッティ、循環参照、コードを実行すると、オブジェクトへの参照がまだ残っているため、GC がオブジェクトを収集しないというリスクがあります。

ある程度まともなコードを作成する限り、問題ありません。パニックにならない

于 2013-09-28T21:46:49.743 に答える
0

Java にはデストラクタがありませんが、finalize()は、デストラクタのように機能するすべてのオブジェクトで使用されます。

メモリー内の標準オブジェクトはそれほど心配する必要はありません。別のクラスで参照されていない場合、java はそれらを自動的に破棄します。これは Android や標準の Java とは関係ありません。

作成に費用がかかる高価なリソースがある場合は、serealizable を使用してディスク上に永続化することを考えるかもしれません。永続化したくない場合は、Java 参照を考えて、それを長期間存続させることができます。このシナリオでは、シングルトン デザイン パターンを考えて、高価なオブジェクトをより細かく制御することもできます。これらのどれも、GC がアクティブに参照されていないオブジェクトを破棄する標準の Java ガベージ コレクションと矛盾しません。

オブジェクトがアクティビティからアクティビティにジャンプするときは、このタイプのオブジェクトがどのアクティビティとも切り離されていること、および目に見えないアクティビティの参照を保持していないことを確認してください。これらすべてのビュー オブジェクトのアクティビティは、表示されていないときに特に Android が持ち運ぶには大きすぎます。

ただし、古い Android バージョンでは、ビットマップ メモリがネイティブ レイヤーに割り当てられており、リサイクルを呼び出さないとガベージ コレクションは行われません。

バインドされたサービスを作成し、そのサービスにオブジェクトを保持すると、アクティブな接続が残っている限り、Android はそのサービスを維持します。

于 2013-09-28T22:24:21.250 に答える