メモリが解放されない?

Anonymous
2013-10-15T16:34:20+00:00

Windows 8に固有の問題かどうかは分かりませんが、教えてください。

基本的にスリープや休止状態を使いシャットダウンはなるべくしないようにして使っているのですが、そうやって何日も使っているとアプリケーションが起動できなくなったり、起動してもダイアログやメニュが正しく表示されなくなったりして困っています。

そういうときにタスクマネージャで見てみると、メモリタブのメモリのコミット済みが異常に大きい値になっています。メモリが足りなくなっているのが、アプリケーションが起動できなくなっている理由ではないかと考えています。Windowsを再起動した直後は、こんなにコミット済みメモリは多くないです。せいぜい2.xGBか3.xGB程度なのですが、数日経過するとウィンドウアプリをすべて閉じてもコミット済みは7.4/8.6GBとかになっています。

もう少し調べてみると、どうも taskhostex.exe と explorer.exeの2つのプロセスがかなりのメモリを「コミット済み」にしていることが分かりました。試しにtaskhostex.exeをタスクマネージャから強制終了するとコミット済みメモリが2~3GBほど、explorerを強制終了すると1~1.5GBほど減ります。これらのプロセスが、メモリを大量に消費しているか、もしかしてメモリを解放しないままになっているのでしょうか?強制終了ではなく、これらのプロセスが使用するメモリ量を制限するか、安全に解放させる方法はありませんか?

また、ProcessExplorerを使用してtaskhostex.exeが提供しているタスクを調べてみると、Microsoft PlaySoundService Class/MsCtfMonitor Task handler/Wininet Cache task objectの3つの機能を提供しているようですが、このいずれかに問題があるのでしょうか?

ちなみにWindows ストアアプリは、まったく使用していません。使っているのは普通のデスクトップアプリばかりです。

この現象はメーカの違う2つのPCで確認しているので、固有の問題というわけではないと考えています。何か原因をご存知でしたら、教えていただきたいと思います。

よろしくお願いします。

(追記)

2台のPCで確認していますが、一方はWindows 8 64bitで、もう一方はWindows 8 Pro 64bitです。

搭載メモリはどちらも8GBです。

よろしくお願いします。

家庭向け Windows | 以前の Windows バージョン | パフォーマンスとシステムの失敗

ロックされた質問。 この質問は、Microsoft サポート コミュニティから移行されました。 役に立つかどうかに投票することはできますが、コメントの追加、質問への返信やフォローはできません。

0 件のコメント コメントはありません

61 件の回答

