jit テーブル構造を連鎖配列からハッシュ テーブルと B ツリーの組み合わせに変更することで、dalvik jit にいくつかの変更を加えました。サンプル Java プログラムを実行すると、
public class prog {
public static void main(String args[])
{
long start=System.currentTimeMillis();
int sum=0;
for(int i=1;i<10;i++)
{
for(int j=0;j<10;j++) {
long h=getKey();
System.out.println("key : "+h);
}
}
System.out.println("time : "+(System.currentTimeMillis()-start));
}
public static long getKey()
{
Random rand=new Random();
long key = rand.nextLong();
if(key<0)
return -key;
else
return key;
}
}
dalvikvm -cp prog.jar prog を libdvm.so (JIT に変更を加えた後にビルド) を Android エミュレーターにプッシュした後に使用します。プログラムが完全に実行される場合もあれば、セグメンテーション違反が発生する場合もあります。ログを確認すると、次のエラーが表示されます。
Fatal signal 11 (SIGSEGV) at 0x00000020 (code=1)
I/DEBUG ( 33): *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
I/DEBUG ( 33): Build fingerprint: 'generic/sdk/generic:4.0.3/MR1/237985:eng/test-keys'
I/DEBUG ( 33): pid: 766, tid: 766 >>> dalvikvm <<<
I/DEBUG ( 33): signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 00000020
I/DEBUG ( 33): r0 00000020 r1 4245b32a r2 0000001f r3 00000001
I/DEBUG ( 33): r4 4245b32a r5 41af7e90 r6 0000f9a0 r7 0000063d
I/DEBUG ( 33): r8 4001edc0 r9 00000000 10 40513620 fp 00000014
I/DEBUG ( 33): ip 400bf108 sp beb6cad0 lr 00000000 pc 00000020 cpsr 20000010
I/DEBUG ( 33): d0 3f4000003f400000 d1 0000000000000000
I/DEBUG ( 33): d2 0000000000000000 d3 0000000000000000
I/DEBUG ( 33): d4 0000000000000000 d5 41ca61a4d0800000
I/DEBUG ( 33): d6 3f50624dd2f1a9fc d7 3ede5bd843b4bb5d
I/DEBUG ( 33): d8 0000000000000000 d9 0000000000000000
I/DEBUG ( 33): d10 0000000000000000 d11 0000000000000000
I/DEBUG ( 33): d12 0000000000000000 d13 0000000000000000
I/DEBUG ( 33): d14 0000000000000000 d15 0000000000000000
I/DEBUG ( 33): scr 60000010
I/DEBUG ( 33):
I/DEBUG ( 33): #00 pc 00000020
I/DEBUG ( 33): #01 lr 00000000 <unknown>
I/DEBUG ( 33):
I/DEBUG ( 33): code around pc:
I/DEBUG ( 33): 00000000 ffffffff ffffffff ffffffff ffffffff ................
I/DEBUG ( 33): 00000010 ffffffff ffffffff ffffffff ffffffff ................
I/DEBUG ( 33): 00000020 ffffffff ffffffff ffffffff ffffffff ................
I/DEBUG ( 33): 00000030 ffffffff ffffffff ffffffff ffffffff ................
I/DEBUG ( 33): 00000040 ffffffff ffffffff ffffffff ffffffff ................
I/DEBUG ( 33):
I/DEBUG ( 33): code around lr:
I/DEBUG ( 33): 00000000 ffffffff ffffffff ffffffff ffffffff ................
I/DEBUG ( 33): 00000010 ffffffff ffffffff ffffffff ffffffff ................
I/DEBUG ( 33): 00000020 ffffffff ffffffff ffffffff ffffffff ................
I/DEBUG ( 33): 00000030 ffffffff ffffffff ffffffff ffffffff ................
I/DEBUG ( 33): 00000040 ffffffff ffffffff ffffffff ffffffff ................
I/DEBUG ( 33):
I/DEBUG ( 33): stack:
I/DEBUG ( 33): beb6ca90 0000001f
I/DEBUG ( 33): beb6ca94 00000000
I/DEBUG ( 33): beb6ca98 00000000
I/DEBUG ( 33): beb6ca9c 400817ed /system/lib/libdvm.so
I/DEBUG ( 33): beb6caa0 400a4736 /system/lib/libdvm.so
I/DEBUG ( 33): beb6caa4 00000001
I/DEBUG ( 33): beb6caa8 4245b32a /system/framework/core.odex
I/DEBUG ( 33): beb6caac 0000001f
I/DEBUG ( 33): beb6cab0 00000001
I/DEBUG ( 33): beb6cab4 4245b32a /system/framework/core.odex
I/DEBUG ( 33): beb6cab8 41af7e90
I/DEBUG ( 33): beb6cabc 0000f9a0 [heap]
I/DEBUG ( 33): beb6cac0 0000063d
I/DEBUG ( 33): beb6cac4 40081841 /system/lib/libdvm.so
I/DEBUG ( 33): beb6cac8 df0027ad
I/DEBUG ( 33): beb6cacc 00000000
I/DEBUG ( 33): #00 beb6cad0 400b3f90 /system/lib/libdvm.so
I/DEBUG ( 33): beb6cad4 0000f9a0 [heap]
I/DEBUG ( 33): beb6cad8 400b3f90 /system/lib/libdvm.so
I/DEBUG ( 33): beb6cadc beb6cb08 [stack]
I/DEBUG ( 33): beb6cae0 41b40710 /dev/ashmem/dalvik-LinearAlloc (deleted)
I/DEBUG ( 33): beb6cae4 beb6cb4c [stack]
I/DEBUG ( 33): beb6cae8 00000000
I/DEBUG ( 33): beb6caec fffffe60
I/DEBUG ( 33): beb6caf0 beb6cb98 [stack]
I/DEBUG ( 33): beb6caf4 40034200 /system/lib/libdvm.so
I/DEBUG ( 33): beb6caf8 00000000
I/DEBUG ( 33): beb6cafc beb6cbc8 [stack]
I/DEBUG ( 33): beb6cb00 00000000
I/DEBUG ( 33): beb6cb04 beb6cbd0 [stack]
I/DEBUG ( 33): beb6cb08 00000000
I/DEBUG ( 33): beb6cb0c 00000000
I/DEBUG ( 33): beb6cb10 00000000
I/DEBUG ( 33): beb6cb14 00000000
I/BootReceiver( 77): Copying /data/tombstones/tombstone_05 to DropBox (SYSTEM_TOMBSTONE)
考えられる問題は何ですか?メモリ関連の問題ですか、それとも JIT コードの変更に関するバグですか?
ありがとう