根据我的经验,似乎大多数人会告诉你强制垃圾收集是不明智的,但在某些情况下,你正在使用大型对象,这些对象并不总是在0代收集,但内存是一个问题,是它可以强制收集?这样做有最好的做法吗?
我正在尝试将数据库中存储图像的数据库迁移到指向硬盘驱动器上的文件的数据库中的记录.我试图使用此方法来查询数据Parallel.ForEach以加快进程.
但是,我注意到我得到了一个OutOfMemory例外.我知道Parallel.ForEach会查询一批枚举,以减少开销的成本,如果有一个用于间隔查询(如果您一次执行一堆查询而不是间隔它们,您的源将更有可能将下一条记录缓存在内存中)出).问题是由于我返回的记录之一是1-4Mb字节数组,缓存导致整个地址空间用完(程序必须在x86模式下运行,因为目标平台将是32位机)
是否有任何方法可以禁用缓存或使TPL更小?
这是一个显示问题的示例程序.这必须在x86模式下编译,以显示问题,如果它在你的机器上花费很长时间或者没有发生,从而增加了阵列的大小(我发现1 << 20我的机器上大约需要30秒,4 << 20几乎是瞬间的)
class Program
{
static void Main(string[] args)
{
Parallel.ForEach(CreateData(), (data) =>
{
data[0] = 1;
});
}
static IEnumerable<byte[]> CreateData()
{
while (true)
{
yield return new byte[1 << 20]; //1Mb array
}
}
}
Run Code Online (Sandbox Code Playgroud) 如果这是一个显而易见的问题,我很抱歉,但谷歌或搜索都没有让我得到答案.
有没有办法完全删除数组?
我想相反的int[] array = new int[5]
是否可以从命令行运行.NET垃圾收集器,例如,无需编写代码?
编辑:
当被问到这个问题时,我的意思就是这里要求的Java垃圾收集器:
从Windows命令行运行时如何请求JVM垃圾回收(而不是代码)
因此,如果有一种方法可以在JVM中执行此操作,请查看它在.NET中不存在的原因
我想知道在调用Dispose()方法时执行了什么操作.Object在Dispose()调用或Dispose()上快速释放所有资源,标记Object已准备好进行垃圾回收.当我们将Object引用设置为NULL时发生了什么.实际上我在.NET 2.0中有Windows表单应用程序.并且我希望在经过一定时间后调用垃圾收集器(例如5分钟后)以收集所有未引用的对象.
如何从正在运行的对象中获取进程ID?
Dim xlApp As Object = CreateObject("Excel.Application")
Run Code Online (Sandbox Code Playgroud)
我需要使用后期绑定,因为我无法保证我将获得哪个版本,因此使用Microsoft.Office.Interop.Excel将无法正常工作.
'do some work with xlApp
xlApp.Quit
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlApp)
xlApp = nothing
Run Code Online (Sandbox Code Playgroud)
此时Excel仍在后台运行.我熟悉使用变量的所有建议并释放它们然后使用:System.Runtime.InteropServices.Marshal.ReleaseComObject(o).这不能可靠地工作.我正在做的工作非常复杂.我使用多个文件用于每个循环等.无法在Excel中释放所有资源.我需要一个更好的选择.
我想Process.Kill在Excel 上使用,但我不知道如何从xlApp对象获取进程.我不想杀死所有Excel进程,因为用户可能打开了工作簿.
我尝试使用Dim xProc As Process = Process.Start(ExcelPath)然后使用xProc.Kill()有时工作除了使用XLApp = GetObject("Book1").Application或XLApp = GetObject("", "Excel.Application")如果用户已经打开Excel窗口使用正确的Excel对象有点棘手.我需要一个更好的选择.
我不能使用GetActiveObject或BindToMoniker获取Excel对象,因为它们仅在使用早期绑定时才能工作.例如Microsoft.Office.Interop.Excel
如何从正在运行的对象中获取进程ID?
编辑:其实我真的不想对如何让Excel很好地退出进行重新考虑.许多其他问题都解决了这个问题 在这里和这里我只想杀死它; 干净,准确,直接.我想要杀死我开始的确切过程而不是其他过程.
看来Frame导航(特别是Frame.Navigate(Type)方法)正在泄漏非托管内存.
在我查看Visual Studio诊断工具的每次导航之后,Private Bytes正在上升,但是当我拍摄内存的快照时,堆大小没有增加.页面越多,组件越糟糕.内存似乎永远不会被释放.无论应用程序是构建在Debug还是Release(无论是.Net Native还是没有),都无关紧要.我正在使用14393 SDK(周年纪念更新).
我创建了一个示例应用程序,它具有一个主页面和两个(内容)页面,它们之间保持导航(在PageLoaded事件上).我已将CacheSize ="0"设置为Frame,并且Pages具有NavigationCacheMode ="Disabled",因此它们不会被缓存.我也在每次导航之前清除了backstack并取消订阅PageUnloaded上的每个事件.
以下是其中一个页面的.cs文件:
public sealed partial class FirstPage : Page
{
public FirstPage()
{
this.InitializeComponent();
}
private void NavigateToSecondPage()
{
MainPage.ContentFrame.BackStack.Clear();
MainPage.ContentFrame.Navigate(typeof(SecondPage));
}
private void NavigateButton_Click(object sender, RoutedEventArgs e)
{
NavigateToSecondPage();
}
private void Page_Loaded(object sender, RoutedEventArgs e)
{
if (!MainPage.StopNavigating)
{
NavigateToSecondPage();
}
}
private void Page_Unloaded(object sender, RoutedEventArgs e)
{
this.NavigateButton.Click -= NavigateButton_Click;
this.Loaded -= Page_Loaded;
this.Unloaded -= Page_Unloaded; …Run Code Online (Sandbox Code Playgroud) 我想知道是否有人可以帮助解决以下情况:
我无法使用用 C# 编写并使用 .Net core 5.0 的 RabbitMQ Publisher解决内存泄漏问题。
这是 csproj 文件:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net5.0</TargetFramework>
<RuntimeIdentifier>win-x64</RuntimeIdentifier>
</PropertyGroup>
...
</Project>
Run Code Online (Sandbox Code Playgroud)
我有一个在虚拟机内运行的 .net 控制台应用程序,该应用程序通过 API(注册的 64 位 dll 并引用为 COM 引用)连接到服务器,从该服务器获取信息,然后尝试将此信息发布到 RabbitMQ 机器位于 AWS 云上(此 RMQ 实例具有多个节点的负载均衡器)。
在代码中访问 API 的方式如下:
private void SetUpApi () {
Utils.log.Info (_api.SetAPIOptions ("<CONNECTIONOPTIONS><CALCULATED_PRICES Enabled='true' MaximumDepth='4'/></CONNECTIONOPTIONS>"));
_api.OnServerConnect += OnServerConnect;
_api.OnServerDisconnect += OnServerDisconnect;
_api.OnNewData += OnNewData;
}
Run Code Online (Sandbox Code Playgroud)
private void OnNewData(string strXML){
try{
if (strXML.Contains("<ORDER")){
ParseXMLAnswer(strXML, "OnNewData ()");
}
}
catch (Exception ex) {
if (ex.InnerException …Run Code Online (Sandbox Code Playgroud) 我已经看过很多文章和问题,关于如何确保Excel实际上在你想要的时候退出并且这个过程不能保持活力.这是一篇描述该问题的知识库文章和Microsoft推荐的解决方案.实质上:
'close files
'Quit Excel
xlApp.quit()
'Release and collect garbage
System.Runtime.InteropServices.Marshal.FinalReleaseComObject(xlApp)
GC.Collect()
GC.WaitForPendingFinalizers()
Run Code Online (Sandbox Code Playgroud)
很多人不建议杀死这个过程; 请参见 如何正确清理Excel互操作对象 和了解.net中的垃圾收集
另一方面,许多人不建议使用GC.Collect.请参阅使用GC.Collect()有什么错误?
根据我的经验,杀死该过程是确保Excel消失的最快速,最简单的方法.我的代码只会杀死它启动的确切进程,而不会杀死其他进程.我确保关闭所有打开的工作簿,退出应用程序并释放xlApp对象.最后,我检查过程是否仍然存在,如果是,那么杀死它.
<System.Runtime.InteropServices.DllImport("user32.dll", SetLastError:=True)> _
Private Shared Function GetWindowThreadProcessId(ByVal hWnd As IntPtr, _
ByRef lpdwProcessId As Integer) As Integer
End Function
Sub testKill()
'start the application
Dim xlApp As Object = CreateObject("Excel.Application")
'do some work with Excel
'close any open files
'get the window handle
Dim xlHWND As Integer = xlApp.hwnd
'this will have the process ID …Run Code Online (Sandbox Code Playgroud) c# ×8
.net ×4
excel ×2
memory-leaks ×2
vb.net ×2
arrays ×1
command-line ×1
dispose ×1
large-data ×1
memory ×1
rabbitmq ×1
uwp ×1