NET Windows 服务内存溢出导致服务自动重启

时间:2021-11-08 18:07:28
前段时间因项目需求开发了个 windows 服务,布署完毕后,基本上每天都会自动重启一次,每次重启的时间都没有规律性,但每次出的错误都是一样,如下:
Faulting application name: adidas_GROW.exe, version: 1.0.0.0, time stamp: 0x5371cd4a
Faulting module name: nlssorting.dll, version: 4.0.30319.17929, time stamp: 0x4ffa5787
Exception code: 0xc00000fd
Fault offset: 0x000000000000440f
Faulting process id: 0xcd4
Faulting application start time: 0x01cf6edb16f1130b
Faulting application path: D:\adidas_Service\GROW_Service\adidas_GROW.exe
Faulting module path: C:\Windows\Microsoft.NET\Framework64\v4.0.30319\nlssorting.dll


下面简单说下服务的内容,
           服务一启动的时候将NEW一个主线程,该线程的作用是用来判断一些特定的条件,刚条件满足后将会在线程里面再NEW一个子线程出来,每个子线程会去执行特定的任务,每个任务的时间大概在10分钟左右。
           等主线程里面的内容全部执行完毕后 休眠一分钟,然后再次执行本身。代码如下
 protected override void OnStart(string[] args)
        {
                    try
                     {
                                 new Thread(() => { GrowServiceManager(); }).Start();
                     }
                     catch (*Exception ex)
                      {
                                     Log.WriteLog(" OnStart " + ex.Message);
                       }
                      catch (Exception ex)
                       {
                                  Log.WriteLog("失败");
                                 Log.WriteLog(ex.Message);
                       }
        )

   void GrowServiceManager()
  {
              try
             {
                       //前至内容我就省略不写了
                      if (满足条件1)
                        {
                            new Thread(() => { new TargetService(xml).TaskProcessor("",isPriority,"",""); }).Start();
                        }
                        else if (满足条件2)
                        {
                            new Thread(() => { new POSBWService(xml).TaskProcessor("", isPriority, "", ""); }).Start();
                        }
                        else if (满足条件3)
                        {
                            new Thread(() => { new BrasilService(xml).TaskProcessor("", isPriority, "", ""); }).Start();
                        }
                        else if (i满足条件4)
                        {
                            new Thread(() => { new WeService(xml).TaskProcessor("", isPriority, "", ""); }).Start();
                        }

             }    
             catch (*Exception ex)
            {
                Log.WriteLog(" GrowServiceManager " + ex.Message);
            }
            catch (Exception ex)
            {
                
                Log.WriteLog(ex.Message);
            }
              Thread.Sleep(60000);
             GrowServiceManager();

}    

请大神指点指点,该错误如何解决,万分感谢。

11 个解决方案

#1


简单方法就是改多线程为多进程。

线程出事连累主程序, 子进程出事则不关主程序的事。

#2


只是开几个线程不会消耗那么大内存的吧,你还是得看你那几个BrasilService里代码怎么写的

#3


引用 2 楼 xdashewan 的回复:
只是开几个线程不会消耗那么大内存的吧,你还是得看你那几个BrasilService里代码怎么写的

四个子线程的方法大至多是一样,
          从FTP下载文件到本地,然后将文件导入到数据库,计算报表,再将FTP上的文件删除。

#4


引用 1 楼 rtdb 的回复:
简单方法就是改多线程为多进程。

线程出事连累主程序, 子进程出事则不关主程序的事。

可这样的话进程也太多了点,我上面列出的子线程只是一部分。

#5


引用 3 楼 yu328947390 的回复:
Quote: 引用 2 楼 xdashewan 的回复:

只是开几个线程不会消耗那么大内存的吧,你还是得看你那几个BrasilService里代码怎么写的

四个子线程的方法大至多是一样,
          从FTP下载文件到本地,然后将文件导入到数据库,计算报表,再将FTP上的文件删除。

你线程里干了那么多事,你要确保所有对象都得被释放

#6


引用 5 楼 xdashewan 的回复:
Quote: 引用 3 楼 yu328947390 的回复:

Quote: 引用 2 楼 xdashewan 的回复:

只是开几个线程不会消耗那么大内存的吧,你还是得看你那几个BrasilService里代码怎么写的

四个子线程的方法大至多是一样,
          从FTP下载文件到本地,然后将文件导入到数据库,计算报表,再将FTP上的文件删除。

你线程里干了那么多事,你要确保所有对象都得被释放

NET不是会自动去释放不用的对象么?

