過去ログ表示


過去ログ 159 を表示

トピック内全 21 記事中の 11 〜 20 番目を表示
[ 最新記事及び返信フォームをトピックトップへ ]
このトピックの全ページ / [0] [1] [2]

(環境: WinXP SP2/seamonkey1.0a)

> どうして、メモリリークってこう、言葉だけが有名なんでしょうか?

わかりやすいからでは?私はメモリリークは下記の方法で(も)見る事が出来る、と思ってます。
1.GUIツールのタスクマネージャーで見る事が出来る。
2.メモリが増加したら(数字が変わるので)現象を捉える事が出来る。その際にC言語などのデバックツールは不要。

2のメモリ増加は正しい現象かそうでない現象かは調べないとホントかどうかわかりませんが、開発者でなくとも理解しやすい現象なのでしょう。メモリリークは上記で再現出来ますが、セキュリティのバッファオーバーフロー(バッファオーバーラン)は私もイメージはあって理解しているつもりですが再現とか出来ませんし。(笑)
ではでは。

(環境: WinXP SP2/seamonkey1.0a)

>  メモリリークって開発言語ツールのデバッカーじゃないと突き止められないのではないのでしょうか?ユーザーが操作しない、かつ、タスクマネージャーでメモリ増加=メモリリークでいいの?>詳しい人。

タスクマネージャはプロセスに割り当てているメモリ量を調べるツールであって、そのアプリが実際に使用しているメモリ量を調べるものではありません。メモリリークを調べるツールがあるのかどうか知りませんが、ソースコードがないと調べられないことは確かだと思います。

ある処理を行った後、プロセス終了まで一切解放されないメモリがあったとしても、それをリークとは断定できません。例えば、ゲームプログラミングなんかではよくある、sin/cos/tanの計算結果の表をメモリ上に展開しておいて、計算に使う場合です。設計によっては、プログラムのある時点でこの表の生成が行われるでしょうが、必要なくなるまで長時間、確保されたままになります。でも、必要なので解放されていないだけで、リークしている訳ではありません。

また、ヒープ領域のフラグメント化という問題もあり、実際に利用している量よりも、プロセスに割り当てられたメモリ量の方が大きい場合もあります。
例えば、1Mのブロックが連続して三つ存在していたとします。このうち、真ん中のブロックを解放したとします。この場合、2Mしか必要ありませんが、メモリ内の再配置は行われないので、外部からは3M消費している様に見えます。更に、2Mのブロックを確保しようとすると真ん中の空間は再利用しようにもサイズが小さすぎるので新たにメモりを確保するしかありません。ですから、1M + 空1M + 1M + 2Mで5M使うことになります。

こういったフラグメント化が発生しないように、各クラス内の処理では徹底してヒープを利用しなくてすむようにコーディングされています。(呼び出しもとでスタックに生成してポインタで渡していく。配列が必要な場合、固定長の配列を大きめにスタックに生成し、それでも長さが足りない場合にだけヒープに必要なサイズを再確保する。等)

しかし、Mozillaは非常に大量のクラスの生成、破棄を繰り返すため、(例えば一行のテキストを生成するためだけにnsIFrame派生クラスが最低でも三つは必要ではないかと(もっとかな?))どうしても、フラグメント化が発生している可能性があります。
また、使用頻度の少ないメンバを動的生成したりするため(IME処理用のバッファ等)、どうしてもヒープ領域の利用機会は存在しています。ヒープを利用する限りはこの問題は避けて通れないので仕方ないとしか言えないと思います。

(環境: Win2000/seamonkey1.0a)

> > どうして、メモリリークってこう、言葉だけが有名なんでしょうか?
>
> わかりやすいからでは?私はメモリリークは下記の方法で(も)見る事が出来る、と思ってます。
> 1.GUIツールのタスクマネージャーで見る事が出来る。
できません。あれは、OSがアプリに割り当てたメモリ容量であって、実使用量ではありません。他の私のコメントを参照してください。

> 2.メモリが増加したら(数字が変わるので)現象を捉える事が出来る。その際にC言語などのデバックツールは不要。
>
> 2のメモリ増加は正しい現象かそうでない現象かは調べないとホントかどうかわかりませんが、開発者でなくとも理解しやすい現象なのでしょう。メモリリークは上記で再現出来ますが、セキュリティのバッファオーバーフロー(バッファオーバーラン)は私もイメージはあって理解しているつもりですが再現とか出来ませんし。(笑)
> ではでは。

アンアンさんもメモリリークという用語を誤解されています。メモリリークはメモリ使用量のことではありません。動的に確保したメモリを解放し忘れて(多くの場合はそのメモリへのポインタも紛失していて)、ゴミとなった必要もないメモリ空間が意図に反して残ってしまうことです。

