330 likes | 431 Views
JavaME Connected Device Configure. Development Environment and Garbage Collector of Virtual Machine. Speaker: Chu, Hua-Rong Advisor: Chung Yung. OUTLINE. CDC implementation overview Build Sun CDC1.0.1 in Ubuntu What happens during the build process Garbage Collector of Sun CVM.
E N D
JavaME Connected Device Configure Development Environment and Garbage Collector of Virtual Machine Speaker: Chu, Hua-RongAdvisor: Chung Yung
OUTLINE • CDC implementation overview • Build Sun CDC1.0.1 in Ubuntu • What happens during the build process • Garbage Collector of Sun CVM
JavaME CDC Implementation overview
CDC platform Survey • IBM • WebSphere Everyplace Micro Environment • Support CDC1.1 • Ref: 劉惠玲, 嵌入式系統裝置走向跨平台的推手 - IBM J9, 2007 IBM developerWorks(~/cdc/CDC doc/IBMJ9.ppt) • Sun • Offical CDC • Mobile & Embedded Community: phoneME Advanced
Sun CDC History Personal Java (1999) JavaME CDC1.0 (2001) JavaME CDC1.1 (2005) JavaSE for Embedded? (2007) phoneME Advanced(2008)
Sun CDC family • JavaME CDC1.0 (based on JavaSE1.3) • JavaME CDC1.0.1 (based on JavaSE1.3.1) • JavaME CDC1.1 (based on JavaSE1.4) • ARM, PowerPC, MIPS, SPARC, x86 (interpreter only) • Linux, Solaris, Darwin, Win32 • phoneME Advanced MR2 (2008) • ARM, x86 • Linux, Windows Mobile, OpenWRT
JavaME CDC Build Sun cdc 1.0.1
PartI: Source Code • Source Code: • j2me_cdcfp-1_0_1-fcs-src-b12-linux-i686-14_May_2002.zip • Download: http://jtrue.pl/files/GPS/
PartII: Environment • Redhat7.1 / Ubuntu 6.06 • JDK1.3 / JDK1.4 • egcs6 / gcc3.3 and related C develop tool • ksh
PartIII: Troubleshooting • Problem: This Version's java code is based on JavaSE1.3.1. • Java Compile time error: • JDK6javac with option -source 1.4/1.3 is no use • Solution:downgradeto JDK1.4/1.3 ../../src/share/classes/java/lang/SecurityManager.java:299: cannot find symbol symbol : method initCause(java.lang.ClassNotFoundException) location: class java.lang.NoClassDefFoundError synchronized(SecurityManager.class) { ^
PartIII: Troubleshooting • Problem: GCC4 is restricted for nonstandard C code in this Version. • C Compile time error: complie time Error: Checking for test classes to compile ... ... ../../build/linux-i686/obj/globals.o ../../src/share/javavm/runtime/globals.c:121:1: 錯誤: 粘貼「.」和「nullClassLoaderLock」不能給出一個有效的預先處理識別字
PartIII: Troubleshooting • Solution:use GCC3.3(gcc -V3.3 if gcc4 is installed) change line 117 of /cdcfoundation/src/share/javavm/runtime/globals.c from #define CVM_SYSMUTEX_ENTRY(mutex, name) {&CVMglobals.##mutex, name} #define CVM_SYSMUTEX_ENTRY(mutex, name) {&CVMglobals. mutex, name}
PartIII: Troubleshooting • Problem: glibc <2.2 is needed in this Version • Linking Time Error: Linking ../../build/linux-i686/bin/cvm ../../build/linux-i686/obj/UNIXProcess_md.o:在函式「sigchld_handler」中 :../../src/linux/native/java/lang/UNIXProcess_md.c:213: 未定義參考到「 __libc_wait」 collect2: ld 回傳 1 make: *** [../../build/linux-i686/bin/cvm] Error 1
PartIII: Troubleshooting • Solution: patch ~/src/linux/native/java/lang/UNIXProcess_md.c 34,53c34 < < /* following lines Hacked by Kent Hulick based on < * ftp://people.redhat.com/drepper/libcwait.c < * fixes a broken calls to a removed glibc function:*/ < #include < #include < pid_t __libc_wait (int *status) < { < int res; < asm volatile ("pushl %%ebx\n\t" < "movl %2, %%ebx\n\t" < "movl %1, %%eax\n\t" < "int $0x80\n\t" < "popl %%ebx" < : "=a" (res) < : "i" (__NR_wait4), "0" (WAIT_ANY), "c" (status), "d" (0), < "S" (0)); < return res; < } < --
PartIV: Preperation&Configure #sudosu #cd/usr/local/src #wget http://jtrue.pl/files/GPS/j2me_cdcfp-1_0_1-fcs-src-b12-linux-i686-14_May_2002.zip #unzip j2me_cdcfp-1_0_1-fcs-src-b12-linux-i686-14_May_2002.zip #unzip cdcfoundation-1_0_1-fcs-src.zip #cdcdcfoundation/build
PartIV: Preperation&Configure Edit Makefile ./linux/defs.mk : ./linux/defs.mk:#petertc1026 ./linux/defs.mk-#CFLAGS_SPEED = -c $(CC_ARCH_FLAGS) $(CCFLAGS) $(CCFLAGS_SPEED) $(CPPFLAGS) ./linux/defs.mk-#CFLAGS_SPACE = -c $(CC_ARCH_FLAGS) $(CCFLAGS) $(CCFLAGS_SPACE) $(CPPFLAGS) ./linux/defs.mk-#SO_CFLAGS = -c $(SO_CC_ARCH_FLAGS) $(CCFLAGS) $(CPPFLAGS) ./linux/defs.mk-CFLAGS_SPEED = -V3.3 -c $(CC_ARCH_FLAGS) $(CCFLAGS) $(CCFLAGS_SPEED) $(CPPFLAGS) ./linux/defs.mk-CFLAGS_SPACE = -V3.3 -c $(CC_ARCH_FLAGS) $(CCFLAGS) $(CCFLAGS_SPACE) $(CPPFLAGS) ./linux/defs.mk-SO_CFLAGS = -V3.3 -c $(SO_CC_ARCH_FLAGS) $(CCFLAGS) $(CPPFLAGS)
PartIV: Preperation&Configure Edit Makefile./share/defs.mk : ./share/defs.mk:#petertc1026 ./share/defs.mk-#CVM_GNU_TOOLS_PATH=/micro/tools/i686-redhat-linux/gnu/bin ./share/defs.mk-CVM_GNU_TOOLS_PATH=/usr/bin
PartIV: Preperation&Configure Patch /usr/local/src/cdcfoundation/src/share/javavm/runtime/globals.c:117 //petertc1026 /*#define CVM_SYSMUTEX_ENTRY(mutex, name) {&CVMglobals.##mutex, name}*/ #define CVM_SYSMUTEX_ENTRY(mutex, name) {&CVMglobals. mutex, name}
PartIV: Preperation&Configure Patch /usr/local/src/cdcfoundation/src/linux/native/java/lang/UNIXProcess_md.c:213 34,53c34 < < /* following lines Hacked by Kent Hulick based on < * ftp://people.redhat.com/drepper/libcwait.c < * fixes a broken calls to a removed glibc function:*/ < #include <errno.h> < #include <sys/syscall.h> < pid_t __libc_wait (int *status) < { < int res; < asm volatile ("pushl %%ebx\n\t" < "movl %2, %%ebx\n\t" < "movl %1, %%eax\n\t" < "int $0x80\n\t" < "popl %%ebx" < : "=a" (res) < : "i" (__NR_wait4), "0" (WAIT_ANY), "c" (status), "d" (0), < "S" (0)); < return res; < } <
PartV: Build #cdlinux-i686 #make CVM_DEBUG=true JAVABIN=/usr/java/j2sdk1.4.2_18/bin
PartVI: Demo # bin/cvm -Djava.class.path=testclasses.zip HelloWorld > GC[SS]: Initialized semi-space gen for generational GC > Size of *each* semispace in bytes=1048576 > Limits of generation = [0xb7942200,0xb7b42200) > First semispace = [0xb7942200,0xb7a42200) > Second semispace = [0xb7a42200,0xb7b42200) > GC[MC]: Initialized mark-compact gen for generational GC > Size of the space in bytes=3145728 > Limits of generation = [0xb7b42200,0xb7e42200) > GC[generational]: Auxiliary data structures > heapBaseMemoryArea=[0xb7942008,0xb7e42208) > cardTable=[0x8322f90,0x8325790) > objectHeaderTable=[0x8325798,0x8327f98) > summaryTable=[0x8327fa0,0x8331fa0) > Hello world.
JavaME CDC What Happens During the Build Process
In build/linux-i686/directory • bin/cvm: executable image • lib/cdc.jar: JAR archive, default boot class path • testclasses.zip: a collection of simple tests
JavaME CDC Garbage collector
Build Options • -CVM_GCCHOICE (Generational/marksweep/semispace) • default: generational • Example: • -CVM_GCCHOICE=semispace
Runtime Options • -Xgc:gc_specific_options(In generational is youngGen=nnnin bytes) • Default: 1M
Runtime Options • -Xmssize (memory allocation pool) • Default: 4M • Example: • -Xms6291456 • -Xms6144k • -Xms6m
Source Organization • src/share/javavm/include/gc_common.h The shared GC interface. • src/share/javavm/include/gc/gc_impl.hThe gcimpl GC interface that has to be implemented for each GC. • src/share/javavm/include/gc/<gcname>/gc_config.hThe configuration file for a specific GC. • src/share/javavm/runtime/gc/<gcname>/gc_impl.cThe implementation file for a specific GC.
Execution Flow 1. CVM allocates memory using the shared routine CVMgcAllocNewInstance(). 2. CVMgcAllocNewInstance() does some processing and calls the GC-specific CVMgcimplAllocObject() to allocate the actual space for the object. 3. CVMgcimplAllocObject() performs the GC and calls the shared routine CVMgcStopTheWorldAndGC() to stop all threads at GC-safe points. 4. CVMgcStopTheWorldAndGC() ensures that all threads rendezvous at GC-safe points. When that is done, it calls the GC implementation CVMgcimplDoGC() to perform the GC action. 5. CVMgcimplDoGC() may call shared GC service routines to scan GC state: For example, CVMgcScanRoots() to scan all roots or CVMobjectWalkRefs() to scan the pointers in a given object or array. 6. When CVMgcimplDoGC() returns, all threads that were stopped at GC points resume execution. Eventually, CVMgcAllocNewInstance() returns and the thread that originally initiated GC resumes execution.
JavaME CDC Reference
JavaME CDC <!--EOF->