-
Analyse von Heap memory leaks auf IBM i
Hallo zusammen,
ich muss ein Heap memory Problem auf der AS/400 analysieren. Dazu verwende ich folgende PEX Befehle:
Code:
ADDPEXDFN DFN(HEAP) TYPE(*TRACE) JOB((123456/MAT/MAT0 *ALL)) TASK(*ALL) MAXSTG(4000000) TRCTYPE(*SLTEVT) SLTEVT(*YES) MCHINST(*NONE) STGEVT((*ACTGRPHEAP))
STRPEX SSNID(HEAP)
- Aktion ausführen -
ENDPEX SSNID(HEAP) DTALIB(MATTRC) RPLDTA(*YES)
Es werden nun ein paar Outfiles erzeugt, die per SQL gejoint werden können, um die Heap-Segment Adresse, die allokierte Größe und den Aufrufstapel zu ermitteln:
Code:
CREATE VIEW mattrc/heapv1 AS
(SELECT a.QRECN,
a.QHPASA,
a.QHPASZ,
a.QHPOPR,
a.QHPRET,
(SELECT QPRPNM
FROM mattrc/QAYPEPROCI
WHERE QHPCK1 = QPRKEY) cs1,
QIASTMT1,
(SELECT QPRPNM
FROM mattrc/QAYPEPROCI
WHERE QHPCK2 = QPRKEY) cs2,
QIASTMT2,
(SELECT QPRPNM
FROM mattrc/QAYPEPROCI
WHERE QHPCK3 = QPRKEY) cs3,
QIASTMT3,
(SELECT QPRPNM
FROM mattrc/QAYPEPROCI
WHERE QHPCK4 = QPRKEY) cs4,
QIASTMT4,
(SELECT QPRPNM
FROM mattrc/QAYPEPROCI
WHERE QHPCK5 = QPRKEY) cs5,
QIASTMT5
FROM mattrc/QAYPEHEAP a
INNER JOIN mattrc/QAYPETIDX c
ON a.QRECN = c.QRECN
LEFT JOIN mattrc/QAYPEIAD d
ON a.QRECN = d.QRECN);
/* Zeige alle mallocs zu deren Adresse kein free ausgeführt wurde */
SELECT *
FROM mattrc/heapv1
WHERE QHPOPR = 0
AND QHPASA NOT IN(SELECT QHPASA FROM mattrc/heapv1
WHERE QHPOPR = 1);
Mein Problem ist nun, dass die Datei QAYPEHEAP nur 5 Felder zur Speicherung der letzten 5 Aufrufstapeleinträge enthält. Weiß jemand, wie man mehr Aufrufstapeleinträge erhält?
Wie analysiert ihr Heap memory leak Probleme auf der AS/400?
Auf Windows kann man dazu recht bequem WPA (Windows Performance Analyzer) verwenden.
Viele Grüße
Matthias
-
Die Frage ist, für welche Sprache?
Im ILERPG habe ich das i.d.R. nicht, da ich keine %alloc benötige. Wichtig ist natürlich vom Code her, alle %alloc auch wieder freizugeben. Da hilft eine reine Speicheranalyse auch eher selten;-).
-
Es wird ILE C++ verwendet. Da kann es malloc, new .. geben. Mit dem oben genannten PEX Aufruf wird ja bewusst aufgezeichnet, wer Speicher reserviert und auch wieder frei gibt, nur ist halt der Aufrufstapel zu kurz, wodurch dann nicht klar ist, wer die entsprechenden Aufrufer sind.
-
Ich habe mir der erzeugten Outfile nochmals genauer angeschaut. In Datei QAYPEIAD befindet sich der Callstack immerhin mit bis zu 16 Einträgen, was bei einer C++ Applikation aber immer noch sehr wenig ist.
Die View würde damit so erzeugt werden:
Code:
CREATE or replace VIEW mattrc/heapv1 AS (
SELECT a.QRECN, a.QHPASA, a.QHPASZ, a.QHPOPR, a.QHPRET,
( select rtrim(QPRPGN)|| ':' ||QPRPNM from mattrc/QAYPEPROCI where QIAKEY16 = QPRKEY) cs16, QIASTMT16,
( select rtrim(QPRPGN)|| ':' ||QPRPNM from mattrc/QAYPEPROCI where QIAKEY15 = QPRKEY) cs15, QIASTMT15,
( select rtrim(QPRPGN)|| ':' ||QPRPNM from mattrc/QAYPEPROCI where QIAKEY14 = QPRKEY) cs14, QIASTMT14,
( select rtrim(QPRPGN)|| ':' ||QPRPNM from mattrc/QAYPEPROCI where QIAKEY13 = QPRKEY) cs13, QIASTMT13,
( select rtrim(QPRPGN)|| ':' ||QPRPNM from mattrc/QAYPEPROCI where QIAKEY12 = QPRKEY) cs12, QIASTMT12,
( select rtrim(QPRPGN)|| ':' ||QPRPNM from mattrc/QAYPEPROCI where QIAKEY11 = QPRKEY) cs11, QIASTMT11,
( select rtrim(QPRPGN)|| ':' ||QPRPNM from mattrc/QAYPEPROCI where QIAKEY10 = QPRKEY) cs10, QIASTMT10,
( select rtrim(QPRPGN)|| ':' ||QPRPNM from mattrc/QAYPEPROCI where QIAKEY9 = QPRKEY) cs9 , QIASTMT9,
( select rtrim(QPRPGN)|| ':' ||QPRPNM from mattrc/QAYPEPROCI where QIAKEY8 = QPRKEY) cs8 , QIASTMT8,
( select rtrim(QPRPGN)|| ':' ||QPRPNM from mattrc/QAYPEPROCI where QIAKEY7 = QPRKEY) cs7 , QIASTMT7,
( select rtrim(QPRPGN)|| ':' ||QPRPNM from mattrc/QAYPEPROCI where QIAKEY6 = QPRKEY) cs6 , QIASTMT6,
( select rtrim(QPRPGN)|| ':' ||QPRPNM from mattrc/QAYPEPROCI where QIAKEY5 = QPRKEY) cs5 , QIASTMT5,
( select rtrim(QPRPGN)|| ':' ||QPRPNM from mattrc/QAYPEPROCI where QIAKEY4 = QPRKEY) cs4 , QIASTMT4,
( select rtrim(QPRPGN)|| ':' ||QPRPNM from mattrc/QAYPEPROCI where QIAKEY3 = QPRKEY) cs3 , QIASTMT3,
( select rtrim(QPRPGN)|| ':' ||QPRPNM from mattrc/QAYPEPROCI where QIAKEY2 = QPRKEY) cs2 , QIASTMT2,
( select rtrim(QPRPGN)|| ':' ||QPRPNM from mattrc/QAYPEPROCI where QIAKEY1 = QPRKEY) cs1 , QIASTMT1
FROM mattrc/QAYPEHEAP a
LEFT JOIN mattrc/QAYPEIAD b
ON a.QRECN = b.QRECN);
Similar Threads
-
By Bernstein in forum NEWSboard Server Job
Antworten: 0
Letzter Beitrag: 05-08-14, 17:34
-
By sokri in forum NEWSboard Server & Hardware Markt
Antworten: 0
Letzter Beitrag: 13-03-06, 11:00
-
By HJK_SpEl in forum IBM i Hauptforum
Antworten: 0
Letzter Beitrag: 09-06-05, 13:34
-
By lorenzen in forum IBM i Hauptforum
Antworten: 4
Letzter Beitrag: 07-05-03, 11:46
-
By KB in forum IBM i Hauptforum
Antworten: 3
Letzter Beitrag: 20-11-01, 12:16
Tags for this Thread
Berechtigungen
- Neue Themen erstellen: Nein
- Themen beantworten: Nein
- You may not post attachments
- You may not edit your posts
-
Foren-Regeln
|
Erweiterte Foren Suche
Google Foren Suche
Forum & Artikel Update eMail
AS/400 / IBM i
Server Expert Gruppen
Unternehmens IT
|
Kategorien online Artikel
- Big Data, Analytics, BI, MIS
- Cloud, Social Media, Devices
- DMS, Archivierung, Druck
- ERP + Add-ons, Business Software
- Hochverfügbarkeit
- Human Resources, Personal
- IBM Announcements
- IT-Karikaturen
- Leitartikel
- Load`n`go
- Messen, Veranstaltungen
- NEWSolutions Dossiers
- Programmierung
- Security
- Software Development + Change Mgmt.
- Solutions & Provider
- Speicher – Storage
- Strategische Berichte
- Systemmanagement
- Tools, Hot-Tips
Auf dem Laufenden bleiben
|
Bookmarks