2011-02-08 4 views
1

私はしばらくの間、Windows 7ガジェットのメモリリークに取り組んでいましたが、メモリリークを悪化させ、さらにリークを追加したと考えていました。私は約16時間ガジェットの4つのインスタンスを実行し、メモリ使用量は22,000Kから36,000Kになりました。しかし、私を混乱させるものは、ハンドル、ユーザーオブジェクト、およびGDIオブジェクトがほぼ同じままであるということです。 USERとGDIオブジェクトは実際にはまったく同じままで、ハンドルはその間に1026から1034のようなものにジャンプしました。私のガジェットは7秒ごとに更新されるので、サイドバーの偏りがあると思う。メモリリークについての質問Javascript Windows Gadget(一般的に)

一般的なケースでは、どのような種類のメモリリークがこのような原因になるのでしょうか?そして、私の場合は、このガジェットのWebサービスにアクセスするためにAjaxを使用しています.Ajaxでこのようなことが起こる可能性があるのは誰でも知っていれば素晴らしいでしょう。

私はすでにJavascriptのメモリリークの主な原因に関する記事を見ていますが、ハンドルとオブジェクトが効果的に同じ状態になったときにメモリがそんなに上がる理由について誰かが考えているかどうかは不思議です。おそらく、Ajaxやそのような場合の一般的なプログラミングでは、既知の原因がありますか?

+0

私は重大な問題であるためにサイズの14KBの増加を考えるとは思わない。 – Pointy

+0

@Pointy私はKを使って何千もの記号を表していましたが、KBで読むことさえ考えられませんでしたが、タスクマネージャーがKを使ってKBを示すので意味があります。私は最近出かけてきた。しかし、ええ、それは14,000 KBの増加です。 – user535617

+1

だから14メガバイト、平凡な言葉で、右か?実際のコードを見ることなく、非常に具体的な答えが得られるのか疑問です。 – Pointy

答えて

0

私は間違いなくライブラリなしで行われたJS作業を感謝しますが、このような状況では、JQuery(またはPrototype、Mootolsなど)をミックスに挿入することができます。これらは、Ajaxリクエスト(およびDOM操作)を使用したメモリー消費を非常によくテストされています。

最初にDOMコードを変更する必要はありませんが、AjaxリクエストをJQueryのAjaxメソッドで置き換えてみてください。次に、メモリテストを再度実行します。これで解消されれば、XHRコードにメモリ不具合があることがわかります。

それ以外の場合は、DOMコード内のイベントハンドラに関連している可能性があります。削除する前に適切に削除されていない要素です(DOM要素を削除して追加すると仮定しています)。 IEでハンドラが削除されないと、メモリリークが発生します(DOM要素は無期限にメモリに保持されます)。

+0

私はDOM要素を追加して削除しますが、あなたは正しいでしょう。私は質問がありますが、JQueryはセキュリティ証明書のエラーを無視できますか?今私は自分のJSが特定の状況でそれを行うように設定している。私は、一般的なケースでは悪い習慣であることを十分に認識していますが、実際にはこの場合必要です。 – user535617

+0

これはすばらしい質問です。実際には、セキュリティ証明書のエラーを処理する必要があるものはありません。よく分かりません。 – Shakakai

0

Windows 7 64ビットSP1では、影響を受ける可能性のあるsidebar.exeのメモリリークが発生しました。私の知る限り、これはまだ修正されていませんが、this blog postは回避策を提供しています。