1

ガベージ コレクターがこれを部分的に拾い上げるという深刻な問題に遭遇し始めましたが、参照なしでほとんどのオブジェクトをバックグラウンドで実行したままにしています。

m_win = new MyWindow(arr);
m_win.open();
m_win.addEventListener(Event.CLOSE, onClose);

.
.
.

private function onClose(pEvent:Event):void
{
    m_win.removeEventListener(Event.CLOSE, onClose);
    m_win.close();
    m_win = null;
    // RAM usage for m_win is only reduced about 20-40%.  I can see the garbage
    // collector has run as a result of that reduction, but the other 60-80% are
    // a serious problem.
}

これは、m_win に追加した唯一のイベント リスナーであり、私のコードが m_win に対して持っている唯一の参照です。MyWindow は基本的にスタンドアロンの AIR プロジェクトです (ただし、このシナリオで機能するように適応させるために、独自の Main クラスとは異なるクラスにネストされています。それ以外は同じです)。MyWindow には、ガベージ コレクタが実行された後も有効な状態に保たれた NetConnections や NetStreams などがあります。

そのため、私が最初に試みたのは、NetConnections と NetStreams に入って切断することでした。しかし、それはうまくいきませんでした。すると、以下のブログに出会いました。

http://tomgabob.blogspot.com/2009/11/as3-memory-management.html

同じことで問題を抱えていた別の人の別のブログで、そのリンクを見つけました。おそらく、AS3のガベージコレクターが臨界量に達した「島」を見つけた場合(私の経験では、おそらく30 MB?)、拒否するだけですそれを使って何でもする。だから私はこの男の勧告に従い、少なくともすべての参照を無効にし、すべてのイベントリスナーを削除し、必要に応じてremoveAllElements()および/またはremoveChildren()を呼び出し、MyWindow全体で「デストラクタ」関数を手動で呼び出すことを試みました.唯一の例外はm_win には実際には使用されない Main クラス。

私が台無しにしない限り、うまくいきませんでした。しかし、いくつかの石をそのままにしておいたとしても、それが機能するのに十分なほど島を壊していたはずです. 私はこの問題の他の原因と回避策を調査しており、他のことを試しました (手動でガベージ コレクターを実行するように指示するなど) が、混乱を適切にクリーンアップするものは何もありません。うまくいった唯一のことは、途中で NetConnection/NetStream のものを切断することでしたが、25 ~ 30 MB ほどのデータが収集されずに残っています。

これはどのように修正できますか?ありがとう!

編集: http://www.adobe.com/devnet/actionscript/learning/as3-fundamentals/garbage-collection.htmlでアドビの声明を考えると:

"GCRoots are never garbage collected." 

と:

"The MMgc is considered a conservative collector for mark/sweep. The MMgc can't
tell if certain values in memory are object pointers (memory addresses) or a
numeric value. In order to prevent accidentally collecting objects the values
may point to, the MMgc assumes that every value could be a pointer. Therefore,
some objects that are not really being pointed to will never be collected and
will be considered a memory leak. Although you want to minimize memory leaks to
optimize performance, the occasional leaks that result from conservative GC tend
to be random, not to grow over time, and have much less of an impact on an
application's performance than leaks caused by developers."

この時点で、それと「ビッグアイランド」理論との間にある種の関連性があることがわかります-理論が正しいと仮定すると、私はそうではありません. Adobe はこの時点で、少なくとも 2 番目の声明で、オーファンがスキップされるという良性の問題があることをほぼ認めています。彼らは大したことではないように振る舞いますが、そのままにして何もないふりをするのは、ほとんどが典型的なアドビのずさんさです。彼らが言及したまれに見逃された孤児の 1 つが、その中に大規模で完全にアクティブなオブジェクト階層を持っている場合はどうなるでしょうか? そこでのメモリリークを完全に防ぐことができない場合、参照を失う前にその階層全体で参照をすべて無効にするなどのことを実行して実行すると、結果としてリークされるメモリの量を最小限に抑えるために一般的に多くのことが行われることが確実にわかります。 .

私の考えでは、ガベージ コレクターは通常、島自体ではなく、その島内のほとんどすべてのものを取り除くことができます。また、「ビッグアイランド」理論を実際に使用できたと思われるこれらの人々の何人かが見たのは、おそらくアドビが認めていたものの「あまり良性ではない」兆候のいくつかでした. ただし、これは仮説のままです。

編集:デストラクタを再度チェックしていくつかの問題を解決したところ、大幅な改善が見られました。私がこの質問をそのままにしておく理由は、メモリを解放するためにできることをまだ見逃している可能性があるだけでなく、これまでに使用した主な説明が公式または証明されていないためです。 .

4

1 に答える 1

0

電話してみてください

try {
new LocalConnection().connect('foo');
new LocalConnection().connect('foo');
} catch (e:*) {}
// the GC will perform a full mark/sweep on the second call.

ガベージコレクションを強制します。これは文書化されていませんが、機能します。彼のブログで詳細を説明しているGrantSkinnerの功績

于 2013-01-09T15:43:37.713 に答える