2016-05-19 9 views
0

Ich arbeite mit einer Anwendung, die völlig mit Bildern und Videos arbeiten. Ich speichere alle Bilder und Videos des Geräts in der Datenbank der Anwendung und diese Aufgabe wird in einem Hintergrunddienst ausgeführt. Zwischen diesem Vorgang überprüfe ich, ob das Gesicht im Bild mit getFacesFromBitmap(mBitmap) erkannt wird.bekommen Fehler "java.lang.StackOverflowError: Stapelgröße 1036KB" und OutOfMemory

Das Problem ist, dass irgendwann bekomme ich Fehler java.lang.StackOverflowError: stack size 1036KB und manchmal bekomme ich OOM Fehler.

Gibt es den besten Weg, dieses Problem zu lösen?

Antwort

1

Stackoverflow in der Regel durch eine überwältigende Stack-Größe verursacht wird (zu viele Methoden aufrufen einander)

Manchmal wird es durch Methoden verursacht, die sich selbst rekursiv (man stelle sich eine Methode, die sich für immer hält ruft!).

Die Behebung des Problems hängt davon ab, ob es sich um einen programmatischen Fehler oder nur um eine unzureichende maximale Stapelgröße für Ihre Anwendung handelt.

Ich empfehle, dass Sie Ihren Code für rekursive Anrufe überprüfen und stellen Sie sicher, dass keine Methode endlos fortfahren wird. Die andere Option (nachdem Sie sichergestellt haben, dass es keine Probleme mit Ihrem Code gibt) besteht darin, die Stackgröße Ihres Programms zu erhöhen, zB: Tomcat hat einen Parameter namens "-Xss", mit dem der maximale Stack eingestellt werden kann Größe, überprüfen Sie den unten stehenden Link:

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

2

Ja,

es wegen der Aufruf der Funktion rekursiv passieren wird.

Vor Aufruf der Funktion ... Nur schlafen für 2000/3000 Sekunden

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; 
}