Shortdump wegen Speicherüberlauf

Die Objektorientierung mit ABAP®: Vererbung, Dynamische Programmierung, GUI Controls (u.a. ALV im OO).
8 Beiträge • Seite 1 von 1
8 Beiträge Seite 1 von 1

Shortdump wegen Speicherüberlauf

Beitrag von chhe001 (ForumUser / 22 / 0 / 0 ) » 20.11.2020 11:44
Hallo, ich selektiere über eine Schleife über die interne Tabelle itab etliche Prozessdokumente. Dazu verwende ich die Klasse /IDXGC/CL_PD_DOC_CONTEXT. Zunächst hole ich mir die Referenz auf ein Pdoc über die Nummer, anschließend über die Methode GET_HEADER_DATA die Kopfdaten und Methode GET_PROC_STEP_DATA die gewünschten Schrittdaten.
Das funktioniert auch gut, allerdings werden mit jedem Schleifendurchlauf Informationen im Speicher abgelegt. Nach x-Schleifendurchläufen bricht das System mit Laufzeitfehler ab. Es ist kein Speicher mehr verfügbar.

Die Referenz über FREE <datenreferenz> wegzunehmen bringt nichts. Auch das anschließende aufrufen des Garbage Collectors gibt keinen Speicherplatz frei.

Code: Alles auswählen.

DATA:   lr_me_pdoc          TYPE REF TO /idxgc/cl_pd_doc_context,
        ls_proc_header_data TYPE /idxgc/s_proc_hdr,
        ls_proc_step_data   TYPE /idxgc/s_proc_step_data.


LOOP AT itab ASSIGNING <fs_eideswtdoc>.

* Instanz auf Pdoc holen
  TRY.
      CALL METHOD /idxgc/cl_pd_doc_context=>get_instance
        EXPORTING
          iv_pdoc_no = <fs_eideswtdoc>-switchnum
        RECEIVING
          rr_ctx     = lr_me_pdoc.
    CATCH /idxgc/cx_process_error.
  ENDTRY.

* Get process document header data.
  TRY.
      CALL METHOD lr_me_pdoc->get_header_data
        IMPORTING
          es_proc_hdr = ls_proc_header_data.
    CATCH cx_sy_ref_is_initial.
  ENDTRY.

  TRY.
      CALL METHOD lr_me_pdoc->get_proc_step_data
        EXPORTING
          iv_proc_step_no   = '0010'
        IMPORTING
          es_proc_step_data = ls_proc_step_data.
    CATCH /idxgc/cx_process_error.
  ENDTRY.

  TRY.
      CALL METHOD lr_me_pdoc->close.
    CATCH cx_sy_ref_is_initial.
  ENDTRY.

  FREE lr_me_pdoc.
  cl_abap_memory_utilities=>do_garbage_collection( ).

ENDLOOP.
Ich wäre sehr dankbar wenn ich gute Tipps zum lösen des Problems erhalten würde.
Gruß
Christoph


Re: Shortdump wegen Speicherüberlauf

Beitrag von Haubi (Expert / 609 / 13 / 27 ) » 20.11.2020 12:02
Moinsen.

Ich vermute, dass die Referenzen auf die Objekte noch irgendwo in den Klassen gehalten werden. Dann sind die Instanzen nicht verwaist und der Garbage Collector räumt sie nicht ab.

Du kannst das im Debugger überprüfen, indem Du Dir ansiehst, welche Referenzen auf die einzelnen Instanzen existieren ("Verwendungsnachweis" auf dem entsprechenden Tab).

Wenn dem so ist hast Du nur eine Chance, wenn die Klassen eine Möglichkeit anbieten, die nicht mehr benötigten Referenzen zu löschen. Oder indem Du sie über Vererbung entsprechend erweiterst.

Grüße,
Haubi
Das ABAP Kochbuch ab sofort bei Amazon...

I'd rather write code that writes code than write code...

Re: Shortdump wegen Speicherüberlauf

Beitrag von DeathAndPain (Top Expert / 1456 / 159 / 331 ) » 20.11.2020 12:16
Das wäre aber ein so extremer Pfusch auf der SAP-Seite, dass ich erwarten würde, dass sich ein OSS-Hinweis mit einer Vorabkorrektur dafür finden lässt.

Re: Shortdump wegen Speicherüberlauf

Beitrag von black_adept (Top Expert / 3434 / 67 / 671 ) » 20.11.2020 14:55
Moin Christoph,
kapsele den Aufruf der Klasse in einen RFC-fähigen FuBa. Dann rufe den FuBa über die Destination NONE auf statt der Klasse. Und nachdem du den Aufruf gemacht hast schließe die RFC-Verbindung wieder mit FuBa RFC_CONNECTION_CLOSE um für den nächsten Aufruf wieder ein sauberes System zur Verfügung zu haben.
Ist vielleicht nicht die eleganteste Vorangehensweise und klappt auch nicht immer - aber wenn ich einfach nicht rausfinde wo SAP noch Daten puffert oder die Puffer nicht löschen kann/darf probiere ich diesen Ansatz.
live long and prosper
Stefan Schmöcker

email: stefan@schmoecker.de

Re: Shortdump wegen Speicherüberlauf

Beitrag von masterhash (ForumUser / 20 / 4 / 0 ) » 23.11.2020 08:03
Guten Morgen,

das selbe Problem hatte ich auch schon einmal. Dein Problem wird wahrscheinlich der Loop über /idxgc/cl_pd_doc_context=>get_instance sein. Die statische Methode müllt dich halt mit Instanzen voll, die erst beim beenden Programms aufgeräumt werden. Eine Lösung kann ich dir aber leider nicht anbieten... ich glaube ein Kollege hat irgendwas drumherum gebaut.

VG
Martin

Re: Shortdump wegen Speicherüberlauf

Beitrag von chhe001 (ForumUser / 22 / 0 / 0 ) » 23.11.2020 09:25
masterhash hat geschrieben:
23.11.2020 08:03
Guten Morgen,

das selbe Problem hatte ich auch schon einmal. Dein Problem wird wahrscheinlich der Loop über /idxgc/cl_pd_doc_context=>get_instance sein. Die statische Methode müllt dich halt mit Instanzen voll, die erst beim beenden Programms aufgeräumt werden. Eine Lösung kann ich dir aber leider nicht anbieten... ich glaube ein Kollege hat irgendwas drumherum gebaut.

VG
Martin
Hallo Martin,
vielleicht könntest du deinen Kollegen mal fragen wie er das Problem gelöst hat? Würde mir sehr weiterhelfen. Vielen Dank.
Gruß
Christoph

Re: Shortdump wegen Speicherüberlauf

Beitrag von masterhash (ForumUser / 20 / 4 / 0 ) » 23.11.2020 12:58
Hi Christoph,

das ginge leider erst nächste Woche Montag, sorry. Habs mir aber notiert.

VG
Martin

Re: Shortdump wegen Speicherüberlauf

Beitrag von chhe001 (ForumUser / 22 / 0 / 0 ) » 23.11.2020 13:37
Danke Martin,
VG Christoph

Seite 1 von 1

Aktuelle Forenbeiträge

Last erzeugen im SAPGui?
vor 7 Stunden von tm987456 19 / 192
IDoc-Segmente löschen
Gestern von littleJohn 2 / 77

Vergleichbare Themen

Anzeige Shortdump
von ewx » 22.01.2014 18:25
Aufruf von BAPI_PRODORD_CREATE_FROM_PLORD aus einer Klasse - Shortdump
von Anne_A » 03.03.2020 15:56