全て、
Solaris 10 の jrockit 64 ビット JVM (27.3.1) を使用して、WebLogic サーバー 9.2 MP2 で J2EE アプリケーションを実行しています。
use runtime.exec を呼び出して、jfmerge という実行可能ファイルを呼び出して PDF ドキュメントを作成します。
Solaris では、runtime.exec が呼び出されると、重複した JVM が一時的に生成され、jfmerge プロセスが開始されることがわかりました。これは非効率的ですが (私たちの JVM は 5 GB であるため、複製されたシェル JVM も 5 GB です)、主な問題は、アプリケーションでこの機能 (PDF 生成) に大きな負荷がかかると、複製された JVM が時々使用されるという事実にあります。決して出ません。
JVM がハングすると、重複する JVM 全体が 5 GB のプロセス サイズのすべてをディスク スワップに書き込むため、サーバーで大きな問題 (アプリケーションの極端な低速化とユーザー セッションの終了) が発生します。
次のハングしたスレッドは、プロセスが手動で強制終了されるまで、ハングした JVM プロセスと相関していることに注意してください。
"[STUCK] ExecuteThread: '17' for queue: 'weblogic.kernel.Default (self-tuning)'" id=3463 idx=0x158 tid=3460 prio=1 ネイティブで、jrockit/io/FileNativeIO のデーモンが動作しています。 readBytesPinned(Ljava/io/FileDescriptor;[BII)I (ネイティブ メソッド) jrockit/io/FileNativeIO.readBytes(FileNativeIO.java:30) で java/io/FileInputStream.readBytes([BII)I(FileInputStream.java) でjava/io/FileInputStream.read(FileInputStream.java:194) java/lang/UNIXProcess$DeferredCloseInputStream.read(UNIXProcess.java:227) で java/io/BufferedInputStream.fill(BufferedInputStream.java:218) java/io で/BufferedInputStream.read(BufferedInputStream.java:235) ^-- 保持ロック: gov/v3/common/formgeneration/sessionbean/FormsBean で java/io/BufferedInputStream@0xffffffffec6510470[シン ロック]。gov/v3/common/formgeneration/sessionbean/FormsBean.createPDF(FormsBean.java:750) で getProcessStatus(FormsBean.java:809) gov/v3/common/formgeneration/sessionbean/FormsBean.getTemplateDetails(FormsBean.java:450) でgov/v3/common/formgeneration/sessionbean/FormsBean.generateSinglePDF(FormsBean.java:1371) gov/v3/common/formgeneration/sessionbean/FormsBean.generatePDF(FormsBean.java:263) gov/v3/common/formgeneration /sessionbean/FormsBean.endorseDocument(FormsBean.java:2377) at gov/v3/common/formgeneration/sessionbean/Forms_qaco28_EOImpl.endorseDocument(Forms_qaco28_EOImpl.java:214) gov/v3/delegates/common/FormsAndNoticesDelegate.endorseDocument(FormsAndNoticesDelegate.java) :128) gov/v3/actions/common/EndorseDocumentAction.executeRequest(EndorseDocumentAction.java:68) gov/v3/fwk/controller/struts/action/V3CommonDispatchAction.dispatchToExecuteMethod(V3CommonDispatchAction.java:532) at gov/v3/fwk/controller/struts/action/V3CommonDispatchAction.executeBaseAction(V3CommonDispatchAction.java:336) at gov /v3/fwk/controller/struts/action/V3BaseDispatchAction.execute(V3BaseDispatchAction.java:69) at org/apache/struts/action/RequestProcessor.processActionPerform(RequestProcessor.java:484) at gov/v3/fwk/controller/struts /requestprocessor/V3TilesRequestProcessor.processActionPerform(V3TilesRequestProcessor.java:384) org/apache/struts/action/RequestProcessor.process(RequestProcessor.java:274) org/apache/struts/action/ActionServlet.process(ActionServlet.java:1482) ) org/apache/struts/action/ActionServlet.doGet(ActionServlet.java:507) gov/v3/fwk/controller/struts/servlet/V3ControllerServlet.doGet(V3ControllerServlet.java:110) で javax/servlet/http/HttpServlet.service(HttpServlet.java:743) で javax/servlet/http/HttpServlet でweblogic/servlet/internal/StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:227) の .service(HttpServlet.java:856) weblogic/servlet/internal/StubSecurityHelper.invokeServlet(StubSecurityHelper.java:125) の weblogic/servlet/ internal/ServletStubImpl.execute(ServletStubImpl.java:283) で weblogic/servlet/internal/ServletStubImpl.execute(ServletStubImpl.java:175) で weblogic/servlet/internal/WebAppServletContext$ServletInvocationAction.run(WebAppServletContext.java:3231) で weblogic /security/acl/internal/AuthenticatedSubject.doAs(AuthenticatedSubject.java:321) weblogic/security/service/SecurityManager.runAs(SecurityManager.java:121) で weblogic/servlet/internal/WebAppServletContext.securedExecute(WebAppServletContext.java:2002) で weblogic/servlet/internal/WebAppServletContext.execute(WebAppServletContext.java) :1908) weblogic/servlet/internal/ServletRequestImpl.run(ServletRequestImpl.java:1362) で weblogic/work/ExecuteThread.execute(ExecuteThread.java:209) で weblogic/work/ExecuteThread.run(ExecuteThread.java:181) でat jrockit/vm/RNI.c2java(JJJJJ)V(ネイティブ メソッド) -- トレースの終了java:1908) weblogic/servlet/internal/ServletRequestImpl.run(ServletRequestImpl.java:1362) で weblogic/work/ExecuteThread.execute(ExecuteThread.java:209) で weblogic/work/ExecuteThread.run(ExecuteThread.java:181) で) at jrockit/vm/RNI.c2java(JJJJJ)V(ネイティブ メソッド) -- トレースの終了java:1908) weblogic/servlet/internal/ServletRequestImpl.run(ServletRequestImpl.java:1362) で weblogic/work/ExecuteThread.execute(ExecuteThread.java:209) で weblogic/work/ExecuteThread.run(ExecuteThread.java:181) で) at jrockit/vm/RNI.c2java(JJJJJ)V(ネイティブ メソッド) -- トレースの終了
私たちはいくつかのことをしたいと思います:
1.) 単純な jfmerge 実行可能ファイルを実行するときにその機能を必要とせず、大量のオーバーヘッドが発生するため、重複する JVM の生成を防ぎます。
2.) 短期的には、少なくともこの重複した JVM が無期限に処理されるのを防ぎます。