(環境: WinXP SP2/Firefox1.5b)

> >  メモリリークって開発言語ツールのデバッカーじゃないと突き止められないのではないのでしょうか?ユーザーが操作しない、かつ、タスクマネージャーでメモリ増加=メモリリークでいいの?>詳しい人。
>
> タスクマネージャはプロセスに割り当てているメモリ量を調べるツールであって、そのアプリが実際に使用しているメモリ量を調べるものではありません。メモリリークを調べるツールがあるのかどうか知りませんが、ソースコードがないと調べられないことは確かだと思います。

私が現役プログラマの時代はPurifyというツールを使っていて、これはソースコードがなくてもメモリリークや初期化していない変数のアクセスなどびしばし見つけてくれました。もちろんソースが無いと修正も出来ませんけどね。まれにOSの提供する機能で見つかったり、、、
Mozillaがどういうテストをしているか知りませんが、少なくとも売り物のソフトウェアならこの手のツールでちゃんとチェックしているものと思っているのですが。
ちゃんとケアのしていないプログラムに初めてこの手のチェックを行うと、あまりのエラーの数に愕然とするものです(経験者)。

(環境: WinXP SP2/seamonkey1.0a)

No25018に返信(levelさんの記事)
> 私が現役プログラマの時代はPurifyというツールを使っていて、これはソースコードがなくてもメモリリークや初期化していない変数のアクセスなどびしばし見つけてくれました。もちろんソースが無いと修正も出来ませんけどね。まれにOSの提供する機能で見つかったり、、、
> Mozillaがどういうテストをしているか知りませんが、少なくとも売り物のソフトウェアならこの手のツールでちゃんとチェックしているものと思っているのですが。
> ちゃんとケアのしていないプログラムに初めてこの手のチェックを行うと、あまりのエラーの数に愕然とするものです(経験者)。WinXP SP2/Firefox1.5b

http://www.sra.co.jp/Rational/purify/purify.html
これですか。
未初期化のものを見つけるのは理屈として分からなくもないんですけど、

> PURIFY はメモリ・リークを探し出し、孤立したメモリ・ヒープをリストします。これは、ポインタをたどらずに行ないます。

というのが分かりませんね。どうやって「孤立」と判断するんでしょうか。

そういやうちの某エディタも初めてメモリリークのチェッカで検査したときはその多さにびっくりました。

(環境: WinXP SP2/seamonkey1.0a)

http://www.mozilla.org/performance/leak-brownbag.html
http://www.mozilla.org/projects/xpcom/MemoryTools.html

といった文書がありました。
DEBUGビルドの動作ログからメモリリークが調査できるようになっているようです。
メモリリークに関するバグを報告するならこのへんでまずは証拠を揃えて、というのが筋ですね。

(環境: WinXP SP2/Firefox1.5b)

> どうなんでしょうね。OSの動作って不勉強でよく分かってないですが、プロセスごとにメモリ空間を分割しているので、プロセス終了時にはリークしていたメモリ空間も破棄できそうな気もします。
 おっしゃる通りで、Windows ではプロセスが破棄されたら、メモリーオブジェクトも破棄されます。

(環境: WinXP SP2/seamonkey1.0a)

> http://www.sra.co.jp/Rational/purify/purify.html
> これですか。

MacだとOSパッケージ付属のデベロッパツールをインストールすると、leaksというコマンドラインツールがもれなく付いてきます。
このツールを使ってleakがあるよとbugも開かれています。
https://bugzilla.mozilla.org/show_bug.cgi?id=244597

本当にleakしているかは、中野さんが述べているようにログメッセージを頼りに一つ一つ検証する事に成るかと。

microsoftもleakが起こっているかの確認方法が出ていますが、これもどういう操作を行なうとleakしているかログを頼りに辺りをつけ、実際にソースコード検証となるんじゃないかな。
http://support.microsoft.com/default.aspx?scid=kb;ja;416469
http://support.microsoft.com/default.aspx?scid=kb;ja;409927

(環境: Win2000/Firefox1.5b)

暫くの間、もじら組サイトが私のアクセスする時に限って(?)
タイムアウトする状態が続いて書き込めない間に
トピックが膨らんでいましたので、まずはWadaさんから...

>>搭載メモリが実質的には約220MBなので、フリーズしたのは
>>搭載メモリに対して使用量が多くなり過ぎたからだとも思いますが、
>
> 「搭載メモリが実質的には約220MB」で、
(中略)
> スワップファイルの拡張をしている間の「ほとんどフリーズ状態」、という感じがします。

