NullPointerException.... aber warum?

  • 23 Antworten
  • Letztes Antwortdatum
@Jaiel @markus.tullius eine Frage an euch... Wenn man einem Objekt null zuweist, wird es dann automatisch vom GC aufgeräumt? So viel ich gelesen habe schon. Ich habe allerdings gemerkt, dass selbst dann der RAM-Verbrauch nicht sinkt. Kann ich mir auch nicht erklären. Vielleicht hängt noch irgendwo eine Kopie oder Referenz auf das Objekt, das eigentlich auf null gesetzt wurde. Gibt es da eine konkrete Möglichkeit, das Objekt komplett "auszulöschen"?
 
Es kommt darauf an. Eine null-setzung Befreit das Objekt nur von einer Referenz und sagt dem System, dass die GC's es wegräumen können (es gibt mehr als nur einen Typ GC). Sollte de Referenzzähler aber nicht auf 0 sein dann wird das Objekt noch im Speicher gehalten.

Es passiert nichts sofort sondern erst wenn ein neuer GC Cycle angestoßen wird.

Bei dem Activity Context ist ein Problem, dass einer Activity eine ganze View-Hierarchie anhängt. Und diese kann sehr viel Speicher verbrauchen je nachdem was man so aufgebaut hat.

Du könntest mal mit Absicht einen Memory-Leak verursachen indem du in onCreate der Activity einer View ein statisches Bitmap zuweist.

Falls die App auf Orientierung reagiert dann wird bei jedem Wechsel die Activity zerstört und ein neuer Context reserviert.

Jedoch bleibt die gesamte View Hierarchie im Speicher weil das Drawable static ist und die View als Callback beim Drawable angemeldet ist, ist da eine Referenz die man per Hand wieder lösen muss, sonst behält der GC das im Speicher

Die View wiederum verweist auf den Context der zerstörten Activity und damit auf so ziemlich alles was eigentlich weggeräumt werden musste beim Zerstören der Activity.

Code:
static Drawable bmp;

public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);

  TextView tView = new TextView(this);

  if (bmp== null) {
    bmp = getDrawable(R.drawable.bmp_large);
  }
  tView.setBackgroundDrawable(bmp);

  setContentView(tView);
}

Genau so kannst du das auch mit deinem Adapter machen.

Nach ein paar Mal hin und herdrehen stürzt deine App ab...


Naja so viel zum Activity Context. Der Application Context dagegen ändert sich nicht. Aber irgendwie rät jeder davon ab den zu benutzen, da musst du dein Use Case mal analysieren udn ob es Probleme geben könnte für manche Sachen den Application Context zu verwenden oder auch nciht
 
Zuletzt bearbeitet:
xdevs23 schrieb:
Was aber dann eigentlich mit meinem alten S3 mini passiert ist, sodass der eMMC hinterher dann schreibgeschützt war, ist dann wohl unklar. Oder es war einfach ein fehlerhafter chip.

Mit der Vermutung, dass es ein einen fehlerhaften Chip war, liegst du richtig. Samsung Galaxy S3 - Sudden Death
 
@markus.tullius leider aber war das bei mir wohl ein Einzelfall, denn das S3 mini ist offiziell nicht von diesem Problem betroffen. Seitdem mir das passiert ist, versuche ich Überschreiben von Daten zu vermindern, in dem ich z. B. nur dann Daten überschreibe, wenn es wirklich nötig ist, aber immernoch so, dass keine Daten verloren gehen.
 
Zurück
Oben Unten