作者:hunhun1981
出自:http://blog.csdn.net/hunhun1981/
摩托罗拉的linux智能手机,A1200以及E6等等,性能和使用感受都不错。
在这些手机上开发j2me软件时,遇到一个匪夷所思的问题。折腾了很久,搞定。赶紧过来跟大家分享我的开发经验。
问题:
程序无故抛出数组越界的异常。而且随机性很强。同样代码在别的手机,甚至包括性能比1200弱很多的nokia 40手机也不会出现这个问题。
经过一系列的排查,排除了内存不够,内存泄漏等等原因。
最终经过分析得出结论,当运行大函数(1000行甚至更多)的时候,栈内存非常不稳定。
……
首先要说明,栈内存是用来存放变量引用的地方。理论上引用都不大啊。怎么会如此娇贵?
也许是jvm的代码区与栈内存区域有点瓜葛?
当然,出现这个问题还有一个原因,我的项目是一个图形图像的算法型函数。
由于对方不了解优化技术。在函数执行过程中,有大量的零时变量产生。
不管怎么说,由于j2me开发几乎无法深入到jvm的实现底层。所以也就只能忍耐一下,根据jvm的这些癖好修改咱们的程序了。
上面的问题,主要出在摩托罗拉的linux智能手机上。而且,改问题不是必现,测试力度不够还未必能发现。
在这个环境下的jvm有可能都存在这个问题(我做过1200和E6的真机测试,在任何的模拟环境下都无法重现这个问题)。
解决方法也很简单
1,拆分所有大函数,一个函数一般不要超过800行(完全是经验值,没有任何理论依据。但是,确实有效)。
2,优化拆分后的函数,尽量减少零时变量的产生。例如:
for(int i = 0;i < temp + 2;i++)
这样的代码,没循环一次,就会产生一个整形的临时变量,那就是temp + 2的运算结果。
在嵌套循环中,越是内部的函数,越应该优化,勿以善小而不为啊。
更多的优化方法,这里不再一一叙述。朋友们请自行在网上搜索。
PS:再次谴责那些作风彪悍的程序员,动不动就拿几千行的函数。我不死,IDE也死了!
更多信息,请关注hunhun1981的专栏 。