2012-01-15 10 views
4

64ビットOSの場合は、実質的に無制限のアドレススペースがあります。だから私の質問は、そのようなシステムではメモリの問題を多く解決するのでしょうか?デマンドページングスキーム(メモリは、タッチされたときにのみ持ち込まれる)では、メモリを解放するのに比べて少しオーバーヘッドがありますが、メモリのようにいくつか余分なページスワップです長い時間触れないと、自動的に入れ替えられます。私はここに何かを逃していますかまたは私の議論は有効ですか?64ビットOSの場合、メモリリークはまだ関係していますか?

実際には、それが大きなパフォーマンスヒットでないなら、メモリリークはもはや対処する重要な問題ではないので、C/C++プログラマにとっては良いことだと思います!

+4

はい、追加するメモリが多ければ多いほど、アプリケーションがクラッシュする可能性は低くなります。しかし、それは実践を漏らすことが良い習慣であるということを意味しません。みんながこれをやり始めたら何が起きるのだろうとあなたに尋ねると、なぜそれが見えるでしょう。この質問の目的を理解するのは難しいです。 –

+0

どのようにあなたが煉獄に送る予定のメモリとアクティブなサービスに必要なメモリをOSが事前に決定するかを提案しますか?それはあなたが作成しようとする無数の無駄なページのどれかでアクティブなメモリが見つからないようにする必要があります。 –

答えて

11

オーバーヘッド...は...メモリとして...いくつかの余分なページスワップで自動的にどこにスワップすることを自動的に

をスワップするのでしょうか?エーテル?ページファイルは、存在するストレージと同様に有限です。

長く実行しているサービスアプリケーションでメモリを解放しないことをお勧めしますか?

2

以前に割り当てられたメモリをクリーンアップするのはベストプラクティスではありませんか?

パフォーマンス上の理由によりすべてのプログラムがメモリブロックを解放すると、何が起こるかがわかります。

はい、大したことです。

+1

ええ、しかし、私はあなたが多くのパフォーマンスヒットがあるとは思わない、これは私の質問です。メモリリークがもはや大きな問題になることはないので、実際の状況では良いこともあります。 – MetallicPriest

+2

シナリオが再現するのが難しいため、「何が起こるか」は理想的な答えではありません。私はポスターが正確に何が起こるのか、そしてなぜそれに興味があるのか​​確信しています。 – zoul

+1

@ MetallicPriest:同じ量のメモリを搭載した32ビットシステムと同じパフォーマンスが得られます。違いはどこから生じるべきだと思いますか? – Groo

2

アプリケーションによって異なります。アプリケーションによっては、大きなロット(例えば、毎秒数百メガバイト)を割り当てるものもある。あなたはそれを決して解放するつもりはないと思うが、スワップスペースを使用すると、数ギガバイトのスワップを数時間で満たすことができます。

ガベージコレクションに関する巨大な文献を参照してください。 the garbage collection handbookを開始します。

古いアンドリュー・アペルの論文garbage collection can be faster than stack allocationは興味深い洞察力を与えるはずです。

しかし、少し漏れたガベージコレクタを考えると、リークレートは1分あたり数メガバイト(GC後)に過ぎず、状況は異なります。

短期間のアプリケーションしか考慮しない場合、メモリリークはそれほど重要ではありません。しかし、サーバープロセスが長続きするとすぐに、メモリを気にする必要があります。それを解放(または再利用)することは決して悪い考えではありません。

+1

あなたの番号は*少し*過大評価されています。 100 MB /秒を割り当てるプログラムは、1時間に約350 GBを割り当てます。300( "数百")MB/sと3時間( "数時間")、3 TBを取得します。あなたのスワップスペースはどれくらいですか? ;)確かに、それはちょうど作られた例ですが、私はニックピッチしたいと思うし、現実的な見積もりで厳密な計算をするともっと説得力があります。 – delnan

+0

しかし、3TBは今日、膨大なスワップスペースです。私は3TBのスワップを作るのに3TbのSSD、または十分な10KRPMのハードディスクを購入するのに十分な富裕層ではありません。私はギガバイトサイズのスワップについて話しました.Terbytesスワップではありません。 –

2

はい、寿命が短いツール(例えば、lsなどのコマンドラインユーティリティ)には意味があります。

たとえば、Busyboxには、いつものようにメモリをfreeにするかどうかを制御する設定オプションがあります。また、終了時に自動的にOSにクリーンアップさせることもできます。

サイズの最適化としてFEATURE_CLEAN_UP

