Das Notes Forum

Lotus Notes / Domino Sonstiges => Java und .NET mit Notes/Domino => Thema gestartet von: Fragensteller am 02.03.12 - 15:34:37

Titel: JVMDUMP006I Speicherauszugsereignis "systhrow" wird verarbeitet; Detail "java/la
Beitrag von: Fragensteller am 02.03.12 - 15:34:37
Hi Leute,
ich habe gerade einen Java Agenten zu fassen, einige Berechnungen anstellen soll.

Aus Notes hole ich mir ein Dokument, Session, Agent, DB
Diese recycle ich später, sezte diese dann auf NULL

Nachdem ich den Agenten aber mehrmals laufen gelassen habe, kommt diese Fehlermeldung.

Nach ein wenig Suchen habe ich etwas gefunden, ich sollte die MaxHeapSize erhöhren. Habe ich gemacht und ist nun doppelt so groß.
Nun kommt der Fehler schon nach 2 mal laufen lassen. Und dazu noch  einer, der jede Minute geschrieben wird.
Ein Neustart hilft nur bei dem OutOfMemory bis der Agent wieder läuft.

"02.03.2012 15:23:31   Process C:\Program Files\IBM\Lotus\Domino\nserver.exe (2484/0x9B4) has terminated abnormally
02.03.2012 15:24:31   Process C:\Program Files\IBM\Lotus\Domino\nserver.exe (2484/0x9B4) has terminated abnormally
02.03.2012 15:25:31   Process C:\Program Files\IBM\Lotus\Domino\nserver.exe (2484/0x9B4) has terminated abnormally
02.03.2012 15:26:31   Process C:\Program Files\IBM\Lotus\Domino\nserver.exe (2484/0x9B4) has terminated abnormally"

Hat einer eine Ahnung und kann mir helfen?

02.03.2012 15:23:33   Agent  error: JVMDUMP006I Speicherauszugsereignis "systhrow" wird verarbeitet; Detail "java/lang/OutOfMemoryError" - Bitte warten.
02.03.2012 15:23:33   Agent  error: JVMDUMP032I  
02.03.2012 15:23:33   Agent  error: JVMDUMP010I Snap-Speicherauszug geschrieben auf C:\Program Files\IBM\Lotus\Domino\data\Snap.20120302.152333.2364.0001.trc
02.03.2012 15:23:33   Agent  error: JVMDUMP032I  
02.03.2012 15:23:33   Agent  error: JVMDUMP010I Heap-Speicherauszug geschrieben auf C:\Program Files\IBM\Lotus\Domino\data\heapdump.20120302.152333.2364.0002.phd
02.03.2012 15:23:33   Agent  error: JVMDUMP013I Speicherauszugsereignis "systhrow" verarbeitet, Detail "java/lang/OutOfMemoryError".
02.03.2012 15:23:33   Agent  error: Ausnahmebedingung in Thread "main"
02.03.2012 15:23:33   Agent  error: java.lang.OutOfMemoryError
02.03.2012 15:23:33   JVM: Creation of the byte [] object failed.
Titel: Re: JVMDUMP006I Speicherauszugsereignis "systhrow" wird verarbeitet; Detail "java/la
Beitrag von: m3 am 02.03.12 - 15:44:22
Ohne Code nicht.
Titel: Re: JVMDUMP006I Speicherauszugsereignis "systhrow" wird verarbeitet; Detail "java/la
Beitrag von: Fragensteller am 02.03.12 - 16:03:40
ok, ich teste mal kurz weiter.

Ich hatte einen FileInputstream erstellt
FileInputStream fileInputStream = new FileInputStream(tempFile);

