JavaME Connected Device Configure Development Environment and Garbage Collector of Virtual Machine Speaker: Chu, Hua-Rong Advisor: Chung Yung
Jan 02, 2016
JavaME Connected Device Configure
Development Environment and Garbage Collector of Virtual Machine
Speaker: Chu, Hua-Rong Advisor: Chung Yung
2
OUTLINE
• CDC implementation overview• Build Sun CDC1.0.1 in Ubuntu• What happens during the build process• Garbage Collector of Sun CVM
3
IMPLEMENTATION OVERVIEWJavaME CDC
4
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
5
Sun CDC History
Personal Java (1999)
JavaME CDC1.0 (2001)
JavaME CDC1.1 (2005)
JavaSE for Embedded? (2007)
phoneME Advanced(2008)
6
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
7
BUILD SUN CDC 1.0.1 JavaME CDC
8
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/
9
PartII: Environment
• Redhat7.1 / Ubuntu 6.06• JDK1.3 / JDK1.4 • egcs6 / gcc3.3 and related C develop tool• ksh
10
PartIII: Troubleshooting
• Problem: This Version's java code is based on JavaSE 1.3.1.
• Java Compile time error:
• JDK6 javac with option -source 1.4/1.3 is no use• Solution : downgrade to JDK1.4/1.3
../../src/share/classes/java/lang/SecurityManager.java:299: cannot find symbolsymbol : method initCause(java.lang.ClassNotFoundException)location: class java.lang.NoClassDefFoundError synchronized(SecurityManager.class) { ^
11
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 」不能給出一個有效的預先處理識別字
12
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}
13
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 回傳 1make: *** [../../build/linux-i686/bin/cvm] Error 1
14
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;< }< --
15
PartIV: Preperation&Configure
#sudo su#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#cd cdcfoundation/build
16
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)
17
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
18
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}
19
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;< }<
20
PartV: Build
#cd linux-i686#make CVM_DEBUG=true
JAVABIN=/usr/java/j2sdk1.4.2_18/bin
21
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.
22
WHAT HAPPENS DURING THE BUILD PROCESS
JavaME CDC
23
Step Utility Input Output
1 javac src/share/classes/*.java build/target_name/btclasses/*.class
2 JavaMemberDepend
build/target_name/btclasses/*.class
build/target_name/generated/javavm/runtime/tranlist.
3 zip build/target_name/generated/javavm/runtime/tranlist
build/target_name/btclasses.zip
4 javac src/share/javavm/test/*.java (Runtime classes CVM test files )
build/target_name/lib/cdc.jar build/target_name/lib/foundation.jar build/target_name/testclasses/*.class
5 zip build/target_name/testclasses/*.class
build/target_name/testclasses.zip
6 javah Runtime classes JNI header files in build/target_name/generated/jni/*.h
7 JavaCodeCompact
build/target_name/btclasses.zip JNI header files in build/target_name/generated/jni/*.hPreloaded class data structuresin build/target_name/generated/javavm/runtime/romjava*.c and romjava.h Additional C file interfaces.
24
Step Utility Input Output
8 C compiler Native methods and CVMsource (.c) files
Object files in build/target_name/obj/*.o
9 C compiler Preloaded classes in build/target_name/generated/javavm/runtime/romjava*.c
Object files in build/target_name/obj/romjava*.o
A archive utility
Object files in build/target_name/obj/romjava*.o
Object archive file in build/target_name/obj/libromjava.a
B linker Object files in build/target_name/obj/*.o from step 8
Object archive file in build/target_name/obj/libromjava.a from step 10
Virtual machine binary* in build/target_name/bin.
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
25
GARBAGE COLLECTORJavaME CDC
26
Build Options
• -CVM_GCCHOICE (Generational/marksweep/semispace)
• default: generational • Example:– -CVM_GCCHOICE=semispace
27
Runtime Options
• -Xgc:gc_specific_options(In generational is youngGen=nnn in bytes)
• Default: 1M
28
Runtime Options
• -Xmssize (memory allocation pool)• Default: 4M• Example: – -Xms6291456– -Xms6144k– -Xms6m
29
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.h The configuration file for a specific GC.
• src/share/javavm/runtime/gc/<gcname>/gc_impl.c The implementation file for a specific GC.
30
Execution Flow1. 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.
31
REFERENCEJavaME CDC
32
CDCFOUNDATION_PORTING_GUIDE.PDF
33
<!--EOF->JavaME CDC