【发布时间】:2012-02-10 01:42:58
【问题描述】:
我有一个 UI 非常复杂的应用程序,其中包含许多相互嵌套的 layouts。在创建另一个布局时,我发现了 StackOverflowError
奇怪,我创建了两个测试示例:
1) Hello world 应用程序,主 Activity 具有以下 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 个字节作为参数 = 8 bytes 的返回地址 + 4 bytes。 Dalvik's VM 可能会在每个元素中保留更多信息,但即使是 16 bytes per element * 260 calls = about 4Kbytes 也可能会获得最大的整体堆栈大小。这似乎还不够。
有没有办法增加最大堆栈大小?
【问题讨论】: