Armadilloフォーラム

Qt4.8.3使用モジュールのメモリ使用量確認

okamoto_sc30

2015年11月13日 22時27分

お世話になっております。

現在、Almaddilo-440向けのアプリケーションをATDE4、QtCreater2.5.2にて作成しております。
連続稼働させ、FreeおよびTopコマンドで監視しているとメモリリソースを消費している模様で、
当方開発部分の該当しそうな部分を順次消去していったのですが、最終的に空のウインドウ一枚表示するのみでもFreeコマンド上は減少しているように見えています。
(Freeコマンドでは数秒~数十秒で100K程ずつ減少しているように見えます。)
Newを用いているのはほぼ画面構築時だけであり、QTableWidgetへ行追加は行っていますが削除を実施しており
最終的に空のウインドウ1枚ではMainWindow以外何も使用しておりません。
Qtを用いる際の初期宣言やQtCreater自体の設定、Makeコマンドなどに間違いがあるとこのような状況になるのでしょうか。
また、ガベージを意図的に解放する命令などがあるのでしょうか。

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

コメント

at_yashi

2015年11月16日 13時57分

> 最終的に空のウインドウ一枚表示するのみでもFreeコマンド上は減少しているように見えています。

アプリを動かしていないと現象は観察できないのに、動かすと現象していくということでしょうか?

> (Freeコマンドでは数秒~数十秒で100K程ずつ減少しているように見えます。)

free コマンドの free が減っていても、アプリがメモリリークを起こしているとは言えないので、
もう少し調査が必要かもしれません。

まずは、Qtのアプリがメモリリークを発生させているのか、他のコンポーネントが動作することで、
(たとえばアクセスしたファイルがキャッシュされることによって、一時的に free が減っているだけとか)
観察されているような状態になるのか確認が必要ですね。

まずは、Qtアプリが動いていない状態で同じような現象が観察できるか教えて下さい。

okamoto_sc30

2015年11月17日 16時18分

お世話になります。
ご回答ありがとうございます。
本件、Qt画面オブジェクト使用によるリークではないことが確認されました
おさわがせいたしまして誠に申し訳ありません。
ただしメモリ圧迫事象は発生しており、ファイル出力にありました。
QFileとQTextstreamを用いてファイル出力させる際に何らかの理由(ディスクフルや権限不足など)で書き込めない場合
メモリ残置し蓄積すると最終的にハングアップに至ります。書けている場合は起こしていない模様です。
開発用コードであるので本件では削除しても構わないのですが保守的に残置させておきたく、
コーディング自体はQFileとQTextstreamで検索される一般的な使用方法から逸脱はないように思われます。
そもそもAlmaddilo上では使えない方法でしょうか。

at_yashi

2015年11月17日 20時12分

> QFileとQTextstreamを用いてファイル出力させる際に何らかの理由(ディスクフルや権限不足など)で書き込めない場合
> メモリ残置し蓄積すると最終的にハングアップに至ります。書けている場合は起こしていない模様です。

ここでいう、「メモリ残置」とはなんですか?
メモリ内にデーターを残しているのであれば、その分メモリを圧迫すると思うのですが。

> 開発用コードであるので本件では削除しても構わないのですが保守的に残置させておきたく、
> コーディング自体はQFileとQTextstreamで検索される一般的な使用方法から逸脱はないように思われます。
> そもそもAlmaddilo上では使えない方法でしょうか。

ごめんなさい。質問が意味がわかりませんでした。QFile と QTextstream は、
「 書けている場合は起こしていない」ということなので、上記クラスは使えていると考えて良いですか?

メモリ残置が使えない?ということでしょうか?

okamoto_sc30

2015年11月19日 10時28分

説明不足で申し訳ありません。
QFile と QTextstream を用いて外部ファイルへの出力のみを目的とし、当方のプロセス内でその記録内容の継続保持はしておりません。
dfコマンドで残量を継続確認し、RAMディスク容量が残っており書き込めているときは
freeやtopコマンドで本プロセスおよび全体のメモリ使用量を確認しても増加いたしません。
RAMディスク容量をすべて使い切り100%を超えた後、または残量があってもその他要因にて外部出力に失敗した場合には
freeやtopコマンドで継続監視していると失敗の都度本プロセスのメモリ使用量と全体メモリ使用総量が増加を続け最終的に停止に至ります。

at_yashi

2015年11月19日 15時31分

> RAMディスク容量をすべて使い切り100%を超えた後、または残量があってもその他要因にて外部出力に失敗した場合には
> freeやtopコマンドで継続監視していると失敗の都度本プロセスのメモリ使用量と全体メモリ使用総量が増加を続け最終的に停止に至ります。

この現象だけ再現させる、小さいコードはかけますか?例えば、Read Only の SDカードや USB メモリを使うとか、パーミッションの影響で書き込めないとか。

目的は、エラーが出た場合のコードパスで、メモリを開放する必要があるのにしていない場所の特定です。