• ベストアンサー

メモリリークの質問です。

メモリリークの質問です。 それぞれ100程のデータが入っている配列を4つほど利用し、「array_key」関数を使用してキーのデータを抽出する関数を作成致しました。 その関数を、1日300ユーザ程が利用します。 <質問> メモリリークが起こる可能性はあるのでしょうか? (サーバーのメモリは、8Gほどあります) また、何かしらメモリの不具合で配列にデータが入らずに「array_key」で検索することができないというようなことはありますでしょうか? 以上、何かアドバイスが御座いましたら、教えて頂けますでしょうか。よろしくお願い致します。

  • PHP
  • 回答数1
  • ありがとう数2

質問者が選んだベストアンサー

  • ベストアンサー
  • D-Matsu
  • ベストアンサー率45% (1080/2394)
回答No.1

メモリリークを誤解しているような気がします。 8Gほどあります、という補足部分からして「確保しきれないほどメモリを確保しようとした状態」が頭にあると思われますが、メモリリークはもうちょっと端的な書き方をすると「確保したメモリの利用が終わった後に解放を忘れる」ことです。 #これが積み重なるともちろん利用可能メモリが相対的に減少するので最終的には確保不能エラーを吐く可能性ももちろんあります ですから…… > メモリリークが起こる可能性はあるのでしょうか? 「使い終わったあとの解放処理が抜ければもちろんメモリリークは発生する」でしょう。 ただし、プログラムを抜けたあとで「そのプログラムのみが使っていたメモリ」は一般的なデスクトップ・サーバ用OSなら勝手にOSが回収します。 ですから起動しっぱなしのプログラムでなければあまり気にしなくても構いません。 > 何かしらメモリの不具合で配列にデータが入らずに「array_key」で検索することができないというようなことはありますでしょうか? メモリモジュールの物理的故障が発生していたら、何が起きても不思議はありません。

sadoru
質問者

お礼

ご返信が遅くなりすいません。 また、ご指摘の通り、メモリリークを勘違いしておりました。 理解できました。 ありがとうございます。

