
想知道,我创造了两个测试例子:
1)Hello world应用程序与以下xml为主要活动
<?xml version="1.0" enCoding="utf-8"?><FrameLayout xmlns:androID="http://schemas.androID.com/apk/res/androID" androID:layout_wIDth="fill_parent" androID:layout_height="fill_parent" > <FrameLayout androID:layout_wIDth="fill_parent" androID:layout_height="fill_parent" > <FrameLayout androID:layout_wIDth="fill_parent" androID:layout_height="fill_parent" > <!-- ...so on 30 times... --> <FrameLayout androID:layout_wIDth="fill_parent" androID:layout_height="fill_parent" > </FrameLayout> <!-- ...so on 30 times... --> </FrameLayout> </FrameLayout></FrameLayout>
在绘制布局时导致StackOverflowError(导致每个布局递归绘制它的子代)
2)以下测试用例
public class TestOverflowActivity extends Activity { /** Called when the activity is first created. */ @OverrIDe public voID onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); overflow(0); } private voID overflow(int i){ androID.util.Log.i("Stack depth:"," = " + i); overflow(i+1); }} 导致StackOverflowError深度约260-270个调用.
对于第二个测试用例,每个调用堆栈元素需要4个字节用于返回地址4个字节,用于参数= 8个字节. Dalvik的VM可能在每个元素中保持更多的信息,但是每个元素甚至16个字节* 260个调用=最大总体堆栈大小为4Kbytes.这似乎不够
有没有办法增加最大堆栈大小?
解决方法 您可能无法在主UI线程中增加调用堆栈大小(这是可以理解的,因为您应该在这里尽可能少的事情),但是您可以通过使用Thread对象的构造函数参数:ThreadGroup group = new ThreadGroup("threadGroup");new Thread(group,runnableObject,"YourThreadname",2000000).start(); 有了这个例子,我将堆栈大小从8k(大约260个调用)增加到2M(足够不能得到StackOverFlowException,当然你可以添加尽可能多的内存可以占用它),所以到最后对于更多的读者来说,这是您可以增加堆栈大小的方式,尽管不建议,但在某些情况下,实际上还需要一个具有广泛递归调用的算法,当然也可以通过在工作线程中进行所有的辛勤工作你应该)使用你指定的堆栈大小,并且只需在UI中使用主UI线程与处理程序或任何你想用来与之交互的机制来“发布”更改…
希望这可以帮助…
问候!
总结以上是内存溢出为你收集整理的Android:增加呼叫堆栈大小全部内容,希望文章能够帮你解决Android:增加呼叫堆栈大小所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)