aber nicht wieder geschlossen.
Titel: Re: JVMDUMP006I Speicherauszugsereignis "systhrow" wird verarbeitet; Detail "java/la
Beitrag von: eknori am 02.03.12 - 16:32:34
um die erzeugten DMP files zu analysieren, kannst du Eclipse Memory Analyser ( mat ) too lverwenden.
(http://www.eclipse.org/mat)
Zusätzlich musst du noch ein plugin installieren ( http://www.ibm.com/developerworks/java/jdk/tools/dtfj.html )
Damit lassen sich dann MemoryLeaks recht "einfach" aufspüren.
Titel: Re: JVMDUMP006I Speicherauszugsereignis "systhrow" wird verarbeitet; Detail "java/la
Beitrag von: Fragensteller am 02.03.12 - 16:55:41
Danke,

ich versuche es mal.
Das Schliessen des Streams hat nichts gebracht.
Titel: Re: JVMDUMP006I Speicherauszugsereignis "systhrow" wird verarbeitet; Detail "java/la
Beitrag von: flaite am 02.03.12 - 20:32:19
Sind in dem Agenten irgendwelche 3rd Party Libs eingebunden?
Notes/Domino haben da seit 12 Jahren ein Problem mit dem Classloader, der zu einem Memory-Leak führt.
Die andere Möglichkeit ist, dass Du in einer Schleife sehr viele Notes-Objekte erzeugst und sie nicht richtig recyclest.

Ich würde mich über ein Tutorial von eknori zum Thema "Memory Leaks aufspüren mit diesem Tool" freuen. Nix für ungut. Schwarzer Humor.   

saludos solidarios

Axel
Titel: Re: JVMDUMP006I Speicherauszugsereignis "systhrow" wird verarbeitet; Detail "java/la
Beitrag von: Fragensteller am 05.03.12 - 09:11:26
hi, ja das Tool hat geholfen.

The classloader/component "lotus.domino.AgentLoader @ 0x7fff6ecd840" occupies 58.543.768 (46,52%) bytes. The memory is accumulated in one instance of "java.util.Hashtable$Entry[]" loaded by "<system class loader>".

Keywords
lotus.domino.AgentLoader @ 0x7fff6ecd840
java.util.Hashtable$Entry[]


Label                                            Number of Objects                         Used Heap                       Size Retained Heap Size
java.util.Hashtable$Entry
First 10 of 5.877 objects              5.877                                              329.112                           58.406.120


Es wurde viel mit Hashmaps und TreeMaps gearbeitet.
Werde also mal versuchen die 3rd Party Libs rauszunehmen und das ganze auf linkedlists umzustellen.
Titel: hä???
Beitrag von: flaite am 05.03.12 - 22:26:00
Also das Tool hat ganz viele Hashtable Einträge gefunden. Ich würde daraus schliessen, dass das Ding nix taugt, weil das kann alles mögliche heißen. Verdächtig ist, dass der AgentLoader die Hashtables hält. Hmm. Das ist nun wieder interessant. Vielleicht taugt das Ding doch was. Wie gesagt Third Party Libs.
Und was ist das Problem mit den HashMap und TreeMap? Die sind im Paket java.util vom JDK und sind nicht böse.

WICHTIG UND VERMUTLICH DES PUDELS KERN: Mit Third Party Libs meine ich .jar Dateien, die im Agenten eingehängt sind. Schau da mal nach.
Poste mal die import statements oben im Agenten.

Domino Server und Notes Client haben ein lib/ext Verzeichnis (Such nach ext als Ordner auf der Maschine, auf dem der Agent läuft). Häng die jars aus dem Agenten raus und pack die ins lib/ext. 
Titel: Re: JVMDUMP006I Speicherauszugsereignis "systhrow" wird verarbeitet; Detail "java/la
Beitrag von: Fragensteller am 06.03.12 - 10:21:24
Das Umstellen auf LinkedLists hat es nicht gebracht. Also wieder HashMaps.
Hatte nur gelesen das hashMaps und TreeMaps SpeicherLeaks verursachen können.

Eingebunden hatte ich die AdWords-Google-API.
Habe die nun ausgehängt und ins lib/ext Verzeichnis gepackt. WOW...
Bisher hatte ich wenn ich gestartet hatte mit runtime.freeMemory() beim ersten start 17 MB undbeim zweiten 3 MB.
Beim dritten Start kamm dann outofmemory.

Jetzt habe ich konztant 55,7 MB.

Leider bekomme ich jetzt noch einen Fehler.
Wenn ich das richtig verstehe, dann findet er die ausgehängte und ins ext kopierte Jar Datei nicht.
(http://img441.imageshack.us/img441/2113/greenshot20120306101725.jpg)
Muß ich hier noch etwas beachten?

Exception in thread "AgentThread: xx.xxxx.adwords.Run"
06.03.2012 10:01:44   Agent  error: java.lang.NoClassDefFoundError: com.google.api.adwords.v201109.cm.ReportDefinitionReportType
06.03.2012 10:01:44   Agent  error:  at xx.xxxx.adwords.Run.NotesMain(Run.java:120)
06.03.2012 10:01:44   Agent  error:  at lotus.domino.AgentBase.runNotes(Unknown Source)
06.03.2012 10:01:44   Agent  error:  at lotus.domino.NotesThread.run(Unknown Source)
06.03.2012 10:01:44   Agent  error: Caused by:
06.03.2012 10:01:44   Agent  error: java.lang.ClassNotFoundException: com.google.api.adwords.v201109.cm.ReportDefinitionReportType
06.03.2012 10:01:44   Agent  error:  at lotus.domino.AgentLoader.loadClass(Unknown Source)
06.03.2012 10:01:44   Agent  error:  at java.lang.ClassLoader.loadClass(ClassLoader.java:618)
Titel: Re: JVMDUMP006I Speicherauszugsereignis "systhrow" wird verarbeitet; Detail "java/la
Beitrag von: Fragensteller am 06.03.12 - 11:22:34
So hat geklappt. Ich musste den Server neu starten.
Bau das ding nun mal zuende und gebe Rückmeldung wegen dem Leak.

Danke nochmals
Titel: Re: JVMDUMP006I Speicherauszugsereignis "systhrow" wird verarbeitet; Detail "java/la
Beitrag von: flaite am 07.03.12 - 17:27:45
Hallo Fragensteller,

wie lautet die Rückmeldung?
Eins hab ich hier jedenfalls gelernt.

Erscheint dieses Muster
Zitat
lotus.domino.AgentLoader @ 0x7fff6ecd840
java.util.Hashtable$Entry[]
von dem Tool, gibt es ein Problem mit dem ClassLoader, der völlig in Verantwortung von IBM liegt.
Classloader speichern die Klassen in Hashtables. Vermutlich funktioniert der check nicht, dass eine Klasse bereits geladen ist. Die Hashtable wird immer größer und füllt irgendwann den gesamten für die VM vorgesehenen Speicherraum aus.

Ein Programmierer von Business Logik sollte sich mit diesem Thema überhaupt nicht auseinanderzusetzen. Mir ist auch keine andere Java-basierte Plattform bekannt, in der ein nicht funktionierender Class Loader zu ähnlichen Problemen führt.

Gruß Axel    
Titel: Re: JVMDUMP006I Speicherauszugsereignis "systhrow" wird verarbeitet; Detail "java/la
Beitrag von: Fragensteller am 07.03.12 - 17:32:20
Hallo

ja seit ich die Klasse bzw Bibliothek ausgelagert habe ist alles stabil.
Titel: Re: JVMDUMP006I Speicherauszugsereignis "systhrow" wird verarbeitet; Detail "java/la
Beitrag von: Ralf_M_Petter am 07.03.12 - 17:47:11
Das erschreckende ist, dass dieser Fehler schon seit Urzeiten bekannt ist, aber nie behoben wird. Wahrscheinlich auch deshalb weil niemand einen PMR zu diesem Problem aufmacht.

Grüße

Ralf
Titel: Re: JVMDUMP006I Speicherauszugsereignis "systhrow" wird verarbeitet; Detail "java/la
Beitrag von: flaite am 07.03.12 - 23:45:37
Tja Ralf, und die Überzeugung, dass sich PMRs ausgehen, scheint positiv mit einer hohen Anzahl von Vorfahren in der K.u.K Monarchie korreliert zu sein. In mir ranzt innerlich etwas los, wenn ich das Wort höre.  ;D
Titel: Re: JVMDUMP006I Speicherauszugsereignis "systhrow" wird verarbeitet; Detail "java/la
Beitrag von: m3 am 08.03.12 - 09:00:49
Dann ohne "PMR" formuliert: Wie soll IBM das Problem fixen, wenn niemand einen Bugreport erstellt?
Titel: Re: JVMDUMP006I Speicherauszugsereignis "systhrow" wird verarbeitet; Detail "java/la
Beitrag von: thkn777 am 24.04.12 - 11:19:21
Dann ohne "PMR" formuliert: Wie soll IBM das Problem fixen, wenn niemand einen Bugreport erstellt?

Guten Morgen,
die hier angesprochenen Probleme kommen mir doch recht bekannt vor und während ich meist stummer Mitleser bin und mich über die vielen Anregungen hier im Forum freue, möchte ich doch kurz auf Deine obige Antwort eingehen.

Eine kleine Geschichte:
Es war einmal ein Domino Cluster R7.03, auf dem ein Java Agent in mehreren unterschiedlichen DB's jahrelang seinen Dienst tat. Völlig unauffällig, stabil und betreuungsfreundlich.
Dann kam das Serverupdate (852FP1) und die JVM Dumps. Nach etwas selber Rumprobieren dann der erste PMR (40456), der nach längerem Hin- und her zu SPR # MCOA8C7CNX führte und uns einen Hotfix brachte, der das Problem (scheinbar) löste. Mit R853 sei das Problem dann sowieso endgültig aus der Welt... so ging die Mär.
R852FP3 kam und die JVM Dumps kehrten wieder. Der nächste PMR (40822) brachte keine Hotfixes, sondern ein Vertrösten auf R853. Dort sei alles gut... wirklich.
R853 kam und die JVM Dumps waren schlimmer denn je. Der aktuelle PMR (41089) ist seit 222 Tagen offen und ungelöst.

Im Verlaufe der Konversation mit BigBlue hat man uns auch geraten, die im Projekt enthaltenen JAR's extern abzulegen im /jvm/lib/ext Verzeichnis und ja... das brachte was. Aber: wir wollen das nicht. Das Einbetten von JAR's in eine NotesDB ist eine von IBM angebotene Funktion und die soll bitteschönn auch richtig funktionieren. Hat ja auch alles prima geklappt in R7, warum nicht in R85?

/OT Ja, ich bin ein bischen stur.  ::) /OT

Soooo.... jetzt noch ein paar Ergänzungen zum Thread selbst.
- Neben den LND (Lotus Notes Diagnostic Tools) zur Analyse von NSD Files gibts auch noch ISA (IBM Support Assistant), eine Art Framework zur Fehleranalyse von IBM Produkten. Im ISA kann man ein paar nette Analyse-Module zum Thema Java Dump Analyse runterladen und nutzen.
- Bei uns war es so, daß neben java/lang/ClassLoader auch noch java/security/Policy Unmengen java/util/Hashtable$Entry, byte[] und ein paar java/util/HashMap$Entry gefressen haben
- was passiert, wenn man JAR's in's /jvm/lib/ext legt? Üblicherweise steht im \jvm\lib\security\java.policy File folgendes:

Code
// Standard extensions get all permissions by default

grant codeBase "file:${java.home}/lib/ext/*" {
	permission java.security.AllPermission;
};

--> Jetzt noch 1 und 1 zusammenzählen: soso... wenn ich die JAR's also raus aus der NSF nehme und die Security abschalte, dann läuft plötzlich alles, ja? Das Thema habe ich beim freundlichen Herrn aus Irland auch mal angesprochen, Ergebnis: ich war wieder mal viel zu mißtrauisch und auf der völlig falschen Fährte, das hat alles gar nichts zu bedeuten.  :-:

Wie geht's weiter?
- recycle etc. haben wir alles schon durch
- im Moment stürzen wir uns auf Driver de-registration, was vielleicht auch ganz gut hier (http://atnotes.de/index.php/topic,53506.0.html) reinpaßt, allerdings hat der Thread schon ein paar Tage auf dem Buckel. Wenn's Euch interessiert, kann ich dazu ja nochmal was schreiben.

Meine persönliche Spielwiese im Moment:
Ich bin darüber gestolpert, daß sich der Notes 8.53 Entwickler Client projektbezogen und teilweise scriptbezogen die Java Compiler Settings merkt. ( :-[ Jaja... jetzt, wo ich weiß, wonach ich suche, findet auch Frau g**gle was dazu *hust* ) Auch wenn das für alle Beteiligten hier ein alter Hut ist... mir war nicht klar, daß ich nicht einfach den Agent im 8ter Developer Client neu übersetzen kann und er dann auch mit JDK 1.6 Konformität läuft. Ich habe mir also gerade in den Kopf gesetzt, das mal ein wenig zu testen, ggf. kommt ja die R85 JVM einfach nicht so richtig mit dem alten JDK 1.3/4 Zeugs klar?

Tja, soviel dazu... ich stapf dann mal zurück an die Arbeit und kann wenn Ihr mögt, gerne mal ein Update zum aktuell offenen PMR geben ;)

Th.
Titel: Re: JVMDUMP006I Speicherauszugsereignis "systhrow" wird verarbeitet; Detail "java/la
Beitrag von: flaite am 24.04.12 - 14:24:48

Im Verlaufe der Konversation mit BigBlue hat man uns auch geraten, die im Projekt enthaltenen JAR's extern abzulegen im /jvm/lib/ext Verzeichnis und ja... das brachte was. Aber: wir wollen das nicht. Das Einbetten von JAR's in eine NotesDB ist eine von IBM angebotene Funktion und die soll bitteschönn auch richtig funktionieren. Hat ja auch alles prima geklappt in R7, warum nicht in R85?

/OT Ja, ich bin ein bischen stur.  ::) /OT

Kann ich überhaupt nicht nachvollziehen.
IT Systeme sollen die Geschäftsprozesse eines Unternehmens unterstützen.
Für dieses Ziel sollten die Anwendungen möglichst störungsfrei laufen.
Ende. Aus.
Mickey Maus.

Soooo.... jetzt noch ein paar Ergänzungen zum Thread selbst.
- Neben den LND (Lotus Notes Diagnostic Tools) zur Analyse von NSD Files gibts auch noch ISA (IBM Support Assistant), eine Art Framework zur Fehleranalyse von IBM Produkten. Im ISA kann man ein paar nette Analyse-Module zum Thema Java Dump Analyse runterladen und nutzen.
- Bei uns war es so, daß neben java/lang/ClassLoader auch noch java/security/Policy Unmengen java/util/Hashtable$Entry, byte[] und ein paar java/util/HashMap$Entry gefressen haben
- was passiert, wenn man JAR's in's /jvm/lib/ext legt? Üblicherweise steht im \jvm\lib\security\java.policy File folgendes:

Code
// Standard extensions get all permissions by default

grant codeBase "file:${java.home}/lib/ext/*" {
	permission java.security.AllPermission;
};
Wo hast Du denn das her? Der java.security ist es völlig Wumpe, ob die Klassen von einem höheren oder darunterliegenden Classloader geladen werden. 95% aller Java Agenten laufen auf dem Server. Wer benötigt wirklich signierten Code auf Servern, die ohnehin anderweitig abgesichert werden? Ich hab ausser vor ca. 9 Jahren für Applets oder für Swing Anwendungen nie in meinem Leben ein java.policy File angerührt. Man kann das mit einem Häckchen im Agenten selber regeln.
Java Classloader speichern Klassen in Hashtable-Entries und sie laden auch die policy files. Das ist also eine Folge des Classloader Memory Leaks.


--> Jetzt noch 1 und 1 zusammenzählen:
Leider zählst Du 1 und 1 auf Basis von Vorstellungen zusammen, die aus meiner Sicht mit der Realität nichts zu tun haben.
Die Beschäftigung der Grundlagen der JVM Laufzeitumgebung würd vermutlich mehr bringen als ein pseudo-intelektuelles Getüftel mit IBM Tools, deren output Du aus meiner Sicht nicht wirklich analysieren kannst.

UND JA. Wenn ich so einen Magischen Realismus lese, werde ich sauer.
Titel: Re: JVMDUMP006I Speicherauszugsereignis "systhrow" wird verarbeitet; Detail "java/la
Beitrag von: pedsola am 24.04.12 - 16:03:52
So hat geklappt. Ich musste den Server neu starten.

ein bisschen spät und hat mit der letzten Diskussion nicht viel zu tun aber vielleicht hilfreich für den ein oder anderen.
Amgr restart reicht aus, um die JARs im ext-Verzeichnis neu einzulesen.
Titel: Re: JVMDUMP006I Speicherauszugsereignis "systhrow" wird verarbeitet; Detail "java/la
Beitrag von: thkn777 am 25.04.12 - 10:22:14
UND JA. Wenn ich so einen Magischen Realismus lese, werde ich sauer.

Das möchte ich auf keinen Fall! Ich fasse daher meinen ersten Beitrag wie folgt zusammen und halte mich dabei streng an die Tatsachen:

Wir haben zu diesem Thema bei IBM mehrere PMR's eröffnet. Bisher haben wir unsere Probleme dadurch nicht nachvollziehbar erkären und lösen können.

Th.
Titel: Re: JVMDUMP006I Speicherauszugsereignis "systhrow" wird verarbeitet; Detail "java/la
Beitrag von: Ralf_M_Petter am 25.04.12 - 10:34:51
Hallo Th.

Lass dich von Axel (aka Pitiyankee) nicht verunsichern. Er liefert oft sehr wertvolle Inputes zu Problemen, aber ab und zu versteht man entweder nicht was er meint, bzw. benutzt er einen Thread einfach mal zu Dampf ablassen. Also einfach seine Postings mit Gelassenheit lesen, nicht persönlich nehmen und einen Nutzen aus seiner großen Erfahrung im Bereich verteilte Systeme Frameworks, Südamerika ;-) usw. ziehen.

Grüße

Ralf
Titel: Re: JVMDUMP006I Speicherauszugsereignis "systhrow" wird verarbeitet; Detail "java/la
Beitrag von: thkn777 am 25.04.12 - 16:18:47
Hallo Th.

Lass dich von Axel (aka Pitiyankee) nicht verunsichern. Er liefert oft sehr wertvolle Inputes zu Problemen, aber ab und zu versteht man entweder nicht was er meint, bzw. benutzt er einen Thread einfach mal zu Dampf ablassen. Also einfach seine Postings mit Gelassenheit lesen, nicht persönlich nehmen und einen Nutzen aus seiner großen Erfahrung im Bereich verteilte Systeme Frameworks, Südamerika ;-) usw. ziehen.

