0

私は今、約1日半の解決策を探していますが、要点に到達できません. PocketPC 2003 で C# アプリケーションから *.lnk ファイルを開始しようとしました。この *.lnk ファイルには、PocketPC 用の JVM である evm.exe へのリンクが含まれています。渡される引数は (他に加えて) -Xms8M で、JVM に少なくとも 8MB のメモリを予約するように指示します。

Windows Explorer から直接起動する場合は問題ありません。

ここで、*.lnk ファイルを指すプロセスを C# で作成しました。起動しようとすると、JVM コンソールが開き、「EVM 実行履歴が大きすぎます」または「ヒープの初期化に失敗しました (フェーズ 1)」(またはそのようなもの) のいずれかのエラーが表示されます。

上記のパラメーターを削除すると、アプリケーションは問題なく表示されます。

この動作のため、新しく作成されたプロセスに割り当てられたメモリが少なすぎると思います。これは現実的ですか?そしてもし: 新しく作成されたプロセスにより多くのメモリを割り当てる方法はありますか? それとも、私は完全に間違っていて、別の方法で行かなければなりませんか (利用可能な場合)?

編集:
--CodeSnippet-
this.myStartProcess = new Process { StartInfo = { FileName = appName },EnableRaisingEvents = true };
this.myStartProcess.Start()
--CodeSnippet--

編集 2:
さらに調査を行った結果、実際の問題は、使用可能なリソースが非常に限られていることであり、時間の経過とともにランチャー アプリケーション (起動後、合計で約 1.8 MB) が消費されることが判明しました。
物事を改善するために、私は Windows Mobile でガベージ コレクターがどのように機能するかを研究し始め、2 つの手法を使用して仮想マシンを起動しました。1 つ目は、アプリケーションをバックグラウンドに送り (フォームのメソッド)、ガベージ コレクターが終了するのを待つ ( )
ことで、自分のアプリケーションが使用するメモリを減らすことです。 その後、VM を起動する前に、プログラム メモリで 9 MB の空き容量を探しています。十分なスペースがない場合は、必要なメモリをストレージ メモリからプログラム メモリに移動しようとします。SendToBack()GC.WaitForPendingFinalizers()

この 2 つの手法により、大幅に改善されました。

ランチャー アプリケーションにはまだ問題があります。割り当てられたバイト (具体的には文字列とボックス化されたオブジェクト) は、ランチャー アプリケーションが前面にあると、時間の経過とともに増加します... 10 分で約 30 kb です。24 時間後に、デバイスは自動的に再起動します。現時点では、ランチャーは合計で約 10 分間前方にあると想定しています。それでも、メモリ リークが発生するのはよくありません。これを追跡する方法を知っている人はいますか?

よろしくお願いし
ます
マルセル

4

1 に答える 1

0

これが発生する理由は 2 つあります。

プロセスのワーキング セットは、物理 RAM メモリ内のプロセスに現在表示されているメモリ ページのセットです。これらのページは常駐しており、アプリケーションがページ フォールトを発生させることなく使用できます。

ワーキング セットには、共有データとプライベート データの両方が含まれます。共有データには、.dll ファイルや system.dll ファイル内のページなど、アプリケーションが実行するすべての命令を含むページが含まれます。ワーキング セットのサイズが大きくなると、メモリの需要が増加します。

プロセスには、ワーキング セットの最小サイズと最大サイズがあります。プロセス リソースが作成されるたびに、システムはプロセスの最小ワーキング セット サイズに等しい量のメモリを予約します。仮想メモリ マネージャは、プロセスがアクティブな場合、少なくとも最小量のメモリを常駐させようとしますが、最大サイズを超えることは決してありません。

システムは、デフォルトのワーキング セット サイズを設定します。これらのサイズは、MaxWorkingSet および MinWorkingSet メンバーを使用して変更できます。ただし、これらの値を設定しても、メモリーが予約または常駐されることは保証されません。

  • OSがメモリを管理する方法が原因で、マシン上のJVMに必要なメモリを予約することは事実上不可能です(最近のすべてのOSには仮想メモリがサポートされているため、これは本当に驚くべきことです)
于 2012-07-19T08:11:15.417 に答える