C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[2]: vc++.Netでのメモリリークについて


(過去ログ 113 を表示中)

[トピック内 6 記事 (1 - 6 表示)]  << 0 >>

■66856 / inTopicNo.1)  vc++.Netでのメモリリークについて
  
□投稿者/ 遠山 (6回)-(2013/05/31(Fri) 12:36:35)

分類:[.NET 全般] 

vc++.Netでのメモリリークが発生してしまいます。
ネットを調べましたが、同じような状況で解決できるページが見当たりませんでした。

GC::Collect()なども試しました。

タスクマネージャのメモリ使用量は少しずつ増えていき90%を超えてメモリリークになってしまいます。
.exe実行ファイルを終了させるとメモリ使用量が回復されます。

Dispose()
clear()
close()
といろいろ試しましたが解決できません。

mshtml::HTMLDocumnt
mshtml::IHTMLDocument2
を使用してHTMLをパースしようと思っています。
スレッド(関数)の実行は10時間近く実行させていますがこれが原因なのでしょうか?
解決策ご存知のかたいましたらご教授お願いします。

引用返信 編集キー/
■66857 / inTopicNo.2)  Re[1]: vc++.Netでのメモリリークについて
□投稿者/ 魔界の仮面弁士 (235回)-(2013/05/31(Fri) 13:16:25)
No66856 (遠山 さん) に返信
> vc++.Netでのメモリリークが発生してしまいます。
> ネットを調べましたが、同じような状況で解決できるページが見当たりませんでした。

システムモニタでカウンタログをとってみると、
何のメモリ使用量が増加しているのかわかるかもしれません。
http://www.infoq.com/jp/news/2009/11/Memory-Leaks-.NET
http://www.shoeisha.com/mag/windev/pdf/870510/windev0510_186_Debug.pdf


> .exe実行ファイルを終了させるとメモリ使用量が回復されます。
であれば、プロセス内で作業用の AppDomain を用意しておき、処理が終わったら
AppDomain を Unload するようにしてみては如何でしょう。

> mshtml::HTMLDocumnt
> mshtml::IHTMLDocument2
> を使用してHTMLをパースしようと思っています。
Marshal.ReleaseComObject は利用されていますか?
引用返信 編集キー/
■66863 / inTopicNo.3)  Re[2]: vc++.Netでのメモリリークについて
□投稿者/ 遠山 (7回)-(2013/05/31(Fri) 17:09:55)
>>.exe実行ファイルを終了させるとメモリ使用量が回復されます。
> であれば、プロセス内で作業用の AppDomain を用意しておき、処理が終わったら
> AppDomain を Unload するようにしてみては如何でしょう。
>

こちらを使用したいと思っていますが、Exceptionエラーが出てしまいました。

エラーの内容はこちらです。どうすればいいでしょうか?

System.IO.FileNotFoundException: ファイルまたはアセンブリ 'AmazonRetrieveTool, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'、またはその依存関係の 1 つが読み込めませんでした。指定されたファイルが見つかりません。
ファイル名 'AmazonRetrieveTool, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null' です。
場所 System.Reflection.Assembly._nLoad(AssemblyName fileName, String codeBase, Evidence assemblySecurity, Assembly locationHint, StackCrawlMark& stackMark, Boolean throwOnFileNotFound, Boolean forIntrospection)
場所 System.Reflection.Assembly.nLoad(AssemblyName fileName, String codeBase, Evidence assemblySecurity, Assembly locationHint, StackCrawlMark& stackMark, Boolean throwOnFileNotFound, Boolean forIntrospection)
場所 System.Reflection.Assembly.InternalLoad(AssemblyName assemblyRef, Evidence assemblySecurity, StackCrawlMark& stackMark, Boolean forIntrospection)
場所 System.Reflection.Assembly.InternalLoad(String assemblyString, Evidence assemblySecurity, StackCrawlMark& stackMark, Boolean forIntrospection)
場所 System.Activator.CreateInstance(String assemblyName, String typeName, Boolean ignoreCase, BindingFlags bindingAttr, Binder binder, Object[] args, CultureInfo culture, Object[] activationAttributes, Evidence securityInfo, StackCrawlMark& stackMark)
場所 System.Activator.CreateInstance(String assemblyName, String typeName)
場所 System.AppDomain.CreateInstance(String assemblyName, String typeName)
場所 System.AppDomain.CreateInstanceAndUnwrap(String assemblyName, String typeName)
場所 System.AppDomain.CreateInstanceAndUnwrap(String assemblyName, String typeName)
場所 MainFrame.OnButtonClick(Object l_ptrSender, EventArgs l_ptrEventArgs) 場所 c:\users\遠山\documents\visual studio 2005\projects\amazonretrievetool\amazonretrievetool\mainframe.cpp:行 337