#7


对gc是自动回收的,但你总得告诉gc哪些能回收了吧,比如操作excel,file类,你不去把他关了,系统就一直认为他不是一个该回收的对象就放置不管了,所以该关的还得关

#8


引用 7 楼 xdashewan 的回复:
对gc是自动回收的,但你总得告诉gc哪些能回收了吧,比如操作excel,file类,你不去把他关了,系统就一直认为他不是一个该回收的对象就放置不管了,所以该关的还得关


不知道此方法能不能释放掉内存  
Thread.CurrentThread.Abort();

#9


你操纵ftp类有没关闭,还有数据库连接有没关闭,是不是反复在打开数据库链接,这些都得查

#10


引用 9 楼 xdashewan 的回复:
你操纵ftp类有没关闭,还有数据库连接有没关闭,是不是反复在打开数据库链接,这些都得查


操纵ftp类 每用完一次就会关闭,但数据库连接没有,因为每过一分钟就得连一次数据查数据。

#11


数据库不关闭没关系,别开一个新的就行

引用 10 楼 yu328947390 的回复:
Quote: 引用 9 楼 xdashewan 的回复:

你操纵ftp类有没关闭,还有数据库连接有没关闭,是不是反复在打开数据库链接,这些都得查


操纵ftp类 每用完一次就会关闭,但数据库连接没有,因为每过一分钟就得连一次数据查数据。

#1


简单方法就是改多线程为多进程。

线程出事连累主程序, 子进程出事则不关主程序的事。

#2


只是开几个线程不会消耗那么大内存的吧,你还是得看你那几个BrasilService里代码怎么写的

#3


引用 2 楼 xdashewan 的回复:
只是开几个线程不会消耗那么大内存的吧,你还是得看你那几个BrasilService里代码怎么写的

四个子线程的方法大至多是一样,
          从FTP下载文件到本地,然后将文件导入到数据库,计算报表,再将FTP上的文件删除。

#4


引用 1 楼 rtdb 的回复:
简单方法就是改多线程为多进程。

线程出事连累主程序, 子进程出事则不关主程序的事。

可这样的话进程也太多了点,我上面列出的子线程只是一部分。

#5


引用 3 楼 yu328947390 的回复:
Quote: 引用 2 楼 xdashewan 的回复:

只是开几个线程不会消耗那么大内存的吧,你还是得看你那几个BrasilService里代码怎么写的

四个子线程的方法大至多是一样,
          从FTP下载文件到本地,然后将文件导入到数据库,计算报表,再将FTP上的文件删除。

你线程里干了那么多事,你要确保所有对象都得被释放

#6


引用 5 楼 xdashewan 的回复:
Quote: 引用 3 楼 yu328947390 的回复:

Quote: 引用 2 楼 xdashewan 的回复:

只是开几个线程不会消耗那么大内存的吧,你还是得看你那几个BrasilService里代码怎么写的

四个子线程的方法大至多是一样,
          从FTP下载文件到本地,然后将文件导入到数据库,计算报表,再将FTP上的文件删除。

你线程里干了那么多事,你要确保所有对象都得被释放

NET不是会自动去释放不用的对象么?

#7


对gc是自动回收的,但你总得告诉gc哪些能回收了吧,比如操作excel,file类,你不去把他关了,系统就一直认为他不是一个该回收的对象就放置不管了,所以该关的还得关

#8


引用 7 楼 xdashewan 的回复:
对gc是自动回收的,但你总得告诉gc哪些能回收了吧,比如操作excel,file类,你不去把他关了,系统就一直认为他不是一个该回收的对象就放置不管了,所以该关的还得关


不知道此方法能不能释放掉内存  
Thread.CurrentThread.Abort();

#9


你操纵ftp类有没关闭,还有数据库连接有没关闭,是不是反复在打开数据库链接,这些都得查

#10


引用 9 楼 xdashewan 的回复:
你操纵ftp类有没关闭,还有数据库连接有没关闭,是不是反复在打开数据库链接,这些都得查


操纵ftp类 每用完一次就会关闭,但数据库连接没有,因为每过一分钟就得连一次数据查数据。

#11


数据库不关闭没关系,别开一个新的就行

引用 10 楼 yu328947390 的回复:
Quote: 引用 9 楼 xdashewan 的回复:

你操纵ftp类有没关闭,还有数据库连接有没关闭,是不是反复在打开数据库链接,这些都得查


操纵ftp类 每用完一次就会关闭,但数据库连接没有,因为每过一分钟就得连一次数据查数据。