如何計(jì)算棧溢出長(zhǎng)度 STM32局部變量的數(shù)組最大能到多少?
STM32局部變量的數(shù)組最大能到多少?依據(jù)什么你需要提供的信息,推斷你在用的肯定是TinyCComplier編譯器,這是一個(gè)32位的編譯器,這樣的話int應(yīng)該為32位,4個(gè)字節(jié)。先去看看數(shù)組的大小,i
STM32局部變量的數(shù)組最大能到多少?
依據(jù)什么你需要提供的信息,推斷你在用的肯定是TinyCComplier編譯器,這是一個(gè)32位的編譯器,這樣的話int應(yīng)該為32位,4個(gè)字節(jié)。
先去看看數(shù)組的大小,inta[664579],這樣大小為664579×42658316,也就是2.5M
C語(yǔ)言的局部變量在在棧上分配空間,TCC默認(rèn)的棧大小為1M,看來(lái)會(huì)造成棧逸出,程序崩潰。
最新版的TCC可以提供了自定義棧大小的參數(shù),如下面:
tcc-Wl,--stack4194309
將棧大小委托為4M。
真不知道你的TCC版本是否允許這個(gè)參數(shù)。
而全局變量在堆上分配空間,Win32應(yīng)用程序可訪問(wèn)的地址空間是4G,一般來(lái)說(shuō)進(jìn)程求實(shí)際能不使用的是仍舊達(dá)不了這個(gè)值,但在放一個(gè)2.5M的數(shù)組我還是不成問(wèn)題的。因?yàn)橐约叭肿兞砍绦蚩烧_\(yùn)行。
所以才程序中要不使用規(guī)模大數(shù)組,不是的話符號(hào)表示為全局變量,要嘛不使用malloc一類的函數(shù)在堆上日志分配空間。
為什么會(huì)出現(xiàn)“Stack overflow”的異常提示?
stack overflow是棧流出錯(cuò)誤,stack是系統(tǒng)調(diào)用函數(shù)時(shí)手動(dòng)以維護(hù)的,當(dāng)不可能發(fā)生stack overflow時(shí)將近長(zhǎng)度的數(shù)據(jù)會(huì)遍布函數(shù)前往地址。
Java里還有大約20%可用內(nèi)存的情況下顯示內(nèi)存溢出,是怎么回事?應(yīng)該怎么辦?
JVM中的內(nèi)存和計(jì)算機(jī)的內(nèi)存并非一回事,JVM(JAVA虛擬機(jī))只不過(guò)啟動(dòng)在服務(wù)器中的一個(gè)進(jìn)程,只占用資源一部分的內(nèi)存,其中堆常見(jiàn)占了整個(gè)jvm內(nèi)存的80%!
舉例再看看,計(jì)算機(jī)是8G內(nèi)存只給jvm分配了4G內(nèi)存,jvm占內(nèi)存了4G內(nèi)存之后,雖說(shuō)整個(gè)內(nèi)存才不使用50%(忽略其他的),jvm也將發(fā)生內(nèi)存泄漏!
jvm程序報(bào)錯(cuò)有哪些很可能情況呢?
①,堆滴下:堆為了存儲(chǔ)實(shí)例對(duì)象!
可能原因一:設(shè)置中的大堆內(nèi)存太?。〗鉀Q方案:通過(guò)可以設(shè)置-Xmx調(diào)大的最堆內(nèi)存!
可能原因二:循環(huán)創(chuàng)建家族對(duì)象導(dǎo)致對(duì)象沒(méi)來(lái)得及回收!解決方案:優(yōu)化系統(tǒng)代碼!
②,棧流出:棧要注意用來(lái)儲(chǔ)存時(shí)對(duì)象引用!
可能會(huì)原因:遞歸過(guò)程動(dòng)態(tài)創(chuàng)建方法等很難出現(xiàn)棧溢出!
解決方法:360優(yōu)化代碼!
③,方法區(qū)滴下:大多是因?yàn)檫\(yùn)行程序了大量的Class,jar等!
大多數(shù)不會(huì)逸出,建議使用-XX:Permsize設(shè)置里比較合適的絕版代!
才發(fā)現(xiàn)內(nèi)存溢出之后,可在用jstamp,MATJAVA等接受內(nèi)存講
一直在在堅(jiān)持了彼此分享JAVA方面的技術(shù),有要的朋友勞請(qǐng)關(guān)注。。