関連するQ&A

  • イベント登録とメモリリークについて(jQuery)

    下記のような【html】をjQueryのAjax関数とhtml()を利用した【処理フロー】で、動的にDOMに追加しているのですが、以下の【質問】にお答え頂けないでしょうか。 【html】 <div> (省略) <a href="javascript:void(0);" onclick="foo({'arg1':'str1','arg2':'str2','arg3':num3…});">テスト</a> (省略) </div> ※foo関数の引数は初期化配列を指定、引数値はサーバサイドで動的に変化させてクライアントに出力 【処理フロー】 a要素クリック→foo関数実行→jQueryのAjax関数でfoo関数引数の配列値をサーバに送信→レスポンスとして新たな【html】を受信して、jQueryのempty()、html()を使用して同じ要素配下を置き換え ※$.ajax({..., data:配列オブジェクト, ...}); のように、dataプロパティにfoo関数の引数をそのまま渡しています 【質問】 1.上記のonclickの内容が原因かどうかは分かっていませんが、繰り返しフローを走らせると、各ブラウザ(IE8,FireFox3.6,safari5,Opera11)でメモリリークが発生します。上記のonclickの関数に初期化配列という定義に問題はあるでしょうか。 2.foo関数の引数にある配列は、要素がクリックされたタイミングでオブジェクト化される認識であっていますでしょうか。また、上記のフローだと開放される(参照されなくなる)タイミングは、Ajax通信完了後という認識であっていますでしょうか。 3.Webで調査した範囲では、jQueryのempty()、html()はどちらも削除/置き換え前の要素に紐づいたイベントは削除されるようなのですが、上記のようにhtml()で追加する要素にonclickイベントを定義している場合も、次回empty()、html()で置き換え時にイベント削除されるでしょうか。 4.1に関連しますが、上記の内容、処理フローにおいて、置き換え前の要素セットやfoo関数の引数がメモリリークを引き起こす可能性はあるでしょうか。 どうぞよろしくお願いいたします。

  • メモリリーク対策

    トップページを開くたびに、SQLサーバへデータベースを参照し、内容を表示させる、というASPページを作成しましたが、メモリリークが度々起こります。プログラムを調査しましたが、解放していないロジックは見当たりませんでした。とりあえずの対応として、サーバ再起動を1/週で実施するようバッチを作成しました。 しかし、トップページには、 <META http-equiv="refresh" content="1800"> が記述してあり、 もしかしてこのrefreshが問題なのかと思って調べているのですがイマイチはっきりした回答がありません。 恐れいりますが、 refresh指定すると、メモリリークは必ず発生してしまうものなのでしょうか? どなたか教えていただけましたら幸いです。 その際、回避方法なども教えていただけましたら助かります。 以上、宜しくお願い致します。

  • メモリリーク

    メモリリークに関する質問です。 現在稼動しているサーバーについてなのですが、メモリの使用量が実際に搭載しているメモリ量を超えてスワップが発生してしまっています。一日当り数MBのメモリが消費されてしまっているようなのですが、タスクマネージャー上ではそんなに増えているアプリケーションはありません。 プリンタドライバが悪さをしているとの話もあるのですが、調査の仕方がわからず困っています。 まずはこれがメモリリークなのかどうかがよくわからないのですが、調査方法等ご存知の方、知恵を貸してください。よろしくお願いいたします。 【ちなみに環境は】 ・Windows2000Server ・ORACLE9.0.1 ・プリンタ用のパッケージ ・VC++及びVBにて開発 【こんなシステムです】 ・一日に1400枚程度の紙を印字 ・RS232Cを使用して他のコンピュータと通信を  一日に1400回程度行っている  (1回あたり256バイト)

  • システム領域で起こるメモリリーク

    メモリリークを起こしているのはシステム領域で、ユーザ領域は正常です。 処理の概要はディレクトリパスをDBから取得(Pro*C)し、そのディレクトリ内のファイルを削除(remove関数)するです。 Cの関数でシステム領域のメモリを確保するものはあるのでしょうか?ご存知の方がおられるなら回答お願いします。

  • VB6.0のメモリリークについて

    こんにちは、当方、VB6.0を使用してアプリケーションを作成していますが、メモリリークが発生して困っています。 以下、プログラムのイメージになります。 ファイルを常時監視するメソッド(chkfile)の無限ループ内で、ファイルを取得するメソッド(getfile)を使用して、 ファイルを取得→変換する処理を行っています。 ファイルの取得方法は2パターンあり、1つ目は、任意の間隔(分単位)で機器と通信して取得する方法、 2つ目は共有フォルダを設定して置かれたファイルを取得する方法です。 現象としましては、数時間起動させておくとメモリを1GB程度使用してフリーズしてしまいます。 (エンドユーザーのPCで発生しており、当方の開発環境では確認しておりません。) 上記を踏まえ質問があります。 (1)自分でソースを追いかけ、調査を行ったところ、ファイルを取得するメソッド(getfile)内で、Scripting.FileSystemObjectを使用して おり、以下の様に毎回インスタンスを生成しています。ですが、処理が終わった後、インスタンスの解放処理を行っていません。  スコープが外れた場合、参照は自動的に消滅すると思っていますが認識は合っていますでしょうか?  Dim fso As New Scripting.FileSystemObject (2)「VB6.0 メモリリーク」のキーワードで検索したところ、UBoundについての記述を見つけることができました。  Microsoftサポート 文書番号: 197190(http://support.microsoft.com/kb/197190/ja)  ファイルを取得するメソッド(getfile)内で、UBoundを使用していますが、上記URLとは異なる使用方法です。 上記URLでの使用方法 UBoundのパラメータに配列の戻り値を指定する。  作成したプログラムでの使用方法 指定したフォルダ内のファイルを取得するメソッド(getinfile)でbyrefキーワードに配列を指定して、その配列の要素数をforループの  上限数に使用しています。 使用方法に問題はないと思うのですが、もしかして、UBoundを使用するのがまずいのでしょうか。 当然、予期せぬデータ等に対する不具合も疑いましたが、現象が発生した状態の変換元ファイルを使用して動作させたところ 問題はありませんでしたのでメモリリークを疑っている状態です。

  • メモリリークの件

    メモリリークについて教えてください。 最近VC++を勉強中なのですが、メモリリークというものを知り、_CrtDumpMemoryLeaks()をしたところ、以下のコメントが出力されました。 [コメント] Detected memory leaks! Dumping objects -> strcore.cpp(118) : {71} normal block at 0x00344978, 20 bytes long. Data: < cmd.> 01 00 00 00 07 00 00 00 07 00 00 00 63 6D 64 2E {48} client block at 0x003428E8, subtype 0, 64 bytes long. a CDynLinkLibrary object at $003428E8, 64 bytes long {43} client block at 0x00342720, subtype 0, 64 bytes long. a CDynLinkLibrary object at $00342720, 64 bytes long {41} client block at 0x003425D0, subtype 0, 64 bytes long. a CDynLinkLibrary object at $003425D0, 64 bytes long Object dump complete. スレッド 0x584 終了、終了コード 0 (0x0)。 上記のコメントから、メモリリークを起こしていることはわかりました。ただ、strcore.cppというクラスは作成していないのですが、エラーが出ます。 多分他の関数から呼ばれているクラスだと思うため、クラス等をコメントアウトして調べたのですが、エラーがまだ出力されます。 (Data: < cmd.> 01 00 00 00 07 00 00 00 07 00 00 00 63 6D 64 2Eここは自作クラス上の問題だと思います。) newとかの解放はしているのですが、他にメモリリークをする原因ってあるのでしょうか?

  • メモリリーク

    VC++ 2010 SP1 MFC使用環境です 現在i以下のサンプルソースをベースに改造しているのですが http://code.msdn.microsoft.com/windowsdesktop/DVD-RW-870205bd その中の関数内で以下の行があります BSTR path = ::SysAllocString(変数)); 改造に当たり関数内で変数の内容を変更させて 同様の処理を複数回行いたいと思っています ここで あれ?  と思ったのが ::SysFreeString(path); 実行してなくてリークしないのか? ということなんですが 試しに BSTR path = ::SysAllocString(変数)); を複数回実行してプログラムを終了してみましたが 出力Windowにはメモリリークは出ていないように感じます その判断が間違ってる可能性は否定できないので質問させていただきました 実際今回のような場合 SysFreeString 関数をコールする必要はないのでしょうか? 仮に今回は必要ないにしても関数自体が存在するということは必要性はあると思うのですが どういったときにコールする必要があるのでしょう

  • Visual Studioのメモリリークについて

    質問を見ていただいて有り難うございます。 当方、現在MFCのダイアログベースのプログラムを行なっているのですが、プログラム終了時にメモリリークが発生します。 今のところプログラムの動作自体に影響はないのですが、想定外の動作が起こると困るのでなんとかこのエラーを取り除きたいと考えています。 メモリリークの殆どは _CrtSetBreakAlloc(Num);(指定した順序のメモリ割り当て時にブレークポイントを発生させる) を利用して、メモリリークが起こっている部分のブレークポイントをチェックして消したのですが、どうしても残りのメモリリークが消えません。 残りのメモリリークは_CrtSetBreakAlloc(Num)で指定してもブレークポイントが出てきませんでした。 _CrtSetBreakAlloc(Num)は『ファイル名.cpp』のInitInstanceおよびコンストラクタで呼び出してみましたが、どちらも同じ結果になりました。 また、試しに『ファイル名Dlg』クラスを使用しない(ダイアログを開かないようにコメントアウト)ようにして終了しても同じ結果になりました。 _CrtSetBreakAlloc(Num)を設定する適切な位置や、このようなメモリリークが出る原因、解決方法などについてご存知の方がいらっしゃいましたら、お教えください。 よろしくお願いします。

  • PHPのメモリ?

    こんばんは。質問させて下さい。 PHPプログラム内で複数の配列を設定したとします。 ======================== $array00000001=array("1", "2", "3",・・・); $array00000002=array("1", "2", "3",・・・); $array00000003=array("1", "2", "3",・・・); ・ ・ ・ ======================== 設定した配列の情報はメモリに保持されるとおもいますが、容量の限界はあるのでしょうか? PCのスペックに依存するのでしょうか?それともPHP独自できまっているのでしょうか? ご存知の方、いらっしゃいましたらご回答お願い致しますm(_ _)m

    • ベストアンサー
    • PHP
  • 連想配列からの値の取り出し

    お世話様です。 タイトルにもありますが連想配列を作成した後(以下に記述例)に その配列からキーを指定して値を取得したいと思っております。 array_keys関数だと値を指定してキーを取得するみたいで うまくいきませんでした。 何かよい方法ありませんでしょうか? //配列に格納 while (条件) {   $aParaOra += array((キー) => (値)); }

    • ベストアンサー
    • PHP

専門家に質問してみよう