Alle,
Wir führen eine J2EE-Anwendung auf WebLogic Server 9.2 MP2 mit einer jrockit 64-bit JVM (27.3.1) auf Solaris 10 aus.
Wir verwenden runtime.exec, um eine ausführbare Datei namens jfmerge zur Erstellung von PDF-Dokumenten aufzurufen.
Wir haben festgestellt, dass unter Solaris beim Aufruf von runtime.exec vorübergehend eine doppelte JVM erzeugt wird, um den jfmerge-Prozess zu starten. Dies ist zwar ineffizient (unsere JVM ist 5 GB groß, also ist auch die duplizierte Shell-JVM 5 GB groß), aber das Hauptproblem besteht darin, dass die duplizierte JVM manchmal nicht beendet wird, wenn diese Funktion (PDF-Erzeugung) in unserer Anwendung stark belastet wird.
Wenn sich die JVM aufhängt, verursachen die Server große Probleme (extreme Verlangsamung der Anwendung und Beendigung von Benutzersitzungen), da die gesamte doppelte JVM ihre gesamte Prozessgröße von 5 GB in den Festplatten-Swap geschrieben bekommt.
Wir haben den folgenden hängenden Thread festgestellt, der mit einem hängenden JVM-Prozess korreliert, bis der Prozess manuell beendet wird:
"[STUCK] ExecuteThread: '17' für Warteschlange: 'weblogic.kernel.Default (self-tuning)'" id=3463 idx=0x158 tid=3460 prio=1 lebendig, in native, Daemon bei jrockit/io/FileNativeIO.readBytesPinned(Ljava/io/FileDescriptor;[BII)I(Native Methode) bei jrockit/io/FileNativeIO.readBytes(FileNativeIO.java:30) at java/io/FileInputStream.readBytes([BII)I(FileInputStream.java) bei java/io/FileInputStream.read(FileInputStream.java:194) bei java/lang/UNIXProcess$DeferredCloseInputStream.read(UNIXProcess.java:227) bei java/io/GepufferterEingabestrom.fill(GepufferterEingabestrom.java:218) bei java/io/GepufferterEingabestrom.read(GepufferterEingabestrom.java:235) ^-- Sperre halten: java/io/BufferedInputStream@0xfffffffec6510470[thin lock] bei gov/v3/common/formgeneration/sessionbean/FormsBean.getProcessStatus(FormsBean.java:809) bei gov/v3/common/formgeneration/sessionbean/FormsBean.createPDF(FormsBean.java:750) bei gov/v3/common/formgeneration/sessionbean/FormsBean.getTemplateDetails(FormsBean.java:450) bei gov/v3/common/formgeneration/sessionbean/FormsBean.generateSinglePDF(FormsBean.java:1371) bei gov/v3/common/formgeneration/sessionbean/FormsBean.generatePDF(FormsBean.java:263) bei gov/v3/common/formgeneration/sessionbean/FormsBean.endorseDocument(FormsBean.java:2377) bei gov/v3/common/formgeneration/sessionbean/Forms_qaco28_EOImpl.endorseDocument(Forms_qaco28_EOImpl.java:214) bei gov/v3/delegates/common/FormsAndNoticesDelegate.endorseDocument(FormsAndNoticesDelegate.java:128) bei gov/v3/actions/common/EndorseDocumentAction.executeRequest(EndorseDocumentAction.java:68) bei gov/v3/fwk/controller/struts/action/V3CommonDispatchAction.dispatchToExecuteMethod(V3CommonDispatchAction.java:532) bei gov/v3/fwk/controller/struts/action/V3CommonDispatchAction.executeBaseAction(V3CommonDispatchAction.java:336) bei gov/v3/fwk/controller/struts/action/V3BaseDispatchAction.execute(V3BaseDispatchAction.java:69) bei org/apache/struts/action/RequestProcessor.processActionPerform(RequestProcessor.java:484) bei gov/v3/fwk/controller/struts/requestprocessor/V3TilesRequestProcessor.processActionPerform(V3TilesRequestProcessor.java:384) bei org/apache/struts/action/RequestProcessor.process(RequestProcessor.java:274) bei org/apache/struts/action/ActionServlet.process(ActionServlet.java:1482) at org/apache/struts/action/ActionServlet.doGet(ActionServlet.java:507) bei gov/v3/fwk/controller/struts/servlet/V3ControllerServlet.doGet(V3ControllerServlet.java:110) at javax/servlet/http/HttpServlet.service(HttpServlet.java:743) bei javax/servlet/http/HttpServlet.service(HttpServlet.java:856) bei weblogic/servlet/internal/StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:227) bei weblogic/servlet/internal/StubSecurityHelper.invokeServlet(StubSecurityHelper.java:125) bei weblogic/servlet/internal/ServletStubImpl.execute(ServletStubImpl.java:283) bei weblogic/servlet/internal/ServletStubImpl.execute(ServletStubImpl.java:175) bei weblogic/servlet/internal/WebAppServletContext$ServletInvocationAction.run(WebAppServletContext.java:3231) bei weblogic/security/acl/internal/AuthenticatedSubject.doAs(AuthenticatedSubject.java:321) bei weblogic/security/service/SecurityManager.runAs(SecurityManager.java:121) bei weblogic/servlet/internal/WebAppServletContext.securedExecute(WebAppServletContext.java:2002) bei weblogic/servlet/internal/WebAppServletContext.execute(WebAppServletContext.java:1908) bei weblogic/servlet/internal/ServletRequestImpl.run(ServletRequestImpl.java:1362) bei weblogic/work/ExecuteThread.execute(ExecuteThread.java:209) bei weblogic/work/ExecuteThread.run(ExecuteThread.java:181) bei jrockit/vm/RNI.c2java(JJJJJ)V(Native Methode) -- Ende der Aufzeichnung
Wir würden gerne ein paar Dinge tun:
1.) Verhindern Sie die Erzeugung einer doppelten JVM, da wir keine ihrer Funktionen benötigen, wenn wir das einfache jfmerge-Executable ausführen, und das erzeugt massiven Overhead.
2.) Kurzfristig sollte zumindest verhindert werden, dass diese doppelte JVM auf unbestimmte Zeit weiterläuft.