Grüße

Ralf


Gruß zurück
und danke für die Aufmunterung. Ich bin ganz ruhig und bringe jede Menge Geduld und freundliche Gesichter hierher mit in's Forum. Ich hab' um die eigentliche Kerninformation (ja, IBM hat zu dem Thema PMR's) einfach noch was drumrumgeschrieben, um quasi mal auf den Busch zu klopfen.

Eine mögliche Lösung für mein Problem ist ja vielleicht noch RITA (siehe http://www.rfc-editor.org/rfc/rfc2321.txt )...hm.  ;)

Ich wünsche allen einen entspannten Restarbeitstag und danach einen hoffentlich erholsamen Feierabend.

Th.
Titel: Re: JVMDUMP006I Speicherauszugsereignis "systhrow" wird verarbeitet; Detail "java/la
Beitrag von: flaite am 25.04.12 - 17:22:36
Pfff. Man muß mir ja nicht antworten.  :)
Ich will keinen "Dampf ablassen". Ich will diskutieren.

Erklär mir bitte einmal diese Aussage. Ich verstehe sie nicht.
Zitat
- was passiert, wenn man JAR's in's /jvm/lib/ext legt? Üblicherweise steht im \jvm\lib\security\java.policy File folgendes:

Code:

// Standard extensions get all permissions by default

grant codeBase "file:${java.home}/lib/ext/*" {
   permission java.security.AllPermission;
};

Das ist afaik schlicht und einfach nicht wahr. Das eine hat mit dem anderen nichts zu tun.

Und deine ISA-Analyse
Zitat
Im ISA kann man ein paar nette Analyse-Module zum Thema Java Dump Analyse runterladen und nutzen.
- Bei uns war es so, daß neben java/lang/ClassLoader auch noch java/security/Policy Unmengen java/util/Hashtable$Entry, byte[] und ein paar java/util/HashMap$Entry gefressen haben

zeigt eigentlich nix anders, als dass eben der CLASSLOADER von attachten Code in den Agenten ein Memory Leak hat. Und zwar übrigens seit mindestens 7 und vermutlich seit 12 Jahren. Warum sollten sie das in überschaubarer Zeit jetzt fixen, wenn Du einen weiteren PMR aufmachst?

PMRs besitzen reinen Vorschlag-Charakter. IBM hat sich nirgendwo commited, wie sie auf einen PMR reagieren.
Und ja. Genau da ist ein emotionaler Punkt in mir. Ich erleb auf Java-Plattformen seit Jahren immer wieder, dass Entscheider frustrierende Fehl-Investitionen fällen, weil sie nämlich der Marke IBM zu blind vertrauen. Damit sag ich nicht, dass jedes IBM Produkt fehl am Platz ist. Oft werden sie aber an einen Platz gestellt, an dem sie nicht hingehören. Und mit den PMRs ist das ähnlich. Der Marke wird halt vertraut. Soweit zumindest meine Perzeption.
Du kritisierst zwar IBM, besitzt aber einen für mich ganz ernsthaft schockierend festen Glauben in dieses PMR Ding an sich.

Das war oben echt ein wenig schroff, deshalb zorry. Manchmal agier ich hier aus Gewohnheit schräg, was irgendwie auch nicht ganz töff ist.

ICH RATE DRINGEND, EINFACH MAL DIE JARs TESTWEISE INS LIB-EXT ZU LEGEN. Du brauchst auch keine policy-files zu editieren. 





Titel: Re: JVMDUMP006I Speicherauszugsereignis "systhrow" wird verarbeitet; Detail "java/la
Beitrag von: thkn777 am 07.05.12 - 14:25:05
Pfff. Man muß mir ja nicht antworten.  :)
Ich will keinen "Dampf ablassen". Ich will diskutieren.

