阅读这篇古老但经典的文档编写高性能托管应用程序 - 入门,我发现了以下声明
GC是自我调整的,可根据应用程序内存要求进行自我调整.在大多数情况下,以编程方式调用GC将阻碍调整.通过调用GC.Collect"帮助"GC很可能无法提高应用程序性能
我正在处理在给定时间点内消耗大量内存的应用程序.当我在使用该内存的代码中完成时,我正在调用GC.Collect.如果我不这样做,我会出现内存异常.这种行为是不一致的,但在30%的时间里,我得到了一个内存不足.添加GC.Collect后,我从来没有得到这个内存不足的异常.即使这个最佳实践文件提出反对建议,我的行动是否合理?
我遇到了一个非常错误的问题,在ASP.NET应用程序中多次同时查看同一个报表后,我遇到了这个异常:
已达到系统管理员配置的最大报告处理作业限制.
等等我知道那里有很多解决方案,但他们都没有和我合作.
我把ReportDocument.Close(); ReportDocument.Dispose(); 在CrystalReportViewer_Unload事件中,仍然抛出异常.
Private Sub CrystalReportViewer1_Unload(ByVal sender As Object, ByVal e As System.EventArgs) Handles CrystalReportViewer1.Unload
reportFile.Close()
reportFile.Dispose()
GC.Collect()
End Sub
我编辑PrintJobLimit注册表HKEY_LOCAL_MACHINE\SOFTWARE\SAP BusinessObjects\Crystal Reports for .NET Framework 4.0\Report Application Server\InprocServer和HKEY_LOCAL_MACHINE\SOFTWARE\SAP BusinessObjects\Crystal Reports for .NET Framework 4.0\Report Application Server\Server-1甚至到9999,仍然抛出异常.
以下是我调用报告的代码段:
Table_Infos = New TableLogOnInfos()
Table_Info = New TableLogOnInfo()
Con_Info = New ConnectionInfo()
With Con_Info
.ServerName = ConfigurationManager.AppSettings("server_name")
.DatabaseName = ConfigurationManager.AppSettings("DB")
.UserID = user_name
.Password = pass_word
.Type = ConnectionInfoType.SQL
.IntegratedSecurity = False
End With
Table_Info.ConnectionInfo …Run Code Online (Sandbox Code Playgroud) 鉴于以下内容:
GC.Collect(GC.MaxGeneration);
GC.WaitForPendingFinalizers();
GC.Collect(GC.MaxGeneration);
Run Code Online (Sandbox Code Playgroud)
考虑到多线程和垃圾收集模式,在什么情况下你会遇到死锁WaitForPendingFinalizers?
注意:我不是在寻找你不应该打电话的原因的答案GC.Collect.
我正在阅读官方的ASP.NET Core 性能最佳实践文档。
为了提高性能,他们推荐使用ArrayPool来存储大型数组。
但是,什么是 ArrayPool 以及它是如何工作的?查看互联网和官方文档并不能帮助我理解它是如何工作的以及我应该在什么情况下使用它。
我可以运行这些命令,一切都按预期进行
reg load HKU\Kayla C:\Users\Kayla\ntuser.dat
New-Item -Force Registry::HKU\Kayla\Foo
Run Code Online (Sandbox Code Playgroud)
但是,在此之后运行会导致错误
PS > reg unload HKU\Kayla
ERROR: Access is denied.
Run Code Online (Sandbox Code Playgroud)
如果我手动打开注册表编辑器,则可以卸载配置单元,但是如果可能的话,我想从脚本中卸载。
更新:阅读Matt的答案后,我发现如果您在collecting 之前运行命令,该示例将起作用
0
[gc]::collect()
Run Code Online (Sandbox Code Playgroud)
出现的0行为是“回收站”,collect是“永久删除”。
我正在开发一个.NET应用程序,用于处理通过ESRI自己的.NET互操作程序集使用ESRI的ArcObjects COM库的地理数据.
在生产中运行时,由于达到每个进程2GB的内存限制,进程在某些操作期间可能会崩溃.(ArcObjects是一个32位库.)这是因为某些处理步骤可以创建许多临时ArcObjects几何对象.尽管使用FinalReleaseComObject和关联的辅助方法手动释放这些对象,它仍会泄漏内存并最终耗尽内存.但是,我可以强制GC通过调用释放内存WaitForPendingFinalizers,并定期调用它GC.Collect并FinalReleaseComObject保持内存使用受控制.否则,许多对象将保留在内存中,直到进程退出(正常或异常).
第一个问题:为什么不立即释放ArcObjects COM对象所占用的内存?或者,为什么GC允许进程崩溃而不是最终确定已发布的COM对象并在崩溃之前回收内存?
该应用程序在Windows 2008 64位上运行,而我使用Windows 7 32位开发.我可以让生产盒上的进程崩溃,但不能在我的开发盒上崩溃.我认为这可能是因为本地我通常在Visual Studio中使用Debug构建运行,但我也尝试使用Release版本而没有调试器(Start Without Debugging),但即便如此,它也没有在任何地方使用内存与生产中一样,不会崩溃.
第二个问题:为什么?
编辑:在我以前的实验中,我发现它GC.Collect本身是不够的,即使我明确地称之为它.我有一个实用程序方法,在每次算法迭代后调用GC.Collect后跟GC.WaitForPendingFinalizers并调用它,以减少内存使用量.
.net ×3
c# ×2
.net-core ×1
arcobjects ×1
clr ×1
com ×1
memory-leaks ×1
powershell ×1
registry ×1