unity工程运行一段时间堆栈溢出,unity崩溃fatal error in GC. stack overflow

– 在这里做一下标记,困扰了我一天的难题,就是栈溢出导致软件奔溃的问题,gc报错,堆栈溢出.代码问题,没有指出具体溢出位置,需要自己慢慢排查.(多个个脚本大量的代码排查起来很艰难,首先要抓住的重点位置: 1.使用whiletrue的地方 2.使用递归的地方 3.在updata里不断实例化,new对象的地方. 4.updata里有数组list的地方 5.使用for循环赋值的地方(循环长度和赋值长度不一致时会导致for循环变成死循环,出现栈溢出))

导致堆栈溢出的原因:

一、局部数组过大。当函数内部的数组过大时,有可能导致堆栈溢出。
二、递归调用层次太多。递归函数在运行时会执行压栈操作,当压栈次数太多时,也会导致堆栈溢出。
三、指针或数组越界。这种情况最常见,例如进行字符串拷贝,或处理用户输入等等。

问题出现的地方:

我的工程里用到了udp的连接,数据传输.以及传输对于服务器返回的json字符串的解析,并使用了list接收解析的数组.并且使用了断网重连的机制,不断的inint初始化连接.

  • 我认为导致堆栈溢出的原因就是在于updata里面不断的初始化连接服务器,因为在udp连接服务器传输的方法里面有个whiletrue方法,不断的接收发送来的消息,并且还有一个new对象,新建一个线程.防止阻塞.
  • 1.当这两个方法都处在update的方法里不断的执行时,会导致在循环里不断的new新的对象,新建线程
  • 2.当while true方法在update里运行时会不断的重复方法,形成死循环.导致栈溢出.
  • 3.还有一点,在updata里不断的new list数组对象,导致大量的对象被新建,容易导致栈溢出.
我的解决办法:
  • 1.把updata里重连服务器的方法( inint() )放在了外面,因为该方法里面包括了whiletrue方法,并且还有一个new 线程的方法,如果一直在updata里执行,会出现嵌套死循环,以及大量线程.
  • 2.把updata里数new list的数组在方法的结束,进行了清空,list.clear(),或者list=null;l两者的区别:clear后该list还存在,null后不存在,被gc回收.个人建议设为null.就算在updata里不断的new出来,也会提醒后台gc及时的对该list进行回收.

总结

  • 1.对于数组,注意for循环的长度和数组的长度是否一致,如果不一致,很容易导致堆栈异常.
  • 2.死循环,对于死循环的使用要注意,比如递归的使用,容易堆栈溢出.更要注意嵌套的死循环,很容易堆栈溢出.在我的工程里我猜测时因为在updata里不断的执行死循环导致的.
  • 3.注意在for循环或者updata里出现不断的new对象,大量的对象被new出来后不确定被及时回收,在for循环结束之后要注意对于数组的清空,list.clear(),或者list=null.

你可能感兴趣的:(unity工程运行一段时间堆栈溢出,unity崩溃fatal error in GC. stack overflow)