たぶん実際には、そうだったのだと思いますが、
その間に次々に積み増しされる要求にFirefoxが答えきれなくなった感じです.
最終的にはWindowsから脳死通知が出たので、プロセスの残存を諦めました.

> スワップファイルのサイズの初期値はどのくらいですか?

「システムのプロパティ」-「仮想メモリ」で見ると初期値は336MBですね...
この辺りはPCの初期状態から変えていません.
ちなみに最大値は672MBになっていました.

> スワップファイルは、実際に拡張されていましたか?

そこまでは、見ていませんでした.

> スワップファイルのサイズの初期値を今より少し増やしてみると、どうなりますか?

試してみます.

> (Q1)「オフライン状態のまましばらく放置していた」というのは

スタンバイには入っていませんでしたが、モニタは消してありました.
どのプログラムが積極的に動いていたかは調べていませんし、
どのウィンドウがアクティブだったかも忘れましたが、
放置していた間はどのアプリも使っていません.
※私としては、スタンバイに入る様にしていたつもりだったのですが、
調べてみると実際にはそういう設定にはなっていなくて、
どんなに経ってもスタンバイには入らなかったみたいです^-^;

> (Q2)ウィンドウを閉じたら100MBほど減った、というのは、
(中略)
> リソースの解放(Object.destroy)が正常に行われた証拠

...ですね. でも、解放された量には驚きました.
複数のウィンドウでタブを次々と開いても、普通の状態なら
タスクマネージャに表示されるメモリの総使用量は200MB台で、
300MBの大台に乗る事は稀なんです.
勿論、画像編集ソフトやら何やらあれこれと起動してあれば、
それくらいの数字になる事はあると思いますが、
メモリ大喰いのFirefoxのためにFirefoxが動いている間は、
仮に途中でそういうものを起動しても用が済む度に終了させています.

> bfcache
/*
???
判らないので調べてみました.
http://level.s69.xrea.com/mozilla/index.cgi?id=20050507_bfcache によると
「レンダリング結果自体をメモリにキャッシュ」という事ですが...
今確認してみたところ、browser.sessionhistory.max_viewers は 3 ですね.
たぶん、既定値だと思います.
*/
> があるので、タブ・ウィンドウ当たりの仮想記憶使用量は増えているはずですけど。

この先は、私の能力ではちとテストし切れませんので、
お答えを割愛させて頂きますが、基本的には
タブを一つ閉じればメモリ使用量は幾らか減る.
ウィンドウを一つ閉じればメモリ使用量はもっと減る.
Firefoxが終了すればメモリ使用量はぐっと減る.
...という挙動には変わりありません.
1.0系よりはメモリ使用量は少ない様に感じていますし、
減り方も幾らか顕著だと思います.

> なにをやっても仮想メモリー使用量がほとんど減らず、無制限に増えていく

という状況は今のところ無いですね.

ただ、メモリ使用量が増えていった状況を実際に確認していませんので、
今のところは答え様が無いという感じです.
判り次第、追々報告していきます.

> (Q3)なにか機能拡張をいれてませんか?

β1には、標準以外の拡張は入っていません.
標準で付いて来る拡張は、たぶん全部入っています.
拡張マネージャに表示されているのは、
DOMインスペクタ、レポータ、トークバックの3つです.
いずれ、それぞれ無効にしたりも試してみますが...

(環境: Win2000/Firefox1.5b)

(どの辺りに書いたら良いのか判らないので、取り急ぎ此処に書きますが^-^;)
私自身は、今回メモリリークとは書いていませんので念のため.

私も最初のフリーズの時はメモリリークかとも思ったのですが、
2度目に遭遇した際にウィンドウを閉じる事でメモリが解放されていますので、
仮にタブ単位でリークしていたとしても、
ウィンドウ単位ではかなり捕捉できている様に思います.
ここまで来ると仮にリークしているとしてもアナライザにでもかけない限りは
正体を突き止めるのは難しいのではないでしょうか.
メモリリークしていないと起き難い、1.0系の様な
終了しない限り延々とメモリ使用量を増やし続ける現象は
私はまだ目にしていません.

最初の投稿は、"DeerPark"β1が(Firefox1.5β1と書くのが面倒なので)
何かの際にメモリを大量に割り当ててしまう様な事があるのではないか、
という風に受け取って貰えると有難いです.
もし仮に、身動き取れなくなるまで食べ続けてしまう事があるのだとしたら、
それはやっぱり病気でしょ?
でも、私の経験した2回だけではそうとは断定できませんし、
何か偶然が重なってそうなったのかも知れません.
だから、他にもそういう現象があったかをお伺いした次第です.


[ 前のトピック内容10件 ] | [ 次のトピック内容10件 ]
このトピックの全ページ / [0] [1] [2]

返信不可


- Child Tree -