不正常的时候可以使用。
六、死锁预测
如果虚拟机以WITH_DEADLOCK_PREDICTION参数编译,那么死锁预测器会在-Xdeadlockpredict参数中使能。(dalvikvm –help会告诉你虚拟机是否编译正确——在Configured中按行查找deadlock_prediction)这个特性会让虚拟机一直跟踪对象的锁获取的顺序,如果程序试图以与之前看到不同的顺序获取一些锁,虚拟机会log一个warning并有选择的抛出异常。
命令行参数是基于dalvik.vm.deadlock-predict特性设置的,正确的值是off表示不使能它(默认),warn表示log问题但是继续执行,err表示从monitor-enter指令中引发一个dalvik.system.PotentialDeadlockError异常,abort表示终止整个虚拟机。
你通常可以这么使用:
adbshell setprop dalvik.vm.deadlock-predict err
除非你可以在log信息滚动的时候一直关注着。
注意这个特性是死锁预测,不是死锁检测——在当前实现中,在锁被获取之后才会进行计算(这减轻了代码,降低了互斥信息外的冗余)。在挂起的进程中执行kill -3时可以发现一个死锁,并且可以在log信息中检测到。
这仅仅考虑了监督程序,本地的互斥量和其他资源也会引起死锁,而且不会被它检测到。
七、dump堆栈追踪
和其他桌面虚拟机一样,dalvik虚拟机收到SIGQUIT(Ctrl-\ 或者kill -3)时,会为所有的现成dump所有的堆栈追踪。它默认写入Android 的log,但是也可以写入一个文件。
dalvik.vm.stack-trace-file特性允许你指定要将线程堆栈追踪写入的文件名,如果不存在,将创建,新的信息将追加到文件尾,文件名通过-Xstacktracefile参数写入虚拟机。例如:
adbshell setprop dalvik.vm.stack-trace-file /tmp/stack-traces.txt
如果这个特性没有被定义,虚拟机会在收到这个信号时将堆栈追踪信息写入android log。
八、dex文件和校验
出于性能考虑,优化过的dex文件的和校验被取消了,这通常叫安全,因为文件是在设备上产生的,并且有禁止修改的权限。
但是如果设备的存储器不可靠,就会发生数据损坏,这通常表现为重复的虚拟机崩溃。为了快速诊断这种失败,虚拟机提供了-Xcheckdexsum参数,如果设置了,在内容被使用之前所有的dex文件都会进行和校验。
如果dalvik.vm.check-dex-sum特性被使能,那么应用框架会在虚拟机创建时提供这个参数。
为了使能额外的dex和校验,可以:
adbshell setprop dalvik.vm.check-dex-sum true
不正确的和校验会组织dex数据的使用,产生错误并写入log文件,如果设备曾经有过这样的问题,那么将这个特性写入/data/local.prop很有用。
注意dexdump工具每次都会进行dex和校验,它也可以用于检测大量的文件。
九、产生标志位
在“Honeycomb”版本中引入了一系列的汇编,它们通过标志位写入虚拟机:
adb shell setprop dalvik.vm.extra-opts “flag1flag2 … flagN”
这些标志位之间用空格隔开。你可以指定任意多的标志位只要它们在系统特性值的长度范围内(目前是92个字符)。
这些额外的标志位会被加到命令行的底端,意味着它们会覆盖之前的设定。这些可以用于例如测试不同的-Xmx的值即使android框架层已经设定过了。