並べ替え方法: 最も役に立つ
  1. Anonymous
    2015-05-27T12:56:08+00:00

    私の投稿 (返信) に対するレスということですが、なんかとてつもなく勘違いされている気がするのですが。。。

    (話が噛み合っていないので、どう返信すればよいのか。。。)

    しいて言えば、私は質問主ではなく、単なる一返信者。。。ということなのですが、その点をご理解された上で、私の投稿に対して返信されたのでしょうか?

    ちなみに、「インサイド Windows」という書籍があるのですが、こちらはお読みになられていますでしょうか?

    (本件を議論するには、この本に書かれている内容を把握されているかが重要になりますので、一応確認ということで。)


    インサイド Windows 第6版

    http://www.amazon.co.jp/%E3%82%A4%E3%83%B3%E3%82%B5%E3%82%A4%E3%83%89WINDOWS-%E7%AC%AC6%E7%89%88-%E4%B8%8A-Microsoft-Press/dp/4822294706

    http://www.amazon.co.jp/%E3%82%A4%E3%83%B3%E3%82%B5%E3%82%A4%E3%83%89Windows-%E7%AC%AC6%E7%89%88-%E4%B8%8B-Microsoft-Press/dp/4822294714


    まだ読まれていないようでしたら、是非読まれることをお勧めします。

    (私はこの本を最初に読んだとき、ものすごい「衝撃」を受けました。)

    話が噛み合っていないと思われるのでしたら残念です。

    あなたに指摘を理解できる知識や能力がなかっただけということですので、そっとご退場頂くのがよろしいかと。

    ここはスレッドのテーマに基づき、自分の試行錯誤の結果を共有する場と理解しています。

    明らかに間違った情報を発信した場合、誰もがその間違いを指摘できると私は思っています。

    この回答は役に立ちましたか?

    1 人がこの回答が役に立ったと思いました。
    0 件のコメント コメントはありません
  2. Anonymous
    2015-04-17T16:13:53+00:00

    横から見ていたものですが、議論が関係ない方に向かっているみたいなので本題に戻したい意味も込めてこちらに返信させて頂きます。

    OSをwin8に変えてから、スリープにするとメモリーが解放されずに蓄積されていくというこちらの現象に度々悩まされていました。

    だいたい一週間に一度ほどPCを再起動したり、メモリーも16GBほど積んでいたので、あまり気になるほどの現象ではなかったのですが、なんとなく気持ち悪いモヤモヤはずっとありました。

    たまたま今週に入ってからこの問題について検索してみると、こちらのフォーラムに辿り着いて、一年半も前からこの現象に着目して諦めずに原因を究明しようとしている方たちがいることに驚きと感動を覚えています。

    こちらでの議論は全て目を通させて頂いたのですが、このコミュニティで上がった問題で、ユーザー側が解決できない問題点について、Microsoftが修正を施すのかなど不明な点が多く、あまり理解していない上で発言させて頂きます。

    問題の解決方法としては、ユーザー側で対処できるなら、原因とその解決方法を周知する。

    ユーザー側で対処できないなら、Microsoftにこの問題を伝えて修正版をWindows Updateなどでユーザーに配布してもらう必要があります。

    次に、Microsoftも影響度が大きいものや緊急度が高いものから優先的に対処していく必要があるので、この問題がどれほど大きくとりあげられるかなのですが、これに関しては影響度が大きいと考えます。

    win8のみならず、以降のOSやsurfaceにまで影響のあることなら、放置されるような甘い問題点ではなくメモリーが正常に解放されないことでセキュリティにも問題が発生すること。

    また、再現性が低いとかではなく、スリープを使うユーザーが一定数いれば気づくようなことなので、放置しておくことでMicrosoftの企業としての信頼性を損なうようなものになるかもしれません。

    メモリダンプとか採取して解析すれば問題点がわかるのでしょうが、技術的にそれをできる人がここを見ていてやってくれるのかはわかりません。

    ただ、その他にもここを12000回も見ている人がいるのだから、技術がわからないから難しい話になっているといってただ諦めるのではなくて、SNSなどでこのフォーラムでの内容を伝えるだけでも技術に詳しい人がここを訪れてくれるきっかけになるかもしれません。

    具体的な問題解決策とは程遠い長文でしたが、とりあえずは一度議論を落ち着けて考えてみませんか?

    > muranoさん

    このフォーラムでできることは地道に問題解決のために考えられる手段を少しずつ進めていき、技術的に解析できるならそれをして、Microsoftには今起きている現象と判明していることを伝えることなんじゃないかと思います。

    muranoさんが根気強くこちらで活動していたおかげで私はここに来られました。

    できればこの問題が解決することを祈るとともに、今後も頑張っていきましょう。

    > お.馬.鹿さん

    あなたはここを訪れる人の中でもより詳しい問題の解決方法を提案してくれました。

    わざわざここを見に来て助言をくれるということは少なからずこの問題にも興味がおありのこととお見受けします。

    できれば一緒に解決しませんか?

    追記

    > お.馬.鹿さん

    と入れたらシステムに、 > お****さん という風に検閲されてしまいました。

    お.馬.鹿さんは名前にお.馬.鹿さんと入れて返信する人の気持ちを考えたことはありますか!

    この回答は役に立ちましたか?

    1 人がこの回答が役に立ったと思いました。
    0 件のコメント コメントはありません
  3. Anonymous
    2015-02-06T13:18:09+00:00

    まだ解決してませんが、追加で判明したことがあるので報告まで。

    VMMapというツールを使えば、プロセスがどのようにメモリを使っているかがより詳細に見えることが分かりました。

    このツールによると、"unusable"なるメモリが大量に確保されたままになっていると分かりました。この"unusable"が増える現象は、explorer.exeとtaskhostex.exeで特に顕著に起きています。

    下の画像は、コミット済みメモリが増えた時にexplorer.exeのメモリ使用状況をVMMapで確認したところですが、この"unusable"メモリが2GByteにもなっていました。他のプロセスでこんなに大きくなっているものありません。多くても数十MByte程度です。

    この画像では、explorerは3.3GByteほどのコミット済みメモリを持っているようですが、この状態explorerを殺すと、タスクマネージャ上の表示は7.0GByte→4.0GByteに下がりました。DLLなどのファイルの一部はファイルマッピングで他のプロセスと共有していることを考えると、3.0GByteの減少はおよそ妥当な線ではないかと考えてます。

    比較しやすいように、問題が発生するまえに取っておいた画面キャプチャを右隣りに貼り付けてあります。

    問題発生前から特に増えているのが、"unusable"ですが、"Shareable"も結構増えています。が、それでも300MByte程度です。

    この"unusable"というメモリは何なんでしょうか。調べたところでは、VirtualAllocで割り当てたページの残骸のようです。VirtualAllocは64KByte単位でメモリを割り当てますが、小さい量のメモリ(4Kとか8Kbyte)をこのVirtualAllocで割り当てると、残りの60~56KByteは使用できないままになってしまうようです。それが蓄積して、このときは2GByteにもなっているものと思われます。

    疑問点は、

    • どのモジュールがこの小さいメモリ領域をVirtualAlloc APIで割り当てているのか?なぜ、ランタイムのヒープではなくて、VirtualAllocを使ったのか?
    • 割り当てたメモリは解放されないのか?ずっと使っているのか?それとも解放するのを忘れているのか?

    の2点です。

    試しに、簡単なテストプログラムを作って小さいメモリをVirtualAllocし続けるようにしてみると、確かに上のVMMapが示すような"unusable"が何GByteにもなるようなプロセスとなりました。しかし、タスクマネージャ上の”コミット済み"は何GByteも増えなかったです。この点では、explorer.exeの振る舞いとは異なっています。なぜかはまだ分かりません。

    上の説明が正しいとすると、"unusable"と表示されているメモリ領域にはそのVirtualAlloc API呼び出す理由となったメモリ領域がペアで存在するはずです。ざっと調べる限り、そのペアとなっているメモリはほとんどがShareableなメモリで、サイズは4Kか8Kでした。また、比較的若いアドレス0x00010000あたりから連続してShareable+unusableなメモリ領域が連続していることから、これらのメモリはexplorer.exe自体が割り当てて使用しているのではないか?と推測しています。explorer.exeがロードしたDLLやシェルエクステンションではなく、やはりexplorer.exe自体が怪しいのでは?という予測です。

    こちらのページ(http://blogs.microsoft.co.il/sasha/2014/07/22/tracking-unusable-virtual-memory-vmmap/)に、WinDbgを使ってVirtualAlloc系API呼び出しをトラップする方法が記されているので、後日時間があるときに試してみたいと思います。VirtualAllocにブレークポイントを張って、スタックトレースすればどのモジュールから呼び出されているかがある程度分かるはずです。この方法で犯人を絞り込んでみたいです。

    この回答は役に立ちましたか?

    1 人がこの回答が役に立ったと思いました。
    0 件のコメント コメントはありません
  4. Anonymous
    2013-10-31T04:43:13+00:00

    質問者です。

    教えていただいたクリーンブートを試してみました。

    2台で同じ症状が出ているので、両方に共通して入れているアプリケーションやサービスに原因があるのではないかと考えて、それらのサービスを無効にしてみたり、スタートアップ項目から外してみたり、また共に使っているRAMディスクをアンインストールしてみたりと、いろいろしてみたのですが、やはり現象は出ます。

    先ほども、コミット済みのメモリが9.2GBまで上がってきたので、これを下げるべく、リソースモニターを開いて2つ起動しているexplorer.exeプロセスのうち、ワーキングセットサイズの大きい方だけを「プロセスの終了」してみました。すると、コミット済みメモリが4.2GBも減って、5.0GBにまで落ちました。

    やはり、explorer.exeに問題があるのではないでしょうか?メモリを使うだけ使って、解放しないとか。

    究極的には、OSをインストールしなおして何も追加インストールしない状態で1週間とか使ってみればOS自体の問題かどうかの切り分けはできそうですが、何も入っていないPCを1週間も使えませんし、仕事にも差し支えます。

    explorer.exeの問題と書きましたが、もう少し問題箇所を絞る方法はないのでしょうか?例えば、シェルエクステンションに問題があってメモリを食いつぶしていると仮定するなら、特定の(あるいは全部の)シェルエクステンションを読み込まないで起動するオプションがあるとかの方法です。

    以上、よろしくお願いいたします。

    この回答は役に立ちましたか?

    0 件のコメント コメントはありません
  5. Anonymous
    2013-10-16T08:05:56+00:00

    murano さん、こんにちは。

    マイクロソフト コミュニティへの投稿ありがとうございます。

    シャットダウンをせずに PC を長時間使っているとパフォーマンスが悪化し、プログラムを終了してもメモリが解放されないような状況なのですね。

    過去に同じような症状で「こちらのスレッド」があったのですが、このときは Windows 8 に対応していないセキュリティ ソフトが原因のようでした。

    常駐プログラムなどの影響かどうかを切り分けるために PC を「クリーン ブート」起動した場合の動作を確認してみてはいかがでしょう。

    ただ、「何日か使っていると」ということで、なかなか繰り返しの検証などは難しいかもしれませんね。。。

    他に有効な対処や切り分けの方法をご存知の方がいらっしゃいましたら、ぜひ書き込みをお待ちしています。

    この回答は役に立ちましたか?

    0 件のコメント コメントはありません