Erklär mir bitte einmal diese Aussage. Ich verstehe sie nicht.
Zitat
- was passiert, wenn man JAR's in's /jvm/lib/ext legt? Üblicherweise steht im \jvm\lib\security\java.policy File folgendes:

Code:

// Standard extensions get all permissions by default

grant codeBase "file:${java.home}/lib/ext/*" {
   permission java.security.AllPermission;
};

Das ist afaik schlicht und einfach nicht wahr. Das eine hat mit dem anderen nichts zu tun.

Moin moin,
also erstmal vorneweg: ich will nicht wieder "an-ecken", ok? Also bitte nicht gleich explodieren, wenn ich jetzt frage: "warum nicht?". Hilf mir doch hier bitte mal über den Berg, vielleicht habe ich mich ja völlig in die falsche Ecke verirrt. Eine einfache und nachvollziehbare Erklärung konnte mir bisher niemand geben  :(  .

Der Reihe nach:

1. Laut IBM wird die Funktion, JAR's in der NSF zu halten, unterstützt. Ich habe im Rahmen der PMR-Bearbeitung den in der DB verwendeten Java-Agenten beschrieben und bekam als Antwort sinngemäß zurück: Ja, müßte alles so gehen.

2. Unsere java.policy Datei sieht tatsächlich so aus. Und zwar überall. Vielleicht ist unser Installations-Package das Einzige auf der Welt, bei dem das so ist... schon möglich. Wie SOLLTE die Datei denn aussehen? Hat Deine java.policy Datei auf den Domino Servern diesen Eintrag nicht?

3. Wenn JAR's in der NSF liegen, müssen diese für die JVM vor dem Verarbeiten erst im Filesystem abgelegt werden, richtig? Als temporäre Datei? Oder wird die Ressource zur JVM quasi "gestreamt"?

3.1. Bei diesem Vorgang kann jetzt etwas schiefgehen, das habe ich schon verstanden. Einigen Foren-Posts zufolge kann ein stark belasteter Domino Server z.B. beim detachen in ein Timeout laufen. Da ich mein Problem auf einem Testserver, auf dem ausschließlich dieser eine Agent läuft, nachvollziehen kann, schließe ich sowas schonmal aus.

Bleibt die Frage, WAS geht da schief? Eine Dateiressource aus einer NSF in's Dateisystem schreiben... daß das technisch geht, habe ich erst einmal vorausgesetzt.

4. Im Notes Log steht "... JVMDUMP006I Speicherauszugsereignis "systhrow", Detail "java/lang/OutOfMemoryError" wird verarbeitet", also habe ich erst einmal in dieser Richtung weitergemacht und versucht, etwas mit den Dumps anzufangen.

5. Vielleicht kann ich die Aussagen der Analyse-Tools im IBM Support Assistant ja nicht richtig interpretieren. Da mir die IBM Experten bisher nicht helfen konnten, habe ich es trotzdem mal versucht, mich mit dem Thema zu beschäftigen. Wenn ich die Memory Dump Diagnostics über ein *.phd File laufen lasse, dann tauchen dort als "Verlustkandidaten" auch immer wieder "java/Security/..." Einträge auf.

An dieser Stelle habe ich mich gefragt, was genau passiert, wenn ein JAR aus einer NSF extrahiert wird. Weißt Du es? Wird die JAR-Datei tatsächlich in's Filesystem geschrieben? Wenn ja - in welches Verzeichnis? Was passiert dabei noch? Muß etwas beachtet werden, damit alles funktioniert? Wenn ja - was?

Jetzt die Spekulation (nochmal: bitte nicht gleich explodieren, ich laß' es mir gern erklären):
- wenn ein Prozeß auf eine Ressource nicht zugreifen kann, dann kann das unterschiedliche Ursachen haben: Variante1 - Ressource nicht da. Variante 2 - keine ausreichenden Rechte. Variante 3 - ein anderes technisches Problem.
- Variante 1 habe ich ausgeschlossen, da die JAR Files in der NSF sind und sich manuell auch detachen lassen.
- Für Variante 3 habe ich erst einmal keine weiteren Indizien.
- Bleibt Variante 2 - Rechteprobleme. Hm.
- was, wenn der AgentLoader ein Rechteproblem mit den JAR's hat? Im weitesten Sinne? Die aufrufende Methode, bei der etwas schiefgeht, könnte dann "explodeArchive" und "addAttachment" sein (wenn man dem Notes Log glauben darf), die URSACHE liegt vielleicht davor?
- Bsp. (Achtung: reines Gedankenexperiment!!!): die JAR's werden in /jvm/lib/temp geschrieben, auf dieses Verzeichnis hat der AgentLoader warum-auch-immer nicht die richtigen Rechte... Ergebnis: Fehler. Irgendetwas in der Art?

Die Db ist komplett durchsigniert, d.h. die Domino Gestaltungselemente sind es. Aber Ressourcen, wie z.B. JAR-Files? Wie soll ich die aus Notes heraus signieren? Außerdem hat die Notes Signatur mit Java-Security wenig zu tun (glaube ich zu wissen) - es sei denn, IBM hat da was eigenes in die JVM eingebaut.

Ich habe bisher keine schlüssige Erklärung für meine Fragen gefunden, daher - da hast Du völlig Recht - ist das reine Spekulation. Ich hoffe, daß ich zumindest erklären konnte, wo mein Verständnisproblem liegt und wie ich auf die Security-Schiene gekommen bin. Ist vielleicht ein Holzweg - ok. Mir wäre es sehr lieb, wenn ich das Problem abhaken könnte, möchte es vorher aber bitte verstehen.

Zum Thema PMR und IBM: Wenn es ein bekanntes(!) Problem mit dem Agentloader gibt, sollen die IBM-Leute es einfach offiziell sagen und (1) einen Workaround anbieten und (2) einen Termin/eine Version benennen, wo der Prozeß (wieder) funktioniert. Was ist daran so schlimm? Ich habe schon mit vielen IT-Firmen zu tun gehabt - immer gab es irgendwelche Probleme. IBM ist da keine Ausnahme und ich vertraue auf IBM-Lösungen auch erst dann, wenn ich sehe, daß alles funktioniert - und nicht auf das bloße Wort hin. Gerade bei PMR's habe ich den Eindruck, das meiste alleine machen zu müssen und die IBM-Supporter mit Ideen und Lösungsvorschlägen unterstützen zu müssen... vielleicht kommt daher auch mein Antrieb in diesem Fall, selbst noch etwas nachzuforschen.

So... ich hoffe, wir können aus meiner holprigen Vorlage jetzt noch was Sinnvolles machen  ::) ;)
Titel: Re: JVMDUMP006I Speicherauszugsereignis "systhrow" wird verarbeitet; Detail "java/la
Beitrag von: flaite am 14.05.12 - 12:03:02
1. Laut IBM wird die Funktion, JAR's in der NSF zu halten, unterstützt. Ich habe im Rahmen der PMR-Bearbeitung den in der DB verwendeten Java-Agenten beschrieben und bekam als Antwort sinngemäß zurück: Ja, müßte alles so gehen.
Es gibt Aussagen eines hohen deutschsprachigen Lotus/IBM Managers von IBM Asia, dass der Classloader Mechanismus für jars als Attachments von Agenten fundamental broken ist.
Und zwar genau in den Kommentaren dieses Threads http://www.codestore.net/store.nsf/unid/BLOG-20120103-0527?OpenDocument#DOC_9C21B168 diese Aussage.
Zitat
What I found in agents: if you have external jars and the agent runs multiple times it starts bleeding memory since a new classloader is instantiated every time.

