如何计算栈溢出长度 STM32局部变量的数组最大能到多少?
STM32局部变量的数组最大能到多少?
依据什么你需要提供的信息,推断你在用的肯定是TinyCComplier编译器,这是一个32位的编译器,这样的话int应该为32位,4个字节。
先去看看数组的大小,inta[664579],这样大小为664579×42658316,也就是2.5M
C语言的局部变量在在栈上分配空间,TCC默认的栈大小为1M,看来会造成栈逸出,程序崩溃。
最新版的TCC可以提供了自定义栈大小的参数,如下面:
tcc-Wl,--stack4194309
将栈大小委托为4M。
真不知道你的TCC版本是否允许这个参数。
而全局变量在堆上分配空间,Win32应用程序可访问的地址空间是4G,一般来说进程求实际能不使用的是仍旧达不了这个值,但在放一个2.5M的数组我还是不成问题的。因为以及全局变量程序可正常运行。
所以才程序中要不使用规模大数组,不是的话符号表示为全局变量,要嘛不使用malloc一类的函数在堆上日志分配空间。
为什么会出现“Stack overflow”的异常提示?
stack overflow是栈流出错误,stack是系统调用函数时手动以维护的,当不可能发生stack overflow时将近长度的数据会遍布函数前往地址。
Java里还有大约20%可用内存的情况下显示内存溢出,是怎么回事?应该怎么办?
JVM中的内存和计算机的内存并非一回事,JVM(JAVA虚拟机)只不过启动在服务器中的一个进程,只占用资源一部分的内存,其中堆常见占了整个jvm内存的80%!
举例再看看,计算机是8G内存只给jvm分配了4G内存,jvm占内存了4G内存之后,虽说整个内存才不使用50%(忽略其他的),jvm也将发生内存泄漏!
jvm程序报错有哪些很可能情况呢?
①,堆滴下:堆为了存储实例对象!
可能原因一:设置中的大堆内存太小!解决方案:通过可以设置-Xmx调大的最堆内存!
可能原因二:循环创建家族对象导致对象没来得及回收!解决方案:优化系统代码!
②,栈流出:栈要注意用来储存时对象引用!
可能会原因:递归过程动态创建方法等很难出现栈溢出!
解决方法:360优化代码!
③,方法区滴下:大多是因为运行程序了大量的Class,jar等!
大多数不会逸出,建议使用-XX:Permsize设置里比较合适的绝版代!
才发现内存溢出之后,可在用jstamp,MATJAVA等接受内存讲
一直在在坚持了彼此分享JAVA方面的技术,有要的朋友劳请关注。。
版权声明:本文内容由互联网用户自发贡献,本站不承担相关法律责任.如有侵权/违法内容,本站将立刻删除。