C#Windows服务内存异常
由于使用了两个引用的32位库,Windows服务是一个32位实现;LotusDomino对象和IBM.Data.DB2.iSeriesC#Windows服务内存异常,c#,windows,memory,memory-management,service,C#,Windows,Memory,Memory Management,Service,由于使用了两个引用的32位库,Windows服务是一个32位实现;LotusDomino对象和IBM.Data.DB2.iSeries 在Windows服务中,我正在解析日志文件,并将它们的数据保存在内存中的datatables中,以便比较数据。计时器用于发送电子邮件 服务运行了几个月没有出现任何问题 事实上,服务器的~6GB已安装8GB内存一直在使用中,我的服务不再正常运行,引发以下异常: “试图读取或写入受保护的内存。这通常表示其他内存已损坏。”->由发送方法引发 “System.OutOf
在Windows服务中,我正在解析日志文件,并将它们的数据保存在内存中的datatables中,以便比较数据。计时器用于发送电子邮件 服务运行了几个月没有出现任何问题 事实上,服务器的~6GB已安装8GB内存一直在使用中,我的服务不再正常运行,引发以下异常: “试图读取或写入受保护的内存。这通常表示其他内存已损坏。”->由发送方法引发 “System.OutOfMemoryException”->由计时器方法引发 当服务正常运行时,只有大约2GB的内存始终处于使用状态 服务是否会尝试分配不可寻址的内存,因为70%以上的内存始终处于使用状态 当内存区域0x00000000-0xFFFFFF仍在使用时,32位应用程序在64位系统上的行为如何?物理上它不能寻址>0xFFFFFF
我使用datatables,如下所示,并将一些数据写入datatables:
private DataTable dt1 = new DataTable();
private DataTable dt2 = new DataTable();
private DataTable dt3 = new DataTable();
private DataTable dt4 = new DataTable();
private DataTable dt5 = new DataTable();
private DataTable dt6 = new DataTable();
dt1 = getDB2Data();
dt2 = ParseLogFile(path, time);
dt3 = CompareDataTables(dt1, dt2);
dt4 = getDB2Data();
dt5 = ParseLogFile(path, time);
dt6 = CompareDataTables(dt4, dt5);
“我正在解析日志文件,并将它们的数据保存在内存中的数据表中,以便比较数据”-您是如何做到的?每个进程都有自己的地址空间,以及自己的虚拟地址范围。没有任何东西可以阻止32位进程将位于4GB边界之上的物理页映射到其地址空间。因此,您关于它“物理上不能寻址>0xffffffff”的断言是不正确的。您是否正在处理任何未使用的表?处理完数据后是否释放了数据?“因此,您关于它“物理上无法寻址>0xffffffff”的断言是不正确的”-是的,您是对的!“是否正在处理任何未使用的表?处理后是否释放任何数据?”-我将再次检查所有代码。
I disposed all datatables after use:
dt1.Dispose();
dt2.Dispose();
dt3.Dispose();
dt4.Dispose();
dt5.Dispose();
dt6.Dispose();