0

我正在寻找大约 1 1/2 天的解决方案,但无法直截了当。我试图在PocketPC 2003 中从我们的C# 应用程序中启动一个*.lnk 文件。此 *.lnk 文件包含指向 evm.exe 的链接,该链接是 PocketPC 的 JVM。传递的参数是(除其他外)-Xms8M,它告诉 JVM 保留至少 8MB 的内存。

如果直接从 Windows Explorer 启动没有问题。

现在我在 C# 中创建了一个指向 *.lnk 文件的进程。当我尝试启动它时,JVM 控制台打开并显示以下两个错误之一:“EVM 执行历史记录太大”或“无法初始化堆(阶段 1)”(或类似的东西)。

如果我删除提到的参数,应用程序就没有问题。

由于这种行为,我假设分配给新创建的进程的内存太少。这是现实的吗?如果:有没有办法为新创建的进程分配更多内存?还是我完全错了,必须采取其他方式(如果有的话)?

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

编辑 2:
经过更多研究后发现,真正的问题是可用的资源非常有限,随着时间的推移被我的启动器应用程序(启动后总共大约 1.8 MB)吃掉了。
为了改进,我开始研究垃圾收集器在 Windows Mobile 中的工作原理,因此使用了两种技术来启动虚拟机。第一个是通过将其发送到后台(表单的方法)并等待垃圾收集器完成( )
来减少我自己的应用程序占用的内存。 之后,我在尝试启动 VM 之前在程序内存中寻找 9 MB 的可用空间。如果没有足够的空间,我会尝试将所需的内存从存储内存转移到程序内存。SendToBack()GC.WaitForPendingFinalizers()

这两种技术改善了很多!

我的启动器应用程序仍然存在问题。当我的启动器应用程序在前面时,分配的字节(具体的字符串和装箱对象)会随着时间的推移而增加......在 10 分钟内大约有 30 kb。24 小时后,设备将自动重启。目前我假设发射器在此期间总共会在前面大约 10 分钟。尽管如此,内存泄漏并不是一件好事。有人知道如何追捕吗?

提前致谢
最好的问候
马塞尔

4

1 回答 1

0

看起来您有两个可能发生这种情况的原因:

进程的工作集是物理 RAM 内存中进程当前可见的内存页集。这些页面是常驻的,可供应用程序使用而不会触发页面错误。

工作集包括共享数据和私有数据。共享数据包括包含应用程序执行的所有指令的页面,包括 .dll 文件和 system.dll 文件中的页面。随着工作集大小的增加,内存需求也会增加。

进程具有最小和最大工作集大小。每次创建进程资源时,系统都会为该进程保留与最小工作集大小相等的内存量。当进程处于活动状态时,虚拟内存管理器尝试至少保持最小的内存量,但它永远不会超过最大大小。

系统设置默认的工作集大小。您可以使用 MaxWorkingSet 和 MinWorkingSet 成员修改这些大小。但是,设置这些值并不能保证内存将被保留或常驻。

  • 实际上不可能在机器上为 JVM 保留所需的内存,因为操作系统管理内存的方式(我觉得这真的很令人惊讶,因为每个现代操作系统都支持虚拟内存)
于 2012-07-19T08:11:15.417 回答