遇到错误"java.lang.StackOverflowError: stack size 1036KB"和OutOfMemory。

12
我正在使用一个完全基于图像和视频的应用程序。我将设备中的所有图像和视频存储到应用程序的数据库中,并在后台服务中执行此任务。在此过程中,我使用getFacesFromBitmap(mBitmap)检查图像中是否有人脸。

问题是有时我会遇到错误java.lang.StackOverflowError:stack size 1036KB ,有时我会遇到OOM错误。
那么有没有什么最好的方法来解决这个问题?
3个回答

13

StackOverflowError通常是由于堆栈大小过大(方法之间互相调用太多)导致的。

有时会因为方法递归调用自身而导致此错误(想象一个不停地调用自身的方法!)。

解决此问题要看是否是程序错误,还是应用程序中的最大堆栈大小限制不足引起的。

我建议您检查代码中是否存在递归调用,并确保没有任何方法会无休止地调用自身。

在确保代码没有问题后,另一种选择是增加程序的堆栈大小,例如:Tomcat有一个名为“-Xss”的参数,可以用来调整最大堆栈大小,请查看下面的链接:

http://www.tomcatexpert.com/blog/2011/11/22/performance-tuning-jvm-running-tomcat


4

是的,由于函数递归调用,这将会发生。

在调用函数之前...只需休眠2000/3000秒。

    private String getRegKey() {

    String regId = pref.getString("regId", null);

    if (!TextUtils.isEmpty(regId)) {

        //registration id recieved
        Log.e("reg key","is"+regId);
    } else {

        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        getRegKey();
    }

    return regId;
}

0

当我尝试使用Gson将大量数据显示在日志中时,我遇到了这个问题。因此,如果您有大量数据,则尝试将其调用到单独的线程中。

Log.d("TAG", "tgX6Values: "+new Gson().toJson(tgX6Values));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接