WCF OutOfMemoryException 异常

guojh021 2015-07-22 11:11:31
wcf 在逻辑层有很多方法,某个方法中抛出了 OutOfMemoryException 异常. 服务端直接挂了.有什么好的办法知道哪个方法报异常,并让服务不要挂了?
Self-hosting宿主
...全文
372 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
guojh021 2015-07-27
  • 打赏
  • 举报
回复
引用 21 楼 xboxeer 的回复:
堆栈太深 看不到你的用户代码 但是从最底下的来看似乎是你IO了一个什么特别大的东西
应该没有.
xboxeer 2015-07-23
  • 打赏
  • 举报
回复
如果你能把异常捕获就在这里把stacktrace贴出来 至于你说的程序依然挂掉 没错是的 stackoverflow跟outofmemery就算你捕获了都会挂掉
引用 9 楼 guojh021 的回复:

 public class GlobalExceptionHandler : IErrorHandler
    {


        public bool HandleError(Exception error)
        {
            return true;
        }

        public void ProvideFault(Exception error, MessageVersion version, ref Message fault)
        {
            FileStream aFile = new FileStream(@"C:\Data\Log.txt", FileMode.OpenOrCreate);
            StreamWriter sw = new StreamWriter(aFile);

            sw.WriteLine("时间:{0}" + System.Environment.NewLine + "错误:{1}", System.DateTime.Now.ToString("MM-dd HH:mm:ss.fff"), error.Message);
            sw.Close();
        }

    [GlobalExceptionHandlerBehaviour(typeof(GlobalExceptionHandler))]
    public class BizService : IContract
这样做,可以捕获Exption异常,但OutOfMemoryException服务器程序还是挂掉. 有人解释一下吗?
xboxeer 2015-07-23
  • 打赏
  • 举报
回复
堆栈太深 看不到你的用户代码 但是从最底下的来看似乎是你IO了一个什么特别大的东西
引用 20 楼 guojh021 的回复:
Exception Info: System.OutOfMemoryException Stack: at System.Runtime.AsyncResult.Complete(Boolean) at System.Runtime.AsyncResult.Complete(Boolean, System.Exception) at System.ServiceModel.Channels.SynchronizedMessageSource+ReceiveAsyncResult.OnReceiveComplete(System.Object) at System.ServiceModel.Channels.SessionConnectionReader.OnAsyncReadComplete(System.Object) at System.ServiceModel.Channels.SocketConnection.FinishRead() at System.ServiceModel.Channels.SocketConnection.OnReceiveAsync(System.Object, System.Net.Sockets.SocketAsyncEventArgs) at System.ServiceModel.Channels.SocketConnection.OnReceiveAsyncCompleted(System.Object, System.Net.Sockets.SocketAsyncEventArgs) at System.Net.Sockets.SocketAsyncEventArgs.OnCompleted(System.Net.Sockets.SocketAsyncEventArgs) at System.Net.Sockets.SocketAsyncEventArgs.FinishOperationSuccess(System.Net.Sockets.SocketError, Int32, System.Net.Sockets.SocketFlags) at System.Net.Sockets.SocketAsyncEventArgs.CompletionPortCallback(UInt32, UInt32, System.Threading.NativeOverlapped*) at System.Threading._IOCompletionCallback.PerformIOCompletionCallback(UInt32, UInt32, System.Threading.NativeOverlapped*)
guojh021 2015-07-23
  • 打赏
  • 举报
回复
Exception Info: System.OutOfMemoryException Stack: at System.Runtime.AsyncResult.Complete(Boolean) at System.Runtime.AsyncResult.Complete(Boolean, System.Exception) at System.ServiceModel.Channels.SynchronizedMessageSource+ReceiveAsyncResult.OnReceiveComplete(System.Object) at System.ServiceModel.Channels.SessionConnectionReader.OnAsyncReadComplete(System.Object) at System.ServiceModel.Channels.SocketConnection.FinishRead() at System.ServiceModel.Channels.SocketConnection.OnReceiveAsync(System.Object, System.Net.Sockets.SocketAsyncEventArgs) at System.ServiceModel.Channels.SocketConnection.OnReceiveAsyncCompleted(System.Object, System.Net.Sockets.SocketAsyncEventArgs) at System.Net.Sockets.SocketAsyncEventArgs.OnCompleted(System.Net.Sockets.SocketAsyncEventArgs) at System.Net.Sockets.SocketAsyncEventArgs.FinishOperationSuccess(System.Net.Sockets.SocketError, Int32, System.Net.Sockets.SocketFlags) at System.Net.Sockets.SocketAsyncEventArgs.CompletionPortCallback(UInt32, UInt32, System.Threading.NativeOverlapped*) at System.Threading._IOCompletionCallback.PerformIOCompletionCallback(UInt32, UInt32, System.Threading.NativeOverlapped*)
guojh021 2015-07-23
  • 打赏
  • 举报
回复
引用 12 楼 sp1234 的回复:
你自己上上下下找找看,你贴出过出异常时的画面吗?你没有按照正规的“报告bug”的基本要求做,建议你先找懂得“流程”的人来帖出bug画面,做必要的问题定位。 一个合格的程序员,他会去找到bug代码的。这是“开发流程”的初步要求。
程序在客户现场随机出现,不确认是哪步出现. 在公司测试没啥问题. 我可能不是合格的程序员.
江南小鱼 2015-07-23
  • 打赏
  • 举报
回复
引用 5 楼 guojh021 的回复:
[quote=引用 4 楼 sp1234 的回复:] 找一个正规的开发人员,就会看抛出 OutOfMemoryException 异常的方法名了。
程序已到客户那里,在公司调试不会抛异常.过三五天就会出问题.[/quote] 1、增加记录相应的log,先找到抛出内存溢出的方法 2、公司调试是你一个人在用,客户现场是n多客户在用!典型的α和β测试嘛!
wjq 2015-07-23
  • 打赏
  • 举报
回复
你拿到捕获的异常自然就能找到到底是哪段代码出的问题。 我就非常好奇,最近几年,为什么不会调试/排错的"程序员”越来越多……
  • 打赏
  • 举报
回复
找一个正规的开发人员,就会看抛出 OutOfMemoryException 异常的方法名了。
xboxeer 2015-07-22
  • 打赏
  • 举报
回复
你是不是弄了些struct类型的变量然后new了一堆在某个单独的方法里面?
  • 打赏
  • 举报
回复
与其学一大堆概念,不如先学会如何截屏,如何踏实地坐在服务器前面,如何分析和写出一个能够让bug重现的测试用例,如何给别人报告bug。等你这样做到位了,自然有人会告诉你为什么会报告这个问题。 另外要知道,此异常提示的许多真实原因,都跟什么“系统内存溢出”完全无关。有些人抠字眼,而不是基于实践经验去做的分析,不可以信。 对于你自己 self-host 的宿主,比如你使用windows service,那么你可以使用console方式运行它(而不是win service),这样就能在命令行窗口看到一堆的错误堆栈信息(特别是,你可以部署一个debug版,而不是release版)。 只有你把bug重现出来(操作10次至少会有7次把系统刻意搞跨),并且你自己通过.net系统在命令行窗口打印的提示(或者windows事件日志里边记录的提示)查看到抛出异常的位置,或者你通过增加一些日志而将抛出异常的位置缩小到只有几行代码那个小的区域,你才能着手纠结什么理论。 过早地贴出一堆理论文章,或者瞎猜一大堆原因,对于注重“实际、不太虚”的人来说都是很烦的做法。
寂空冷 2015-07-22
  • 打赏
  • 举报
回复
该回收的强制回收资源...
xboxeer 2015-07-22
  • 打赏
  • 举报
回复
引用 13 楼 starfd 的回复:
宿主程序内部加上try catch看能否捕获是什么东西导致的异常呢 然后可以的话,抓dump然后进行分析
For ur reference http://outofmemory.cn/c/dotNet-outOfMemoryException
grearo 2015-07-22
  • 打赏
  • 举报
回复
贴出你的代码~
  • 打赏
  • 举报
回复
宿主程序内部加上try catch看能否捕获是什么东西导致的异常呢 然后可以的话,抓dump然后进行分析
  • 打赏
  • 举报
回复
你自己上上下下找找看,你贴出过出异常时的画面吗?你没有按照正规的“报告bug”的基本要求做,建议你先找懂得“流程”的人来帖出bug画面,做必要的问题定位。 一个合格的程序员,他会去找到bug代码的。这是“开发流程”的初步要求。
xboxeer 2015-07-22
  • 打赏
  • 举报
回复
另外你可以考虑用windows自带的性能计数器来看下CLR的GC 性能计数器在控制面板-》管理工具-》性能监视器里面
引用 10 楼 xboxeer 的回复:
OutOfMemery跟StackOverFlow一样 抛这俩了都是没得救了 而且根据.net的GC机制 对于引用对象在确定是否可以回收的时候会通过有向图查找来确定某个对象是否还有引用 如果有 就放入二代对象 不进行回收 如果没有 就设置为一代对象 下次GC就清理掉 对于struct类型的因为没有GC 都是直接往栈上面压的 如果你一个函数的参数一次性传了个超级大的Struct进去 是会直接把栈空间挤爆的(因为我没有遇到过这么极端的情况 所以个人感觉这种时候应该是stackoverflow 但是也说不定是OutOfMemery因为StackOverFlow通常在递归没有约束的时候出现) 另外还有一个比较坑的就是事件 事件你知道是有+= 绑定事件跟-=取消绑定的 由于事件本身跟别的对象不一样 如果你+=了没有-= 那么就有可能造成内存泄露 不知道你的程序里面是不是有什么动态绑定事件的代码 然后绑定了之后又没有取消绑定 [quote=引用 9 楼 guojh021 的回复:]

 public class GlobalExceptionHandler : IErrorHandler
    {


        public bool HandleError(Exception error)
        {
            return true;
        }

        public void ProvideFault(Exception error, MessageVersion version, ref Message fault)
        {
            FileStream aFile = new FileStream(@"C:\Data\Log.txt", FileMode.OpenOrCreate);
            StreamWriter sw = new StreamWriter(aFile);

            sw.WriteLine("时间:{0}" + System.Environment.NewLine + "错误:{1}", System.DateTime.Now.ToString("MM-dd HH:mm:ss.fff"), error.Message);
            sw.Close();
        }

    [GlobalExceptionHandlerBehaviour(typeof(GlobalExceptionHandler))]
    public class BizService : IContract
这样做,可以捕获Exption异常,但OutOfMemoryException服务器程序还是挂掉. 有人解释一下吗?
[/quote]
xboxeer 2015-07-22
  • 打赏
  • 举报
回复
OutOfMemery跟StackOverFlow一样 抛这俩了都是没得救了 而且根据.net的GC机制 对于引用对象在确定是否可以回收的时候会通过有向图查找来确定某个对象是否还有引用 如果有 就放入二代对象 不进行回收 如果没有 就设置为一代对象 下次GC就清理掉 对于struct类型的因为没有GC 都是直接往栈上面压的 如果你一个函数的参数一次性传了个超级大的Struct进去 是会直接把栈空间挤爆的(因为我没有遇到过这么极端的情况 所以个人感觉这种时候应该是stackoverflow 但是也说不定是OutOfMemery因为StackOverFlow通常在递归没有约束的时候出现) 另外还有一个比较坑的就是事件 事件你知道是有+= 绑定事件跟-=取消绑定的 由于事件本身跟别的对象不一样 如果你+=了没有-= 那么就有可能造成内存泄露 不知道你的程序里面是不是有什么动态绑定事件的代码 然后绑定了之后又没有取消绑定
引用 9 楼 guojh021 的回复:

 public class GlobalExceptionHandler : IErrorHandler
    {


        public bool HandleError(Exception error)
        {
            return true;
        }

        public void ProvideFault(Exception error, MessageVersion version, ref Message fault)
        {
            FileStream aFile = new FileStream(@"C:\Data\Log.txt", FileMode.OpenOrCreate);
            StreamWriter sw = new StreamWriter(aFile);

            sw.WriteLine("时间:{0}" + System.Environment.NewLine + "错误:{1}", System.DateTime.Now.ToString("MM-dd HH:mm:ss.fff"), error.Message);
            sw.Close();
        }

    [GlobalExceptionHandlerBehaviour(typeof(GlobalExceptionHandler))]
    public class BizService : IContract
这样做,可以捕获Exption异常,但OutOfMemoryException服务器程序还是挂掉. 有人解释一下吗?
guojh021 2015-07-22
  • 打赏
  • 举报
回复

 public class GlobalExceptionHandler : IErrorHandler
    {


        public bool HandleError(Exception error)
        {
            return true;
        }

        public void ProvideFault(Exception error, MessageVersion version, ref Message fault)
        {
            FileStream aFile = new FileStream(@"C:\Data\Log.txt", FileMode.OpenOrCreate);
            StreamWriter sw = new StreamWriter(aFile);

            sw.WriteLine("时间:{0}" + System.Environment.NewLine + "错误:{1}", System.DateTime.Now.ToString("MM-dd HH:mm:ss.fff"), error.Message);
            sw.Close();
        }

    [GlobalExceptionHandlerBehaviour(typeof(GlobalExceptionHandler))]
    public class BizService : IContract
这样做,可以捕获Exption异常,但OutOfMemoryException服务器程序还是挂掉. 有人解释一下吗?
guojh021 2015-07-22
  • 打赏
  • 举报
回复
引用 6 楼 dongxinxi 的回复:
用内存溢出工具扫描下看看有没有泄露,包括一些意外结束的线程中未释放的资源 IIS支持定期回收,可以用它做宿主
能推荐一些工具吗?
guojh021 2015-07-22
  • 打赏
  • 举报
回复
引用 2 楼 lihui398 的回复:
该回收的强制回收资源...
引用 1 楼 grearo 的回复:
贴出你的代码~

static void Main(string[] args)
        {
            Console.Title = "应用服务";
            bool flag = true;
            string cmd = "";
            using (ServiceHost host = new ServiceHost(typeof(BizService)))
            {
                DateTime dtNow = DateTime.Now;
                host.Opened += delegate
                {
                    Console.WriteLine("启动时间:" + dtNow);
                    Console.WriteLine("BizService服务启动 ......");
                    Console.Write(">");
                };
                host.Open();
                while (flag == true)
                {
                    cmd = Console.ReadLine().Trim();
                    switch (cmd)
                    {
                        case "exit":
                            flag = false;
                            break;
                        case "cls":
                            Console.Clear();
                            Console.WriteLine("启动时间:" + dtNow);
                            Console.WriteLine("BizService服务启动 ......");
                            Console.Write(">");
                            break;
                        case "call":
                            Console.WriteLine("执行call");
                            Console.Write(">");
                            break;
                    }
                }
            }
        }

  public class BizService : IContract
    {
        public DataTable GetXxByID(string ID)
        {
            //throw new OutOfMemoryException("内存溢出.........");///这里为人为抛出异常.服务就会挂掉
            return l_Rule.GetXxByID(ID);
        }
.........
}
GetXxByID 这样的方法很多,现在不知道哪个方法报异常引起的问题.
加载更多回复(2)

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