2. Unsere java.policy Datei sieht tatsächlich so aus. Und zwar überall. Vielleicht ist unser Installations-Package das Einzige auf der Welt, bei dem das so ist... schon möglich. Wie SOLLTE die Datei denn aussehen? Hat Deine java.policy Datei auf den Domino Servern diesen Eintrag nicht?
Du brauchst die java.policy Datei nicht ändern. Auf der ersten Seite des Agenten gibts ein Häckchen, dass Du setzen mußt. Wenn eure java.policy Dateien wirklich überall so aussehen, könnt ihr eure Sicherheit dadurch optimieren, dass ihr sie wieder auf den Ausgangszustand setzt.
3. Wenn JAR's in der NSF liegen, müssen diese für die JVM vor dem Verarbeiten erst im Filesystem abgelegt werden, richtig? Als temporäre Datei? Oder wird die Ressource zur JVM quasi "gestreamt"?
Solche Details haben mich nie interessiert. Mir reicht die Aussage eines hohen Lotus@IBM Managers, dass der Classloader der attachten jars als solcher zu memory leaks führen.
3.1. Bei diesem Vorgang kann jetzt etwas schiefgehen, das habe ich schon verstanden. Einigen Foren-Posts zufolge kann ein stark belasteter Domino Server z.B. beim detachen in ein Timeout laufen. Da ich mein Problem auf einem Testserver, auf dem ausschließlich dieser eine Agent läuft, nachvollziehen kann, schließe ich sowas schonmal aus.
Hat nix mit der Belastung des Servers zu tun. Aus irgendwelchen Gründen cached der Classloader die bereits geladenen Klassen nicht und läd sie immer neu. Dieses Verhalten läßt sich reproduzieren.
Bleibt die Frage, WAS geht da schief? Eine Dateiressource aus einer NSF in's Dateisystem schreiben... daß das technisch geht, habe ich erst einmal vorausgesetzt.
Ich kenne den internen Prozess des Classloading über die attachten jars im Agenten nicht.
Nimm das jetzt nicht persönlich, aber ich bin nun mal bei der Frage der übereifrigen Schlußfolgerungen bei unvollständigen Informationen stärker sensibilisiert als der Durchschnitt:
Ohne den entsprechenden Source Code, der weder Dir noch mir zur Verfügung steht, befinden sich Spekulationen über Details des Prozesses aus einer wissenschafts-artigen Perspektive letztlich auf dem gleichen Niveau wie die Frage, ob diese Marienerscheinungen (http://de.wikipedia.org/wiki/Marienerscheinung) in der Realität oder der Einbildung der Beteiligten stattgefunden hat.
4. Im Notes Log steht "... JVMDUMP006I Speicherauszugsereignis "systhrow", Detail "java/lang/OutOfMemoryError" wird verarbeitet", also habe ich erst einmal in dieser Richtung weitergemacht und versucht, etwas mit den Dumps anzufangen.
... und ich hab Dich darauf aufmerksam gemacht, dass Hashtable und java.policy Einträge in dem Kontext eines kaputten Classloaders völlig erwartbar sind...
Zitat
Java Classloader speichern Klassen in Hashtable-Entries und sie laden auch die policy files.
5. Vielleicht kann ich die Aussagen der Analyse-Tools im IBM Support Assistant ja nicht richtig interpretieren. Da mir die IBM Experten bisher nicht helfen konnten, habe ich es trotzdem mal versucht, mich mit dem Thema zu beschäftigen. Wenn ich die Memory Dump Diagnostics über ein *.phd File laufen lasse, dann tauchen dort als "Verlustkandidaten" auch immer wieder "java/Security/..." Einträge auf.
... und daraus schließt Du, dass das Auslagern von jar Files auf Platte "unsicher" wär?. Ein wirklich interessanter Schluß.

An dieser Stelle habe ich mich gefragt, was genau passiert, wenn ein JAR aus einer NSF extrahiert wird. Weißt Du es? Wird die JAR-Datei tatsächlich in's Filesystem geschrieben? Wenn ja - in welches Verzeichnis? Was passiert dabei noch? Muß etwas beachtet werden, damit alles funktioniert? Wenn ja - was?
Es interessiert mich überhaupt nicht. Ich find auch das re-engineeren von closed source Prozessen, die ein hoher IBM Manager von Lotus@IBM als broken darstellt, als einen sehr fragwürdigen Zeitvertreib.

Jetzt die Spekulation (nochmal: bitte nicht gleich explodieren, ich laß' es mir gern erklären):
- wenn ein Prozeß auf eine Ressource nicht zugreifen kann, dann kann das unterschiedliche Ursachen haben: Variante1 - Ressource nicht da. Variante 2 - keine ausreichenden Rechte. Variante 3 - ein anderes technisches Problem.
- Variante 1 habe ich ausgeschlossen, da die JAR Files in der NSF sind und sich manuell auch detachen lassen.
- Für Variante 3 habe ich erst einmal keine weiteren Indizien.
- Bleibt Variante 2 - Rechteprobleme. Hm.
- was, wenn der AgentLoader ein Rechteproblem mit den JAR's hat? Im weitesten Sinne? Die aufrufende Methode, bei der etwas schiefgeht, könnte dann "explodeArchive" und "addAttachment" sein (wenn man dem Notes Log glauben darf), die URSACHE liegt vielleicht davor?
- Bsp. (Achtung: reines Gedankenexperiment!!!): die JAR's werden in /jvm/lib/temp geschrieben, auf dieses Verzeichnis hat der AgentLoader warum-auch-immer nicht die richtigen Rechte... Ergebnis: Fehler. Irgendetwas in der Art?
Ich stelle eine ganz andere Frage: Das Memory-Leak kommt dadurch zustande, dass der Classloader den Bytecode der entsprechenden Klassen immer neu läd, obwohl er sie bereits im Speicher hat. Das führt irgendwann zur Out of Memory Exception. Das hat nix mit dem Zugriff auf die Ressourcen zu tun. Der ist immer vorhanden.

Die Db ist komplett durchsigniert, d.h. die Domino Gestaltungselemente sind es. Aber Ressourcen, wie z.B. JAR-Files? Wie soll ich die aus Notes heraus signieren? Außerdem hat die Notes Signatur mit Java-Security wenig zu tun (glaube ich zu wissen) - es sei denn, IBM hat da was eigenes in die JVM eingebaut.
Kein IT-System ist völlig sicher. In Lotus hats über die letzten 10 Jahre z.T. heftige Security Leaks gegeben.
Ist signierter Code wirklich kriegs-entscheidend? Ich vermute etwa sehr stark, dass in der E-Banking meiner Bank nix signiert wird. Die sichern einfach den Produktionsserver entsprechend ab, dass dem niemand veränderten Code unterschiebt. Die beiden dominierenden Systeme im Enterprise Umfeld (JEE und .NET) kennen dieses Feature meines Wissens nicht. Damit halte ich es für eine ziemlich steile These, Signieren von Code als notwendige Bedingung für eine hinreichend sichere IT-Infrastruktur zu erklären.
JavaSpaces und JINI kannten signierten Code. Das konnte sich aber - ausser in Nischen - nie wirklich durchsetzen ... und dort auch nicht wegen dem Signier-Feature sondern aus anderen Gründen.

Zum Thema PMR und IBM: Wenn es ein bekanntes(!) Problem mit dem Agentloader gibt, sollen die IBM-Leute es einfach offiziell sagen und (1) einen Workaround anbieten und (2) einen Termin/eine Version benennen, wo der Prozeß (wieder) funktioniert. Was ist daran so schlimm?
Daran ist nix schlimm, es wäre sogar sehr schön. IBM agiert aber einfach nicht so. Die Anreizstrukturen der Entscheider bei IBM als börsennotierter, global agierender Konzern legen zunächst einmal die Vermutung nahe, dass solche arbeits-ethischen Fragen eine höchst untergeordnete oder überhaupt keine Rolle spielen. Hier ein paar interessante Beiträge, inklusive Diskussion.
http://www.cringely.com/tag/ibm/
 
Titel: Re: JVMDUMP006I Speicherauszugsereignis "systhrow" wird verarbeitet; Detail "java/la
Beitrag von: thkn777 am 18.09.12 - 12:14:26
Ohje, jetzt habe ich ein schlechtes Gewissen  :-[

Hier der abschließenden Stand zu diesem Problem von meiner Seite:
- laut IBM-Support sind zwei "Speicherfresser" Mechanismen am Werk: das reine Laden der JAR's und ein zweiter, noch unbekannter Prozeß. So, wie ich den Support verstanden habe, ist es der zweite Prozeß, der das eigentliche Problem darstellt, die Speicherbelastung durch die JAR's ist nur weitaus größer und erscheint deshalb als Nr. 1 Problem in Analysen.
- Ich habe eine Referenz-DB gebaut, in der die Agenten und JAR's etc. enthalten sind, diese ist für weitere Tests laut Support an's QE (Quality Engineering) gegangen
- "offizieller" Workaround (sprich: mit dem Support abgestimmt): JAR's in's jvm/lib/ext schieben  ::) --> ist jetzt umgesetzt und läuft stabil
- für den Fall wurde SPR # BHUY8VML6R generiert und APAR # LO70204. Wenn man im Web danach sucht, kommt man zu http://www-01.ibm.com/support/docview.wss?uid=swg1LO70204 und das läßt mich jetzt nicht darauf hoffen, daß es eine schnelle Lösung gibt.
- von meiner Seite ist damit das Ende der Fahnenstange erreicht, mir gefällt zwar das Ergebnis nicht, aber der Fall ist hinreichend geklärt, die DB's sind arbeitsfähig --> Schluß.

Nochmal ENTSCHULDIGUNG, daß ich erst jetzt den Thread aktualisiere. Erst ist was dazwischengekommen und dann hab' ich es schlichtweg vergessen.

Danke an alle für die Hilfe,
Th.


P.S. @Pitiyankee
Danke für Deinen letzten ausführlichen Beitrag. Die java.policy Datei und ggf. Agenteneinstellungen sehe ich mir nochmal an - es stört mich schon ziemlich, daß jedes Notes Update die java.policy überschreibt... von daher wäre eine DB-spezifische Einstellung deutlich besser und betriebssicherer.
Titel: Re: JVMDUMP006I Speicherauszugsereignis "systhrow" wird verarbeitet; Detail "java/la
Beitrag von: flaite am 18.09.12 - 18:55:04
Vielen Dank für die Rückmeldung.   ;)
Und ernsthaft Entschuldigung für meine ausraster weiter oben. Geht mir oft als Externer so, dass ich zwar ein gutes Einkommen erziele, aber oft mit Vorschlägen aufgrund meiner schwachen Stellung in der Organisation politisch nicht durchkomme.
Ich WUSSTE, dass der Fehler verschwindet, wenn Du die jars ins lib/ext verschiebst. An Dir konnte ich dann meinen Emotionen freien Lauf lassen. Das geht nicht. Aggression hat fast immer seinen Ursprung in Gefühlen wie Verzweifelung und Angst. Bei mir zumindest. Muss das kontrollieren. Auch online.  
 
Zitat
laut IBM-Support sind zwei "Speicherfresser" Mechanismen am Werk: das reine Laden der JAR's und ein zweiter, noch unbekannter Prozeß.
Und in den vielen anderen Projekten seit vielen Jahren, an denen ich beteiligt war oder von denen ich gehört habe, wars dieser "unbekannte" Prozess, der dazu führt, daß man mit Anhängen von jars an den Agenten Speicherleaks hat und mit verlegen der Dateien ins lib/ext plötzlich nicht mehr.
"Unbekannter Prozess" halte ich für einen Euphemismus für "Wir wissen, dass Classloading von attachten jars an Agenten fundamental kaputt ist, können das - aus welchen Gründen auch immer - nicht fixen, wollen das aber auch nicht öffentlich zugeben".   

Ich kenne einen Fall, wo an der java-policy Datei rumschrauben mußten und das ganze war praktisch schon ein verbogener Domino-Server. Wegen irgendwas mit einer eigenen Verschlüsselung der Kommunikation mit symmetrischen Schlüsseln. Ich hab hier kein Notes auf dem Rechner, aber es gibt eine Einstellung auf der ersten Seite der Einstellung von Java Agenten.  

Geh jetzt 2 Runden um den See joggen. Mal schauen, ob ich das heute schaffe...