=== 事前バインド状態情報 ===
ログ: ユーザー = MY-COMPUTER\遠山
ログ: DisplayName = AmazonRetrieveTool, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null
(Fully-specified)
ログ: Appbase = file:///c:/Users/遠山/Documents/Visual Studio 2005/Projects/AmazonRetrieveTool/AmazonRetrieveTool
ログ: Initial PrivatePath = NULL
呼び出しているアセンブリ: (Unknown)
===
ログ: このバインドは default の読み込みコンテキストで開始します。
ログ: 構成ファイル c:\Users\遠山\Documents\Visual Studio 2005\Projects\AmazonRetrieveTool\release\AmazonRetrieveTool.config は存在しません。
ログ: アプリケーション構成ファイルは見つかりませんでした。
ログ: C:\Windows\Microsoft.NET\Framework\v2.0.50727\config\machine.config からのコンピュータ構成ファイルを使用します。
ログ: 現時点でポリシーは参照に適用されません (プライベート、カスタム、部分的、または場所ベースのアセンブリ バインド)。
ログ: 新しい URL file:///c:/Users/遠山/Documents/Visual Studio 2005/Projects/AmazonRetrieveTool/AmazonRetrieveTool/AmazonRetrieveTool.DLL をダウンロードしようとしています。
ログ: 新しい URL file:///c:/Users/遠山/Documents/Visual Studio 2005/Projects/AmazonRetrieveTool/AmazonRetrieveTool/AmazonRetrieveTool/AmazonRetrieveTool.DLL をダウンロードしようとしています。
ログ: 新しい URL file:///c:/Users/遠山/Documents/Visual Studio 2005/Projects/AmazonRetrieveTool/AmazonRetrieveTool/AmazonRetrieveTool.EXE をダウンロードしようとしています。
ログ: 新しい URL file:///c:/Users/遠山/Documents/Visual Studio 2005/Projects/AmazonRetrieveTool/AmazonRetrieveTool/AmazonRetrieveTool/AmazonRetrieveTool.EXE をダウンロードしようとしています。


宜しくお願いします。

引用返信 編集キー/
■66864 / inTopicNo.4)  Re[3]: vc++.Netでのメモリリークについて
□投稿者/ 遠山 (8回)-(2013/05/31(Fri) 17:24:32)
ad2オブジェクト、CreateInstanceAndUnwrapは以下のようにしています。

AppDomainSetup *ads = new AppDomainSetup();
ads->ApplicationBase = String::Concat("file:///", System::Environment::CurrentDirectory);
ads->DisallowBindingRedirects = false;
ads->DisallowCodeDownload = true;

AppDomain *ad2 = AppDomain::CreateDomain("AD #2", AppDomain::CurrentDomain->Evidence, ads);
RetrieveProduct *l_ptrRPObject = (RetrieveProduct *)ad2->CreateInstanceAndUnwrap(exeAssembly, this->m_ptrRPObject->GetType()->FullName)
l_ptrRPObject->RetrieveAmazon(this);

宜しくお願いします。

引用返信 編集キー/
■66867 / inTopicNo.5)  Re[1]: vc++.Netでのメモリリークについて
□投稿者/ とっちゃん (119回)-(2013/05/31(Fri) 20:00:15)
とっちゃん さんの Web サイト
No66856 (遠山 さん) に返信

> mshtml::HTMLDocumnt
> mshtml::IHTMLDocument2
> を使用してHTMLをパースしようと思っています。

.NET を使っているのであれば、
System.Windows.Forms.WebBrowser と System.Windows.Forms.HtmlDocument を
使ったほうが、COMの間接利用より効率が良いと思いますが?

逆に、C++/CLI(ManagedC++でも同様)でやるなら、直接COMを利用するほうが
効率が良いと思います。


> スレッド(関数)の実行は10時間近く実行させていますがこれが原因なのでしょうか?
> 解決策ご存知のかたいましたらご教授お願いします。
>
C++/CLI から COM オブジェクトを RCW 経由で使っている理由がわかりませんが
ReleaseCOMObjectなど、COMオブジェクトの解放処理が適切に行われていないのであれば
それが原因と思われます。

メモリーリークを回避するためにAppDomain をアンロードするという方法をとることも不可能ではありませんが
ざっと見た感じAppDomainを分離して処理する方法はお勧めできません。

AppDomainをアンロードする形をとるなら、EXEのまま一通り処理が終わったら終了する形にプログラムを修正し、
継続処理をするためのループ部分を別途起動用のランチャーEXEに任せて、EXEが終了したら
また起動するという処理を作るほうがよいと思います。

また、可能ならC++を使うよりは、C#のほうがいいんじゃないかな?という気もします。
C++/CLI も Managed C++ も無理して使うような開発言語ではありません。





引用返信 編集キー/
■66891 / inTopicNo.6)  Re[2]: vc++.Netでのメモリリークについて
□投稿者/ 遠山 (11回)-(2013/06/02(Sun) 19:36:52)
提示いただいた方法で解決しました。有難うございました。

解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -