5.3.3 IBM J9 JVM internal implementation
The implementation of the IBM J9 Java Virtual Machine is like any other virtual machine for a modern operating system. It consists of a set of executables, a set of native shared objects that provide most of the implementation at runtime, and a set of Java code to map the provided standard Java classes and interfaces to the underlying Java virtual machine code.
Thus, the JVM consists of C/C++ code (most commonly) and Java code that communicates with it. In the JVM Java code, the implementer is faced with a choice of what to implement in Java code and what to implement in C/C++ code. The C/C++ is precompiled, but it carries the risk of misused pointers that can cause a failure. This is the same issue faced by developers who use the Java Native Interface (JNI) to call into C/C++ shared objects from Java, or vice versa.
When implementing an API, a choice is made between having the API as a thin wrapper for a native method implemented in some other language (usually C or C++), or using more elemental Java APIs to build the required functionality. For example, the HTTP functionality implemented by the java.net.URLConnection class can be implemented entirely in Java using the java.net.Socket class, or it can be implemented directly using the underlying host system functionality exposed via a JNI library call.
To produce a JNI-based API, a class must be implemented in Java, an underlying shared object must be implemented using an external language, and this external code calls the operating system APIs, as illustrated in Figure 5-10. Ultimately, the core functionality of the Java socket interface is implemented in the JVM via calls to the host operating system, but there is a variance in where the line is drawn. The tuning of options at the operating system level and the effect they have vary with where this line is drawn.
Figure 5-10 JNI and the IBM J9 JVM
In earlier versions of WebSphere Application Server, a great deal of low level external C/C++ code was accessed via JNI and shared objects, most of which was derived from the earlier IBM Component Broker product. Today, most WebSphere Application Server code is pure Java, but that which is not pure Java is informative for understanding how WebSphere Application Server operates on AIX.
Note the distinction here between low level JVM/Java standard library code (which is to be expected for mapping Java sockets, file system, and such code down to the bare operating system calls), and that specific to WebSphere Application Server, which is a Java application.
Using a default installation of WebSphere Application Server, we have a directory of /usr/IBM/WAS/AppServer. Under the java directory, the IBM J9 JVM used by WebSphere Application Server can be found, with a jre/bin directory containing a significant amount of shared objects implementing the JVM functionality itself. Here we find libj9jit23.so for the JIT compilation; libj9gc23.so for the garbage collector; libj9shr23.so for the shared classes feature; and libj9thr23.so for thread management, and libraries containing the code underlying the Java library (including libnet.a for networking support; libnio.a for socket nio; and so on). This is common to all Java applications using this JVM; see Example 5-34.
Example 5-34 Shared objects and libraries listing
# ls -l *.a *.so -rwxr-xr-x 1 root system 1968329 06 Oct 2006 libawt.a -rwxr-xr-x 1 root system 656910 06 Oct 2006 libcmm.a -rwxr-xr-x 1 root system 65145 06 Oct 2006 libdbx_j9.so -rwxr-xr-x 1 root system 293731 06 Oct 2006 libdcpr.a -rwxr-xr-x 1 root system 29977 06 Oct 2006 libdt_socket.a -rwxr-xr-x 1 root system 893132 06 Oct 2006 libfontmanager.a -rwxr-xr-x 1 root system 252822 06 Oct 2006 libhprof.a -rwxr-xr-x 1 root system 121730 06 Oct 2006 libinstrument.a -rwxr-xr-x 1 root system 119209 06 Oct 2006 libiverel23.so -rwxr-xr-x 1 root system 132369 06 Oct 2006 libj9bcv23.so -rwxr-xr-x 1 root system 527015 06 Oct 2006 libj9dbg23.so -rwxr-xr-x 1 root system 213120 06 Oct 2006 libj9dmp23.so -rwxr-xr-x 1 root system 224328 06 Oct 2006 libj9dyn23.so -rwxr-xr-x 1 root system 1061815 06 Oct 2006 libj9gc23.so -rwxr-xr-x 1 root system 144744 06 Oct 2006 libj9gcchk23.so -rwxr-xr-x 1 root system 12309 06 Oct 2006 libj9hookable23.so -rwxr-xr-x 1 root system 1329718 06 Oct 2006 libj9jextract.so -rwxr-xr-x 1 root system 6898716 06 Oct 2006 libj9jit23.so -rwxr-xr-x 1 root system 456205 06 Oct 2006 libj9jitd23.so -rwxr-xr-x 1 root system 198450 06 Oct 2006 libj9jpi23.so -rwxr-xr-x 1 root system 290970 06 Oct 2006 libj9jvmti23.so -rwxr-xr-x 1 root system 376447 06 Oct 2006 libj9prt23.so -rwxr-xr-x 1 root system 25264 06 Oct 2006 libj9rdbi23.so -rwxr-xr-x 1 root system 196690 06 Oct 2006 libj9shr23.so -rwxr-xr-x 1 root system 95750 06 Oct 2006 libj9thr23.so -rwxr-xr-x 1 root system 113369 06 Oct 2006 libj9trc23.so -rwxr-xr-x 1 root system 154247 06 Oct 2006 libj9ute23.so -rwxr-xr-x 1 root system 1166348 06 Oct 2006 libj9vm23.so -rwxr-xr-x 1 root system 253485 06 Oct 2006 libj9vrb23.so -rwxr-xr-x 1 root system 88708 06 Oct 2006 libj9zlib23.so -rwxr-xr-x 1 root system 4643 06 Oct 2006 libjaas.a -rwxr-xr-x 1 root system 315497 06 Oct 2006 libjava.a -rwxr-xr-x 1 root system 31147 06 Oct 2006 libjava_crw_demo.a -rwxr-xr-x 1 root system 2750 06 Oct 2006 libjawt.a -rwxr-xr-x 1 root system 1250321 06 Oct 2006 libjclscar_23.so -rwxr-xr-x 1 root system 378018 06 Oct 2006 libjdwp.a -rwxr-xr-x 1 root system 346076 06 Oct 2006 libjjpeg.a -rwxr-xr-x 1 root system 178958 06 Oct 2006 libjnichk.so -rwxr-xr-x 1 root system 109393 06 Oct 2006 libjpkcs11.so lrwxrwxrwx 1 root system 10 06 Oct 2006 libjsig.a -> libjsig.so -rwxr-xr-x 1 root system 16925 06 Oct 2006 libjsig.so -rwxr-xr-x 1 root system 477446 06 Oct 2006 libjsound.a -rwxr-xr-x 1 root system 4407 06 Oct 2006 libmanagement.a -rwxr-xr-x 1 root system 179678 06 Oct 2006 libnet.a -rwxr-xr-x 1 root system 80491 06 Oct 2006 libnio.a -rwxr-xr-x 1 root system 2144 06 Oct 2006 librmi.a -rwxr-xr-x 1 root system 114869 06 Oct 2006 libunpack.a -rwxr-xr-x 1 root system 12620 06 Oct 2006 libwrappers.a -rwxr-xr-x 1 root system 132664 06 Oct 2006 libzip.a
Contrast the list in shown Example 5-34 with the shared objects specific to WebSphere Application Server itself, as shown in Example 5-35. These shared objects can be found, by default, in the /usr/IBM/WAS/AppServer/bin directory.
Example 5-35 Shared objects specific to WebSphere Application Server
# cd /usr/IBM/WAS/AppServer/bin # ls -l *.so -rwxr-xr-x 1 root system 6556 06 Oct 2006 libgetClasses.so -rwxr-xr-x 1 root system 48530 06 Oct 2006 libibmaiodbg.so -rwxr-xr-x 1 root system 28317 06 Oct 2006 libibmaio.so -rwxr-xr-x 1 root system 60175 06 Oct 2006 libNativeFile.so -rwxr-xr-x 1 root system 24472 06 Oct 2006 libpmiJvmpiProfiler.so -rwxr-xr-x 1 root system 30381 06 Oct 2006 libpmiJvmtiProfiler.so -rwxr-xr-x 1 root system 11860 06 Oct 2006 libSelector.so -rwxr-xr-x 1 root system 16250 06 Oct 2006 libSystemData.so -rwxr-xr-x 1 root system 21720 06 Oct 2006 libUnixRegistryImpl.so -rwxr-xr-x 1 root system 68252 06 Oct 2006 libWs60ProcessManagement.so
We will look at these in more detail later, but these implementations are for asynchronous I/O, native security platform security implementation, native platform process management and integration, performance tool integration, and for IIOP/CORBA communications integration. All of these are areas where an appserver implementer might choose for a native implementation to integrate better with the platform, or to achieve performance improvement because of the specific role of the appserver within an enterprise.
To understand more about what is going on under the covers, and to understand how to interpret problems using the IBM Java tools, a JAVADUMP or JAVACORE file can be used. In many ways this is like a Java equivalent of an AIX core file. It contains thread, heap, garbage collection, lock, and stack information.
You can use the administration console or system console to generate a JAVADUMP file from WebSphere Application Server. However, from an AIX command line, you can generate a Java dump file of any running Java process by using kill -QUIT n to send a SIGQUIT signal, where n is the process ID.
The options for JAVADUMP are controlled by the JAVA_DUMP_OPTS environment variable. IBM_JAVACOREDIR controls the location it is written to. For the Java5 JVM used with WebSphere Application Server, the JAVADUMP signal will produce output that is similar to Example 5-36.
Example 5-36 Sample JAVADUMP
NULL ------------------------------------------------------------------------ 0SECTION TITLE subcomponent dump routine NULL =============================== 1TISIGINFO Dump Event "user" (00004000) received 1TIDATETIME Date: 2007/12/01 at 14:40:39 1TIFILENAME Javacore filename: /usr/IBM/WAS/AppServer/profiles/testwas/javacore.20071201.144039.123064.txt NULL ------------------------------------------------------------------------ 0SECTION GPINFO subcomponent dump routine NULL ================================ 2XHOSLEVEL OS Level : AIX 5.3 2XHCPUS Processors - 3XHCPUARCH Architecture : ppc64 3XHNUMCPUS How Many : 1 NULL 1XHERROR2 Register dump section only produced for SIGSEGV, SIGILL or SIGFPE. NULL NULL ------------------------------------------------------------------------ 0SECTION ENVINFO subcomponent dump routine NULL ================================= 1CIJAVAVERSION J2RE 5.0 IBM J9 2.3 AIX ppc64-64 build j9vmap6423-20060504 1CIVMVERSION VM build 20060501_06428_BHdSMr 1CIJITVERSION JIT enabled - 20060428_1800_r8 1CIRUNNINGAS Running as a standalone JVM 1CICMDLINE /usr/IBM/WAS/AppServer/java/bin/java -Declipse.security -Dwas.status.socket=34571 -Dosgi.install.area=/usr/IBM/WAS/AppServer -Dosgi.configuration.area=/usr/IBM/WAS/AppServer/profiles/testwas/configuration -Djava.awt.headless=true -Dosgi.framework.extensions=com.ibm.cds -Xshareclasses:name=webspherev61_%g,groupAccess,nonFatal -Xscmx50M - ... com.ibm.wsspi.bootstrap.WSPreLauncher -nosplash -application com.ibm.ws.bootstrap.WSLauncher com.ibm.ws.runtime.WsServer /usr/IBM/WAS/AppServer/profiles/testwas/config spock44pNode01Cell spock44pNode02 server1 1CIJAVAHOMEDIR Java Home Dir: /usr/IBM/WAS/AppServer/java/jre 1CIJAVADLLDIR Java DLL Dir: /usr/IBM/WAS/AppServer/java/jre/bin 1CISYSCP Sys Classpath: /usr/IBM/WAS/AppServer/java/jre/lib/ext/ibmorb.jar;/usr/IBM/WAS/AppServer /java/jre/lib/ext/ibmext.jar;/usr/IBM/WAS/AppServer/java/jre/lib/vm.jar;/usr/IB M/WebSphere/AppServer/java/jre/lib/core.jar;/usr/IBM/WAS/AppServer/java/jre/lib /charsets.jar;/usr/IBM/WAS/AppServer/java/jre/lib/graphics.jar;/usr/IBM/WebSphe re/AppServer/java/jre/lib/security.jar;/usr/IBM/WAS/AppServer/java/jre/lib/ibmp kcs.jar;/usr/IBM/WAS/AppServer/java/jre/lib/ibmorb.jar;/usr/IBM/WAS/AppSe rver/java/jre/lib/ibmcfw.jar;/usr/IBM/WAS/AppServer/java/jre/lib/ibmorbapi.jar; /usr/IBM/WAS/AppServer/java/jre/lib/ibmjcefw.jar;/usr/IBM/WAS/AppServer/j ava/jre/lib/ibmjgssprovider.jar;/usr/IBM/WAS/AppServer/java/jre/lib/ibmjsseprov ider2.jar;/usr/IBM/WAS/AppServer/java/jre/lib/ibmjaaslm.jar;/usr/IBM/WAS/ AppServer/java/jre/lib/ibmcertpathprovider.jar;/usr/IBM/WAS/AppServer/java/jre/ lib/server.jar;/usr/IBM/WAS/AppServer/java/jre/lib/xml.jar; 1CIUSERARGS UserArgs: 2CIUSERARG -Xjcl:jclscar_23 2CIUSERARG -Dcom.ibm.oti.vm.bootstrap.library.path=/usr/IBM/WAS/AppServer/java/jre/bin 2CIUSERARG -Dsun.boot.library.path=/usr/IBM/WAS/AppServer/java/jre/bin 2CIUSERARG -Djava.library.path=/usr/IBM/WAS/AppServer/java/jre/bin:/usr/IBM/WAS/AppS erver/java/jre/bin/j9vm:/usr/IBM/WAS/AppServer/java/jre/bin:/usr/IBM/WAS/ AppServer/bin::/usr/lib 2CIUSERARG -Djava.home=/usr/IBM/WAS/AppServer/java/jre ... Djava.class.path=/usr/IBM/WAS/AppServer/profiles/testwas/properties:/usr/IBM/We bSphere/AppServer/properties:/usr/IBM/WAS/AppServer/lib/startup.jar:/usr/IBM/We bSphere/AppServer/lib/bootstrap.jar:/usr/IBM/WAS/AppServer/lib/j2ee.jar:/usr/IB M/WebSphere/AppServer/lib/lmproxy.jar:/usr/IBM/WAS/AppServer/lib/urlprotocols.j ar:/usr/IBM/WAS/AppServer/deploytool/itp/batchboot.jar:/usr/IBM/WAS/AppSe rver/deploytool/itp/batch2.jar:/usr/IBM/WAS/AppServer/java/lib/tools.jar 2CIUSERARG vfprintf 2CIUSERARG _port_library 0x09001000A01DAD60 2CIUSERARG -Xdump NULL 1CIJVMMI JVM Monitoring Interface (JVMMI) NULL ------------------------ 2CIJVMMIOFF [not available] NULL NULL ------------------------------------------------------------------------ 0SECTION MEMINFO subcomponent dump routine NULL ================================= 1STHEAPFREE Bytes of Heap Space Free: 247e330 1STHEAPALLOC Bytes of Heap Space Allocated: 655cc00 NULL 1STSEGTYPE Internal Memory NULL segment start alloc end type bytes 1STSEGMENT 00000001104E7870 0000000115AA3450 0000000115AB344C 0000000115AB3450 01000040 10000 ... 1STSEGMENT 00000001104E7448 000000011056B810 000000011057B810 000000011057B810 01000040 10000 NULL 1STSEGTYPE Object Memory NULL segment start alloc end type bytes 1STSEGMENT 00000001104E7AA8 0700000000000000 070000000655CC00 070000000655CC00 00000009 655cc00 NULL 1STSEGTYPE Class Memory NULL segment start alloc end type bytes 1STSEGMENT 00000001160FE678 0000000115E2E890 0000000115E2EB70 0000000115E2EB70 00010040 2e4 ... 1STSEGMENT 00000001104E82E8 0700000010000090 07000000130F8C70 07000000131FFFF0 00020104 31fff70 NULL 1STSEGTYPE JIT Code Cache NULL segment start alloc end type bytes 1STSEGMENT 000000011051D108 000000011057B9B0 000000011057B9B0 0000000110D7B9B0 00000068 800000 NULL 1STSEGTYPE JIT Data Cache NULL segment start alloc end type bytes 1STSEGMENT 000000011056B628 0000000110DB31B0 00000001110804F4 00000001115B31B0 00000048 800000 NULL 1STGCHTYPE GC History 3STHSTTYPE 14:28:57:601484000 GMT j9mm.53 - GlobalGC end: workstackoverflow=0 overflowcount=0 weakrefs=17573 soft=2098 phantom=4 finalizers=239 newspace=0/0 oldspace=50488384/106286080 loa=0/0 3STHSTTYPE 14:28:57:601144000 GMT j9mm.61 - Class unloading end 3STHSTTYPE 14:28:57:593173000 GMT j9mm.66 - Classloader unload 3STHSTTYPE 14:28:57:592714000 GMT j9mm.66 - Classloader unload 3STHSTTYPE 14:28:57:592308000 GMT j9mm.60 - Class unloading start 3STHSTTYPE 14:28:57:592282000 GMT j9mm.57 - Sweep end 3STHSTTYPE 14:28:57:575557000 GMT j9mm.56 - Sweep start 3STHSTTYPE 14:28:57:575530000 GMT j9mm.55 - Mark end 3STHSTTYPE 14:28:57:68626000 GMT j9mm.54 - Mark start 3STHSTTYPE 14:28:57:68410000 GMT j9mm.52 - GlobalGC start: weakrefs=17872 soft=2120 phantom=36 finalizers=656 globalcount=34 scavengecount=0 3STHSTTYPE 14:26:01:88564000 GMT j9mm.53 - GlobalGC end: workstackoverflow=0 overflowcount=0 weakrefs=16865 soft=2021 phantom=4 finalizers=233 newspace=0/0 oldspace=57044640/106286080 loa=0/0 ... 3STHSTTYPE 14:20:18:221639000 GMT j9mm.52 - GlobalGC start: weakrefs=9900 soft=1605 phantom=0 finalizers=151 globalcount=4 scavengecount=0 3STHSTTYPE 14:19:56:798427000 GMT j9mm.53 - GlobalGC end: workstackoverflow=0 overflowcount=0 weakrefs=8166 soft=1585 phantom=0 finalizers=103 newspace=0/0 oldspace=44678944/52428800 loa=2621440/2621440 NULL NULL ------------------------------------------------------------------------ 0SECTION LOCKS subcomponent dump routine NULL =============================== NULL 1LKPOOLINFO Monitor pool info: 2LKPOOLTOTAL Current total number of monitors: 65 NULL 1LKMONPOOLDUMP Monitor Pool Dump (flat & inflated object-monitors): 2LKMONINUSE sys_mon_t:0x0000000111CB7BE0 infl_mon_t: 0x0000000111CB7C30: 3LKMONOBJECT org/eclipse/osgi/framework/eventmgr/EventManager$EventThread@0700000000334740/0700000 000334758: <unowned> 3LKNOTIFYQ Waiting to be notified: 3LKWAITNOTIFY "Framework Event Dispatcher" (0x0000000111DAC100) 2LKMONINUSE sys_mon_t:0x0000000111CB7D90 infl_mon_t: 0x0000000111CB7DE0: 3LKMONOBJECT org/eclipse/osgi/framework/eventmgr/EventManager$EventThread@0700000000335FD8/0700000 000335FF0: <unowned> 3LKNOTIFYQ Waiting to be notified: 3LKWAITNOTIFY "Start Level Event Dispatcher" (0x0000000111D41B00) ... 2LKMONINUSE sys_mon_t:0x0000000113EE6F40 infl_mon_t: 0x0000000113EE6F90: 3LKMONOBJECT java/lang/Object@0700000000C9F7E0/0700000000C9F7F8: owner "server.startup : 0" (0x000000011457EC00), entry count 1 NULL 1LKREGMONDUMP JVM System Monitor Dump (registered monitors): 2LKREGMON Thread global lock (0x0000000110012400): <unowned> 2LKREGMON NLS hash table lock (0x0000000110012490): <unowned> 2LKREGMON portLibrary_j9sig_sync_monitor lock (0x0000000110012520): <unowned> 2LKREGMON portLibrary_j9sig_asynch_reporter_shutdown_monitor lock (0x00000001100125B0): <unowned> 2LKREGMON portLibrary_j9sig_async_monitor lock (0x0000000110012640): <unowned> 2LKREGMON Hook Interface lock (0x00000001100126D0): <unowned> 2LKREGMON &(vm->bytecodeTableMutex) lock (0x0000000110012760): <unowned> 2LKREGMON MM_SublistPool lock (0x00000001100127F0): <unowned> ... 2LKREGMON MM_GCExtensions::gcStats lock (0x0000000110012D00): <unowned> 2LKREGMON &vm->verboseStateMutex lock (0x0000000110012D90): <unowned> 2LKREGMON VM thread list lock (0x0000000110012E20): Flat locked by "[osthread]" (0x0000000110014D48), entry count 1 2LKREGMON VM exclusive access lock (0x0000000110012EB0): <unowned> 2LKREGMON VM Runtime flags Mutex lock (0x0000000110012F40): <unowned> ... 2LKREGMON VM mem segment list lock (0x0000000110013840): <unowned> 2LKREGMON FinalizeListManager lock (0x00000001100138D0): <unowned> 2LKREGMON &(jvmtiData->mutex) lock (0x0000000110013960): <unowned> 2LKREGMON BCVD verifier lock (0x00000001100139F0): <unowned> 2LKREGMON Thread public flags mutex lock (0x0000000110013A80): <unowned> 2LKREGMON &newSem->pfmInfo.sem lock (0x0000000110013B10): <unowned> ... 3LKNOTIFYQ Waiting to be notified: 3LKWAITNOTIFY "HAManager.thread.pool : 1" (0x00000001136A8F00) 2LKREGMON Thread public flags mutex lock (0x000000011204AF60): <unowned> 2LKREGMON Thread public flags mutex lock (0x000000011204AFF0): <unowned> 2LKREGMON JVM_RawMonitor lock (0x000000011204B110): <unowned> ... 2LKREGMON Thread public flags mutex lock (0x0000000115356A50): <unowned> NULL NULL ------------------------------------------------------------------------ 0SECTION THREADS subcomponent dump routine NULL ================================= NULL 1XMCURTHDINFO Current Thread Details NULL ---------------------- NULL 1XMTHDINFO All Thread Details NULL ------------------ NULL 2XMFULLTHDDUMP Full thread dump J9SE VM (J2RE 5.0 IBM J9 2.3 AIX ppc64-64 build 20060501_06428_BHdSMr, native threads): 3XMTHREADINFO "P=916005:O=0:CT" (TID:0x00000001104E5500, sys_thread_t:0x0000000110014868, state:CW, native ID:0x00000000000FB0F9) prio=5 4XESTACKTRACE at java/lang/Thread.sleep(Native Method) 4XESTACKTRACE at java/lang/Thread.sleep(Thread.java:923) 4XESTACKTRACE at com/ibm/ws/runtime/WsServerImpl.main(WsServerImpl.java:479) 4XESTACKTRACE at com/ibm/ws/runtime/WsServer.main(WsServer.java:59) 4XESTACKTRACE at sun/reflect/NativeMethodAccessorImpl.invoke0(Native Method) 4XESTACKTRACE at sun/reflect/NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:64) 4XESTACKTRACE at sun/reflect/DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 4XESTACKTRACE at java/lang/reflect/Method.invoke(Method.java:615) 4XESTACKTRACE at com/ibm/wsspi/bootstrap/WSLauncher.launchMain(WSLauncher.java:183) 4XESTACKTRACE at com/ibm/wsspi/bootstrap/WSLauncher.main(WSLauncher.java:90) 4XESTACKTRACE at com/ibm/wsspi/bootstrap/WSLauncher.run(WSLauncher.java:72) 4XESTACKTRACE at org/eclipse/core/internal/runtime/PlatformActivator$1.run(PlatformActivator.java:226) 4XESTACKTRACE at org/eclipse/core/runtime/adaptor/EclipseStarter.run(EclipseStarter.java:376) 4XESTACKTRACE at org/eclipse/core/runtime/adaptor/EclipseStarter.run(EclipseStarter.java:163) 4XESTACKTRACE at sun/reflect/NativeMethodAccessorImpl.invoke0(Native Method) 4XESTACKTRACE at sun/reflect/NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:64) 4XESTACKTRACE at sun/reflect/DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 4XESTACKTRACE at java/lang/reflect/Method.invoke(Method.java:615) 4XESTACKTRACE at org/eclipse/core/launcher/Main.invokeFramework(Main.java:334) 4XESTACKTRACE at org/eclipse/core/launcher/Main.basicRun(Main.java:278) 4XESTACKTRACE at org/eclipse/core/launcher/Main.run(Main.java:973) 4XESTACKTRACE at com/ibm/wsspi/bootstrap/WSPreLauncher.launchEclipse(WSPreLauncher.java:245) 4XESTACKTRACE at com/ibm/wsspi/bootstrap/WSPreLauncher.main(WSPreLauncher.java:73) 3XMTHREADINFO "JIT Compilation Thread" (TID:0x00000001116BC300, sys_thread_t:0x0000000110015228, state:CW, native ID:0x000000000010C019) prio=11 ... 3XMTHREADINFO "Shared TCPChannel NonBlocking Accept Thread" (TID:0x0000000115F02C00, sys_thread_t:0x0000000115562648, state:R, native ID:0x000000000014608D) prio=5 4XESTACKTRACE at sun/nio/ch/PollArrayWrapper.poll0(Native Method) 4XESTACKTRACE at sun/nio/ch/PollArrayWrapper.poll(PollArrayWrapper.java:144) 4XESTACKTRACE at sun/nio/ch/PollSelectorImpl.doSelect(PollSelectorImpl.java:115) 4XESTACKTRACE at sun/nio/ch/SelectorImpl.lockAndDoSelect(SelectorImpl.java:99) 4XESTACKTRACE at sun/nio/ch/SelectorImpl.select(SelectorImpl.java:110) 4XESTACKTRACE at com/ibm/ws/tcp/channel/impl/ChannelSelector.run(ChannelSelector.java:158) 4XESTACKTRACE at java/lang/Thread.run(Thread.java:797) NULL ------------------------------------------------------------------------ 0SECTION CLASSES subcomponent dump routine NULL ================================= 1CLTEXTCLLOS Classloader summaries 1CLTEXTCLLSS 2345678: 1=primordial,2=extension,3=shareable,4=middleware,5=system,6=trusted,7=application,8= delegating 2CLTEXTCLLOADER p---st-- Loader *System*(0x07000000000094D0) 3CLNMBRLOADEDLIB Number of loaded libraries 5 3CLNMBRLOADEDCL Number of loaded classes 3311 2CLTEXTCLLOADER -x--st-- Loader sun/misc/Launcher$ExtClassLoader(0x070000000001B220), Parent *none*(0x0000000000000000) 3CLNMBRLOADEDLIB Number of loaded libraries 0 3CLNMBRLOADEDCL Number of loaded classes 85 2CLTEXTCLLOADER -----ta- Loader sun/misc/Launcher$AppClassLoader(0x07000000000222D0), Parent sun/misc/Launcher$ExtClassLoader(0x070000000001B220) 3CLNMBRLOADEDLIB Number of loaded libraries 0 3CLNMBRLOADEDCL Number of loaded classes 174 2CLTEXTCLLOADER -----t-- Loader org/eclipse/core/launcher/Main$StartupClassLoader(0x070000000006D8E8), Parent sun/misc/Launcher$AppClassLoader(0x07000000000222D0) 3CLNMBRLOADEDLIB Number of loaded libraries 0 3CLNMBRLOADEDCL Number of loaded classes 332 2CLTEXTCLLOADER -----t-- Loader org/eclipse/core/runtime/internal/adaptor/ContextFinder(0x0700000000078FE8), Parent sun/misc/Launcher$AppClassLoader(0x07000000000222D0) 3CLNMBRLOADEDLIB Number of loaded libraries 0 3CLNMBRLOADEDCL Number of loaded classes 0 2CLTEXTCLLOADER -----t-- Loader org/eclipse/osgi/framework/adaptor/core/CDSBundleClassLoader(0x0700000000336DF8), Parent sun/misc/Launcher$AppClassLoader(0x07000000000222D0) 3CLNMBRLOADEDLIB Number of loaded libraries 0 3CLNMBRLOADEDCL Number of loaded classes 109 2CLTEXTCLLOADER -----t-- Loader org/eclipse/osgi/framework/adaptor/core/CDSBundleClassLoader(0x070000000058E650), Parent sun/misc/Launcher$AppClassLoader(0x07000000000222D0) 3CLNMBRLOADEDLIB Number of loaded libraries 0 3CLNMBRLOADEDCL Number of loaded classes 7 2CLTEXTCLLOADER -----t-- Loader org/eclipse/osgi/framework/adaptor/core/CDSBundleClassLoader(0x07000000005901E8), Parent sun/misc/Launcher$AppClassLoader(0x07000000000222D0) 3CLNMBRLOADEDLIB Number of loaded libraries 0 3CLNMBRLOADEDCL Number of loaded classes 28 ... 1CLTEXTCLLIB ClassLoader loaded libraries 2CLTEXTCLLIB Loader *System*(0x07000000000094D0) 3CLTEXTLIB /usr/IBM/WAS/AppServer/java/jre/bin/java 3CLTEXTLIB /usr/IBM/WAS/AppServer/java/jre/bin/jclscar_23 3CLTEXTLIB /usr/IBM/WAS/AppServer/java/jre/bin/zip 3CLTEXTLIB /usr/IBM/WAS/AppServer/java/jre/bin/net 3CLTEXTLIB /usr/IBM/WAS/AppServer/java/jre/bin/nio 2CLTEXTCLLIB Loader org/eclipse/osgi/framework/adaptor/core/CDSBundleClassLoader(0x070000000081F688) 3CLTEXTLIB /usr/IBM/WAS/AppServer/bin/Ws60ProcessManagement 3CLTEXTLIB /usr/IBM/WAS/AppServer/bin/SystemData 3CLTEXTLIB /usr/IBM/WAS/AppServer/bin/getClasses 3CLTEXTLIB /usr/IBM/WAS/AppServer/bin/ibmaio ... 2CLTEXTCLLOAD Loader org/eclipse/osgi/framework/adaptor/core/CDSBundleClassLoader(0x07000000010E3E48) 3CLTEXTCLASS com/ibm/mqservices/Trace(0x00000001138FE3E8) 3CLTEXTCLASS com/ibm/mqservices/CallStackTrace(0x00000001138FF240) 3CLTEXTCLASS com/ibm/mq/MQPoolServices(0x00000001138FF4A8) 3CLTEXTCLASS com/ibm/mq/MQSimpleConnectionManager$PSAdapter(0x00000001138FF9F8) 3CLTEXTCLASS com/ibm/mq/MQEnvironment$1(0x00000001138FFCD8) 3CLTEXTCLASS com/ibm/mq/MQPoolServicesEvent(0x00000001138FFF28) 3CLTEXTCLASS com/ibm/mq/StoredManagedConnection(0x0000000113863FB0) 3CLTEXTCLASS com/ibm/mq/ManagedConnectionStore(0x00000001138647A0) 3CLTEXTCLASS com/ibm/mq/PoolScavenger(0x0000000113864CD8) 3CLTEXTCLASS com/ibm/mq/MQSimpleConnectionManager(0x000000011379E9F0) 3CLTEXTCLASS com/ibm/mq/MQPoolServicesEventListener(0x000000011379F500) 3CLTEXTCLASS com/ibm/mq/MQConnectionEventListener(0x000000011379F6B8) 3CLTEXTCLASS com/ibm/mq/MQException(0x0000000113861248) 3CLTEXTCLASS com/ibm/mq/MQConnectionManager(0x0000000112C72658) 3CLTEXTCLASS com/ibm/mq/MQEnvironment(0x000000011379B6E8) ... 2CLTEXTCLLOAD Loader sun/reflect/DelegatingClassLoader(0x0700000005F85108) 3CLTEXTCLASS sun/reflect/GeneratedSerializationConstructorAccessor70(0x0000000115E2E8D0) NULL ------------------------------------------------------------------------ 0SECTION Javadump End section NULL ---------------------- END OF DUMP -------------------------------------
JAVADUMP creates large files (a significant amount of repeated information has been left out of Example 5-36). However, JAVADUMPs contain helpful pieces of information that promote your understanding of IBM J9 JVM on AIX implementation. Detailed explanations for interpreting a JAVADUMP can be found in the IBM Java Virtual Machine Infocenter documentation:
The first part of the file displays environmental and startup information for the Java part of the process, as shown in Example 5-37. This data tells you the operating system version used, the JVM version, the platform you are running on, and how the JAVADUMP file was generated.
Example 5-37 JAVADUMP: environmental and startup information
NULL ------------------------------------------------------------------------ 0SECTION TITLE subcomponent dump routine NULL =============================== 1TISIGINFO Dump Event "user" (00004000) received 1TIDATETIME Date: 2007/12/01 at 14:40:39 1TIFILENAME Javacore filename: /usr/IBM/WAS/AppServer/profiles/testwas/javacore.20071201.144039.123064.txt NULL ------------------------------------------------------------------------ 0SECTION GPINFO subcomponent dump routine NULL ================================ 2XHOSLEVEL OS Level : AIX 5.3 2XHCPUS Processors - 3XHCPUARCH Architecture : ppc64 3XHNUMCPUS How Many : 1 NULL 1XHERROR2 Register dump section only produced for SIGSEGV, SIGILL or SIGFPE. NULL NULL ------------------------------------------------------------------------ 0SECTION ENVINFO subcomponent dump routine NULL ================================= 1CIJAVAVERSION J2RE 5.0 IBM J9 2.3 AIX ppc64-64 build j9vmap6423-20060504 1CIVMVERSION VM build 20060501_06428_BHdSMr 1CIJITVERSION JIT enabled - 20060428_1800_r8 1CIRUNNINGAS Running as a standalone JVM
Next, you see the command line and arguments used to start the JVM, as displayed in Example 5-38. This data is useful, particularly with WebSphere Application Server, because the complete environment is often applied by scripts or properties files and this shows what actual values are in use.
Examining the memory, you can see how the JVM works on AIX. You can see the size of the heap and how much of it is being used. Then you can see the AIX 64-bit memory model in use with each of the segments, and what their contents are.
Note the distinction between the heap, the object, the class, and the JIT code cache and JIT data cache memory segments. The JIT code and data segments are used to produce the code that actually runs.
Finally, you can see how the garbage collection is applied and when it is being applied (in this case, with a standard mark and sweep system).
Example 5-38 JAVADUMP: command line and arguments used to start the JVM
0SECTION MEMINFO subcomponent dump routine NULL ================================= 1STHEAPFREE Bytes of Heap Space Free: 247e330 1STHEAPALLOC Bytes of Heap Space Allocated: 655cc00 NULL 1STSEGTYPE Internal Memory NULL segment start alloc end type bytes 1STSEGMENT 00000001104E7870 0000000115AA3450 0000000115AB344C 0000000115AB3450 01000040 10000 1STSEGMENT 0000000111B4B518 0000000115A83410 0000000115A933F4 0000000115A93410 01000040 10000 ... 1STSEGMENT 00000001104E7448 000000011056B810 000000011057B810 000000011057B810 01000040 10000 NULL 1STSEGTYPE Object Memory NULL segment start alloc end type bytes 1STSEGMENT 00000001104E7AA8 0700000000000000 070000000655CC00 070000000655CC00 00000009 655cc00 NULL 1STSEGTYPE Class Memory NULL segment start alloc end type bytes 1STSEGMENT 00000001160FE678 0000000115E2E890 0000000115E2EB70 0000000115E2EB70 00010040 2e4 1STSEGMENT 00000001160FE5E0 00000001161B5470 00000001161B5860 00000001161B6B50 00020040 16e0 ... 1STSEGMENT 00000001104E82E8 0700000010000090 07000000130F8C70 07000000131FFFF0 00020104 31fff70 NULL 1STSEGTYPE JIT Code Cache NULL segment start alloc end type bytes 1STSEGMENT 000000011051D108 000000011057B9B0 000000011057B9B0 0000000110D7B9B0 00000068 800000 NULL 1STSEGTYPE JIT Data Cache NULL segment start alloc end type bytes 1STSEGMENT 000000011056B628 0000000110DB31B0 00000001110804F4 00000001115B31B0 00000048 800000 NULL 1STGCHTYPE GC History 3STHSTTYPE 14:28:57:601484000 GMT j9mm.53 - GlobalGC end: workstackoverflow=0 overflowcount=0 weakrefs=17573 soft=2098 phantom=4 finalizers=239 newspace=0/0 oldspace=50488384/106286080 loa=0/0 3STHSTTYPE 14:28:57:601144000 GMT j9mm.61 - Class unloading end 3STHSTTYPE 14:28:57:593173000 GMT j9mm.66 - Classloader unload 3STHSTTYPE 14:28:57:592714000 GMT j9mm.66 - Classloader unload 3STHSTTYPE 14:28:57:592308000 GMT j9mm.60 - Class unloading start 3STHSTTYPE 14:28:57:592282000 GMT j9mm.57 - Sweep end 3STHSTTYPE 14:28:57:575557000 GMT j9mm.56 - Sweep start 3STHSTTYPE 14:28:57:575530000 GMT j9mm.55 - Mark end 3STHSTTYPE 14:28:57:68626000 GMT j9mm.54 - Mark start 3STHSTTYPE 14:28:57:68410000 GMT j9mm.52 - GlobalGC start: weakrefs=17872 soft=2120 phantom=36 finalizers=656 globalcount=34 scavengecount=0 3STHSTTYPE 14:26:01:88564000 GMT j9mm.53 - GlobalGC end: workstackoverflow=0 overflowcount=0 weakrefs=16865 soft=2021 phantom=4 finalizers=233
Example 5-39 displays the underlying thread synchronization at work and the Java monitors. This is important for identifying when a deadlock has occurred between threads. Note that on a single CPU machine, the internal synchronization is optimized away, although in a virtualized environment the real CPU to virtual CPU mapping means that synchronization code is always present.
In the following data, pay particular attention to the Eclipse/OSGI framework event manager because this is part of the "hidden" infrastructure that underlies WebSphere Application Server.
Also note that there are threads and associated monitors for monitoring ports, strings, JNI code, garbage collection, and native code. However, of particular interest here are the JIT and JVM thread-related monitors.
There are monitors that are used by threads used for profiling and sampling, and others for monitoring JIT queues. This shows the underlying asynchronous model used by the IBM J9 JVM for moving code from its basic byte code format to its "hot" native code implementation by recompiling and reoptimizing it on a background thread and moving it to the native code cache used by the JVM itself.
Example 5-39 JAVADUMP: underlying thread synchronization and Java monitors
NULL ------------------------------------------------------------------------ 0SECTION LOCKS subcomponent dump routine NULL =============================== NULL 1LKPOOLINFO Monitor pool info: 2LKPOOLTOTAL Current total number of monitors: 65 NULL 1LKMONPOOLDUMP Monitor Pool Dump (flat & inflated object-monitors): 2LKMONINUSE sys_mon_t:0x0000000111CB7BE0 infl_mon_t: 0x0000000111CB7C30: 3LKMONOBJECT org/eclipse/osgi/framework/eventmgr/EventManager$EventThread@0700000000334740/0700000 000334758: <unowned> 3LKNOTIFYQ Waiting to be notified: 3LKWAITNOTIFY "Framework Event Dispatcher" (0x0000000111DAC100) 2LKMONINUSE sys_mon_t:0x0000000111CB7D90 infl_mon_t: 0x0000000111CB7DE0: 3LKMONOBJECT org/eclipse/osgi/framework/eventmgr/EventManager$EventThread@0700000000335FD8/0700000 000335FF0: <unowned> 3LKNOTIFYQ Waiting to be notified: 3LKWAITNOTIFY "Start Level Event Dispatcher" (0x0000000111D41B00) ... 3LKMONOBJECT java/lang/Object@0700000000C9F7E0/0700000000C9F7F8: owner "server.startup : 0" (0x000000011457EC00), entry count 1 NULL 1LKREGMONDUMP JVM System Monitor Dump (registered monitors): 2LKREGMON Thread global lock (0x0000000110012400): <unowned> 2LKREGMON NLS hash table lock (0x0000000110012490): <unowned> 2LKREGMON portLibrary_j9sig_sync_monitor lock (0x0000000110012520): <unowned> 2LKREGMON portLibrary_j9sig_asynch_reporter_shutdown_monitor lock (0x00000001100125B0): <unowned> 2LKREGMON portLibrary_j9sig_async_monitor lock (0x0000000110012640): <unowned> 2LKREGMON Hook Interface lock (0x00000001100126D0): <unowned> 2LKREGMON &(vm->bytecodeTableMutex) lock (0x0000000110012760): <unowned> 2LKREGMON MM_SublistPool lock (0x00000001100127F0): <unowned> 2LKREGMON MM_SublistPool lock (0x0000000110012880): <unowned> ... 2LKREGMON MM_WorkPackets::inputList lock (0x0000000110012C70): <unowned> 2LKREGMON MM_GCExtensions::gcStats lock (0x0000000110012D00): <unowned> 2LKREGMON &vm->verboseStateMutex lock (0x0000000110012D90): <unowned> 2LKREGMON VM thread list lock (0x0000000110012E20): Flat locked by "[osthread]" (0x0000000110014D48), entry count 1 2LKREGMON VM exclusive access lock (0x0000000110012EB0): <unowned> 2LKREGMON VM Runtime flags Mutex lock (0x0000000110012F40): <unowned> 2LKREGMON VM Extended method block flags Mutex lock (0x0000000110012FD0): <unowned> 2LKREGMON VM bind native lock (0x0000000110013060): <unowned> 2LKREGMON VM class loader blocks lock (0x00000001100130F0): <unowned> 2LKREGMON VM class table lock (0x0000000110013180): <unowned> 2LKREGMON VM string table lock (0x0000000110013210): <unowned> 2LKREGMON VM segment lock (0x00000001100132A0): <unowned> 2LKREGMON VM JNI frame lock (0x0000000110013330): <unowned> ... 2LKREGMON &newSem->pfmInfo.sem lock (0x0000000110013C30): <unowned> 2LKREGMON JIT-MonitorTableMonitor lock (0x0000000110013CC0): <unowned> 2LKREGMON JIT-MemoryAllocMonitor lock (0x0000000110013D50): <unowned> 2LKREGMON JIT-ClassUnloadMonitor lock (0x0000000110013DE0): <unowned> 2LKREGMON Hook Interface lock (0x0000000110013E70): <unowned> 2LKREGMON JIT-jitConfig->mutex lock (0x0000000110013F00): <unowned> 2LKREGMON JIT-AssumptionTableMutex lock (0x0000000110013F90): <unowned> 2LKREGMON VM mem segment list lock (0x0000000110014020): <unowned> 2LKREGMON VM mem segment list lock (0x00000001100140B0): <unowned> 2LKREGMON ActivationTableMutex lock (0x0000000110014140): <unowned> 2LKREGMON JIT-CompilationQueueMonitor lock (0x00000001100141D0): <unowned> 3LKNOTIFYQ Waiting to be notified: 3LKWAITNOTIFY "JIT Compilation Thread" (0x00000001116BC300) 2LKREGMON JIT-CodeCacheListMutex lock (0x0000000110014260): <unowned> 2LKREGMON JIT-CodeCacheMonitor-?? lock (0x00000001100142F0): <unowned> 2LKREGMON Thread public flags mutex lock (0x0000000110014380): <unowned> 2LKREGMON ValueProfilingMutex lock (0x0000000110014410): <unowned> ... 2LKREGMON &refreshMutex lock (0x00000001100146E0): <unowned> 2LKREGMON JIT sampling thread lock (0x0000000110014770): <unowned> 2LKREGMON management fields lock lock (0x00000001118A4E00): <unowned> 2LKREGMON &vm->managementData->notificationMonitor lock (0x00000001118A4E90): <unowned> 2LKREGMON JIT-InterpreterProfilingMonitor lock (0x00000001118A4F20): <unowned> 2LKREGMON JIT-QueueSlotMonitor-0 lock (0x00000001118A4FB0): <unowned> 2LKREGMON JIT-QueueSlotMonitor-1 lock (0x00000001118A5040): <unowned> 2LKREGMON JIT-QueueSlotMonitor-2 lock (0x00000001118A50D0): <unowned> 2LKREGMON JIT-QueueSlotMonitor-3 lock (0x00000001118A5160): <unowned> 2LKREGMON Thread public flags mutex lock (0x00000001118A51F0): <unowned> 2LKREGMON JVM_RawMonitor lock (0x00000001118A5280): <unowned> 2LKREGMON JVM_RawMonitor lock (0x00000001118A5310): <unowned> 2LKREGMON JVM_RawMonitor lock (0x00000001118A53A0): <unowned> 2LKREGMON JIT-QueueSlotMonitor-4 lock (0x00000001118A5430): <unowned> 2LKREGMON JIT-QueueSlotMonitor-5 lock (0x00000001118A54C0): <unowned>
Example 5-40 displays the threads within the JVM and how they are being mapped down to the underlying native platform threads. It also shows the IDs to map to external tool pictures of the thread usage. The relative thread priorities can be useful in identifying thread starvation issues. With each thread, you also have the thread stack information.
Example 5-40 JAVADUMP: thread within the JVM, and mapping to platform threads
1XMTHDINFO All Thread Details NULL ------------------ NULL 2XMFULLTHDDUMP Full thread dump J9SE VM (J2RE 5.0 IBM J9 2.3 AIX ppc64-64 build 20060501_06428_BHdSMr, native threads): 3XMTHREADINFO "P=916005:O=0:CT" (TID:0x00000001104E5500, sys_thread_t:0x0000000110014868, state:CW, native ID:0x00000000000FB0F9) prio=5 4XESTACKTRACE at java/lang/Thread.sleep(Native Method) 4XESTACKTRACE at java/lang/Thread.sleep(Thread.java:923) 4XESTACKTRACE at com/ibm/ws/runtime/WsServerImpl.main(WsServerImpl.java:479) 4XESTACKTRACE at com/ibm/ws/runtime/WsServer.main(WsServer.java:59) 4XESTACKTRACE at sun/reflect/NativeMethodAccessorImpl.invoke0(Native Method) 4XESTACKTRACE at sun/reflect/NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:64) 4XESTACKTRACE at sun/reflect/DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 4XESTACKTRACE at java/lang/reflect/Method.invoke(Method.java:615) 4XESTACKTRACE at com/ibm/wsspi/bootstrap/WSLauncher.launchMain(WSLauncher.java:183) 4XESTACKTRACE at com/ibm/wsspi/bootstrap/WSLauncher.main(WSLauncher.java:90) 4XESTACKTRACE at com/ibm/wsspi/bootstrap/WSLauncher.run(WSLauncher.java:72) 4XESTACKTRACE at org/eclipse/core/internal/runtime/PlatformActivator$1.run(PlatformActivator.java:226) 4XESTACKTRACE at org/eclipse/core/runtime/adaptor/EclipseStarter.run(EclipseStarter.java:376) 4XESTACKTRACE at org/eclipse/core/runtime/adaptor/EclipseStarter.run(EclipseStarter.java:163) 4XESTACKTRACE at sun/reflect/NativeMethodAccessorImpl.invoke0(Native Method) 4XESTACKTRACE at sun/reflect/NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:64) 4XESTACKTRACE at sun/reflect/DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 4XESTACKTRACE at java/lang/reflect/Method.invoke(Method.java:615) 4XESTACKTRACE at org/eclipse/core/launcher/Main.invokeFramework(Main.java:334) 4XESTACKTRACE at org/eclipse/core/launcher/Main.basicRun(Main.java:278) 4XESTACKTRACE at org/eclipse/core/launcher/Main.run(Main.java:973) 4XESTACKTRACE at com/ibm/wsspi/bootstrap/WSPreLauncher.launchEclipse(WSPreLauncher.java:245) 4XESTACKTRACE at com/ibm/wsspi/bootstrap/WSPreLauncher.main(WSPreLauncher.java:73) 3XMTHREADINFO "JIT Compilation Thread" (TID:0x00000001116BC300, sys_thread_t:0x0000000110015228, state:CW, native ID:0x000000000010C019) prio=11
Finally, Example 5-41 displays classloader information. Although this is primarily a Java feature, you can observe the IBM shared classes implementation at work with the WebSphere Application Server Eclipse/OSGI implementation by noting what has been loaded by the CDSBundleClassLoader.
Example 5-41 JAVADUMP: classloader information
0SECTION CLASSES subcomponent dump routine NULL ================================= 1CLTEXTCLLOS Classloader summaries 1CLTEXTCLLSS 12345678: 1=primordial,2=extension,3=shareable,4=middleware,5=system,6=trusted,7=application,8= delegating 2CLTEXTCLLOADER p---st-- Loader *System*(0x07000000000094D0) 3CLNMBRLOADEDLIB Number of loaded libraries 5 3CLNMBRLOADEDCL Number of loaded classes 3311 ... 1CLTEXTCLLIB ClassLoader loaded libraries 2CLTEXTCLLIB Loader *System*(0x07000000000094D0) 3CLTEXTLIB /usr/IBM/WAS/AppServer/java/jre/bin/java 3CLTEXTLIB /usr/IBM/WAS/AppServer/java/jre/bin/jclscar_23 3CLTEXTLIB /usr/IBM/WAS/AppServer/java/jre/bin/zip 3CLTEXTLIB /usr/IBM/WAS/AppServer/java/jre/bin/net 3CLTEXTLIB /usr/IBM/WAS/AppServer/java/jre/bin/nio 2CLTEXTCLLIB Loader org/eclipse/osgi/framework/adaptor/core/CDSBundleClassLoader(0x070000000081F688) 3CLTEXTLIB /usr/IBM/WAS/AppServer/bin/Ws60ProcessManagement 3CLTEXTLIB /usr/IBM/WAS/AppServer/bin/SystemData 3CLTEXTLIB /usr/IBM/WAS/AppServer/bin/getClasses 3CLTEXTLIB /usr/IBM/WAS/AppServer/bin/ibmaio 1CLTEXTCLLOD ClassLoader loaded classes 2CLTEXTCLLOAD Loader *System*(0x07000000000094D0) 3CLTEXTCLASS javax/management/remote/rmi/RMIConnectorServer(0x00000001164387C8) 3CLTEXTCLASS javax/management/remote/rmi/RMIServer(0x0000000116439AA0) 3CLTEXTCLASS javax/management/remote/rmi/RMIServerImpl(0x0000000116439CB8) 3CLTEXTCLASS javax/management/remote/rmi/RMIIIOPServerImpl(0x000000011643AB80) 3CLTEXTCLASS sun/rmi/server/LoaderHandler$LoaderEntry(0x000000011643AFD0) 3CLTEXTCLASS sun/rmi/server/LoaderHandler$LoaderKey(0x000000011643B218) 3CLTEXTCLASS sun/rmi/server/LoaderHandler$2(0x000000011643B4B8) 3CLTEXTCLASS com/ibm/oti/shared/SharedClassPermissionCollection(0x000000011643B778) 3CLTEXTCLASS sun/rmi/server/LoaderHandler$1(0x000000011643BB60) 3CLTEXTCLASS javax/management/remote/rmi/_RMIServerImpl_Tie(0x000000011643BED0) ... 2CLTEXTCLLOAD Loader org/eclipse/core/launcher/Main$StartupClassLoader(0x070000000006D8E8) 3CLTEXTCLASS org/eclipse/osgi/internal/module/VersionHashMap(0x0000000111F97F00) 3CLTEXTCLASS org/eclipse/osgi/internal/module/CyclicDependencyHashMap(0x0000000111F98458) 3CLTEXTCLASS org/eclipse/osgi/internal/module/GroupingChecker(0x0000000111F98768) 3CLTEXTCLASS org/eclipse/osgi/internal/module/ResolverExport(0x0000000111F98E78) 3CLTEXTCLASS org/eclipse/osgi/internal/module/ResolverImport(0x0000000111F99498) 3CLTEXTCLASS org/eclipse/osgi/internal/module/BundleConstraint(0x0000000111F99C18) 3CLTEXTCLASS [Lorg/eclipse/osgi/internal/module/ResolverImport;(0x0000000111F9A200) 3CLTEXTCLASS [Lorg/eclipse/osgi/internal/module/ResolverExport;(0x0000000111F9A350) 3CLTEXTCLASS [Lorg/eclipse/osgi/internal/module/BundleConstraint;(0x0000000111F9A4A0) 3CLTEXTCLASS [Lorg/eclipse/osgi/internal/module/VersionSupplier;(0x0000000111F9A5F0) 3CLTEXTCLASS [Lorg/eclipse/osgi/internal/module/ResolverBundle;(0x0000000111F9A740) 3CLTEXTCLASS org/osgi/framework/BundlePermission(0x0000000111F9A8C0) 3CLTEXTCLASS org/osgi/framework/BundlePermissionCollection(0x0000000111F9AEF0) ... 3CLTEXTCLASS org/osgi/framework/Bundle(0x0000000111B82DD8) 3CLTEXTCLASS org/eclipse/core/runtime/adaptor/EclipseStarter$InitialBundle(0x0000000111B83200) 3CLTEXTCLASS org/eclipse/osgi/framework/log/FrameworkLog(0x0000000111C2EB98) 3CLTEXTCLASS org/eclipse/core/runtime/adaptor/EclipseStarter(0x0000000111B68448) 2CLTEXTCLLOAD Loader org/eclipse/core/runtime/internal/adaptor/ContextFinder(0x0700000000078FE8) 2CLTEXTCLLOAD Loader org/eclipse/osgi/framework/adaptor/core/CDSBundleClassLoader(0x0700000000336DF8) 3CLTEXTCLASS org/eclipse/core/internal/runtime/PlatformURLMetaConnection(0x000000011214E390) ... 3CLTEXTCLASS sun/reflect/GeneratedSerializationConstructorAccessor70(0x0000000115E2E8D0) NULL ------------------------------------------------------------------------ 0SECTION Javadump End section NULL ---------------------- END OF DUMP -------------------------------------
Example 5-41 illustrates the mapping between real underlying processors and the virtual CPUs as seen by the operating system image in a virtualized environment. Remember that when the HyperVisor is loaded (always with a POWER5 processor and above), the CPU is always virtualized even if it is to whole CPU values.
The standard configuration for a newer POWER 5 or POWER 6 architecture machine is to run with Symmetric Multi-Threading (SMT) enabled and micropartitioning enabled. With SMT, multiple threads can be run concurrently under many circumstances on a single CPU. With micropartitioning, the CPU can be split into a number of virtual CPUs in portions of 0.1 or 0.01 of the processing power of a real CPU.
The JVM understands these and performs the appropriate optimizations. However, with these choices the processor cache is important because the real processor is split between virtual processors that may be running more than one operating system image concurrently, which incurs a small overhead.
Some applications, such as those running rules engines, are CPU-intensive, so dedicated processor partitions should be used for these. However, for standard Web applications, the overheads are insignificant when overall performance is considered so SMT and micropartitioning should be enabled, with the partitions running uncapped with appropriate entitlements discovered by testing. SMT can get an additional 30 percent performance out of a partition when enabled.
This is discussed here because processor folding optimizations from AIX 5.3 ML03 onward release unused virtual processor cycles back to the HyperVisor, and this can be defeated through misconfiguration and the JVM optimizations can be lost.
For example, adding .1 increments above whole CPU allocations to a partition leads to additional synchronization overheads and the loss of cache locality that counteract any benefit of the extra CPU allocation. (This was also explained earlier in the context of JVM architecture.)