は、busyboxのは、通常、明示的に 動的に割り当てられたメモリを解放するか、ファイルを閉じずに終了します。これは、OSが私たちのためにクリーンアップするので、 の領域を節約しますが、valgrindのようなデバッガ を混乱させる可能性があります。

を手作業で清掃する理由がない限り、これを有効にしないでください。

3

ここのキーワードは「事実上」であると考えられます。その定義は「実際はありません」ということになります。あなたは、実際には無制限ではないメモリ空間を持っています。ますます増加するメモリの可用性に伴って変化しているのは、アプリケーションの範囲であり、メモリ管理については無頓着です。

「Hello World」と書いている場合は、メモリガベージをそのまま残すことができます。最近、は、独自のメモリを管理していない小さなアプリを手に入れることができました。しかし、オペレーティングシステムが動作している限り動作することが期待されるデバイスドライバやサービスデーモンを作成すると、他の誰かのメモリを手動でクリーンアップするために、週に1回、プロダクションマシンを停止する必要はありません漏れ。

+0

ここでは多くの人が質問を誤解していると思います。彼は今日、私たちがメモリリークを気にしないほどのメモリを持っていることを示唆していません。彼は、漏れたメモリが最終的にシステムによってページアウトされ、RAMを再び解放するため、アプリケーションがメモリを解放しない状況を考えています*。 32ビットシステムでは、プロセスがアドレス空間を使い果たす可能性があります.64ビットシステムでは、何らかの意味があります。 – zoul

+2

@zoulしたがって、RAMを解放してページファイルのスペースを占有します。メモリページ数に制限はありません。だから、* virtual(ly)*のセマンティクスに関するこの記事は、私に間違っているように見えません。 –

1

あなたがいないfree() INGのメモリがクラッシュする場合に発生することができます最悪のことを思うなら、あなたはときに何が起こるかを検討する必要があります。あなたはソケットバッファを割り当てることができない、あなたがパケットをドロップ開始する必要があり

  • は、 。
  • スラッシングからパフォーマンスが低下します(常にリークします)。
  • おそらく、デバッグ/診断ログやメッセージを生成することはできません。
  • ファイル記述子が不足しています。

結論は、割り当てられたメモリを解放します。それはあなたの正気を救うでしょう。

2

アドレス空間は実質的に無限に見えるかもしれませんが、現在のコンピュータ上の物理ストレージは間違いありません。 OS(LinuxだけでなくあらゆるOS)は、明示的に解放されない限り、メモリページでアプリケーションが完了したことを知る方法がありません。スワップアウトされたページには、まだディスクスペースとCPU + I/O時間が必要です。

私の経験から、控えめなマーケティング担当者がコンピュータシステムを販売していた非常に少数のケースでも、利用可能なメモリはまだが問題となりました。

さらに、アプリケーションがメモリを解放したときに何が起きるのかを知りたい場合は、メモリを漏らしたり、メモリを過度に使用しているアプリケーションを見てみてください。たとえば、数時間のタブ集約型アクティビティの後のFirefoxは、すぐに私の8GBシステムで3GBを超えるようになります。私は想像したくはありませんが、メモリがなくなってもその数がどれほど増えるのか想像したくありません。

同じアプリケーションを同時に実行している10個のアプリケーションを想像してみましょう.1つはデスクトップシステムに30GBの物理メモリまたは仮想メモリを搭載していません。そして、私のシステムは、すでにFirefoxののちょうど単一のインスタンスでスラッシングされている場合、私はあなたの提案シナリオでは何が起こるかを恐れて...

+0

+1はい、Firefoxの人々は明らかにすでに質問者のロジックを適用し始めました。多くのバージョンをChromeに移行した大きな理由ですいつも自分自身に尋ねる:「すべてのアプリがこれをしたらどうなるだろうか? Stack Overflowがロードされる前でもほとんどの質問に答えます。 –

0

あなたは64ビットOSを持っている場合は、あなたが無制限の事実 のアドレス空間を持っていますサイズ

あなたが見逃している部分は、virtual部分です。

まず、実際のRAMには常に制限があります。


4GBの例では、プロセスがメモリを解放せずに新しいメモリを要求し続けると、OSは仮想ページをスワップするためにHDを使用し始めます。

プロセスフォールトとHDへのアクセスがあり、実行中のすべてのプロセス(このプロセスが正常であると思われた後に実行された場合)に発生すると、プロセスおよびシステム全体に大きなオーバーヘッドが発生します。
その結果、ユーザーが「使用可能な」システムを持つためには、RAMを増やす必要があります。
あなたのシステムが応答していないが、RAMを増やすだけでいい場合、どのようにユーザーが反応すると思いますか? ..... 16GBまたは32GBまたは.....

関連する問題