Dalvik——如何控制vm

原创 2016年08月31日 12:12:14
一 dalvik虚拟机支持一系列的命令行参数(使用adbshell dalvikvm –help获取列表),但是不可能通过android应用运行时来传递任意参数,但是可以通过特定的系统参数来影响虚拟机行为。
对于下述所有参数,你都可以通过setprop来设置系统特性,shell命令如下:

adbshell setprop
必须重启android运行时从而使得改变生效(adb shell stop:adb shell start)。这是因为,这些设定在zygote进程中处理,而zygote最早启动并且永远存活。
你不可以以无特权用户的身份设定dalvik.*参数及重启系统。你可以在用户调试版本的shell上使用adb root或者运行su命令来获取root权限,如有疑问,
adbshell getprop
可以告诉你setprop是否发生。
如果你不想在设备重启之后特性消失,在/data/local.prop上加一行:
=
重启之后这样的改变也会一直存在,但是如果data分区被擦除了就消失了。(提示:在工作台上创建一个local.prop,然后adb push local.prop /data/,或者,使用类似于adb shell “echo name =value >> /data/local.prop”的命令——注意,引号很重要)



二、扩展的JNI检测
JNI(Java Native Interface),java本地接口,提供了java语言程序调用本地(C/C++)代码的方法。扩展的JNI检测会引起系统运行更慢,但是可以发现一系列的讨厌的bug,防止他们产生问题。
有两个系统参数影响这个功能,这个功能可以通过-Xcheck:jni命令行参数来激活。第一个参数是ro.kernel.android.checkjni,这是通过android编译系统对development的编译来设置的(也可以通过android模拟器设置,除非通过模拟器命令行置了-nojni标志位)。因为这是一个”ro.”特性,设备启动之后参数就不能变了。
为了能触发CheckJNI标志位,第二种特性是dalvik.vm.checkjni,它的值覆盖了ro.kernel.android.checkjni的值。
如果这个特性没有被定义,dalvik.vm.checkjni也没有设置成false,那么-Xcheck:jni标志位就没有传入,JNI检测也就没有使能。
要打开JNI检测,使用以下命令:
adbshell setprop dalvik.vm.checkjni true。
也可以通过系统特性将JNI检测选项传递给虚拟机,dalvik.vm.jniopts的值可以通过-Xjniopts参数传入,例如:
adb shellsetprop dalvik.vm.jniopts forcecopy
更多信息见JNI建议。



三、断言
dalvik虚拟机支持java编程语言的断言表达式,默认它是关闭的,但是可以通过-ea参数的方式(dalvikvm –ea …..)设置dalvik.vm.enableassertions特性。
在其他桌面虚拟机中这个参数同样生效,通过提供class名、package名(后跟“…”),或者特殊值“all”。例如:
adbshell setprop dalvik.vm.enableassertion all
就可以在所有非系统class中使能断言。
这个系统特性比全命令行更受限制,不可以通过-ea入口设置更多,而且没有指定-da入口的方法,而且未来也没有-esa/-dsa等价的东西。



四、字节码校验和优化
系统尝试预校验dex文件中的所有类,从而降低class的负担,从而可以使用一系列的优化来提升运行性能。这些都是通过dexopt命令来实现的,不论是在编译系统中还是在安装上。在开发设备上,dexopt可能在dex文件第一次被使用时运行,而不论它或者它的依赖是否更新过(Just-in-time优化和校验,JIT)。
有两个命令行标志位控制JIT优化和校验,-Xverify和-Xdexopt。andorid框架基于dalvik.vm.dexopt-flags特性来配置这俩参数,如果你设定:
adbshell setprop dalvik.vm.dexopt-flags v=a o=v
那么android框架会将-Xverify:all-Xdexopt:verified传递给虚拟机,这将使能校验并且只优化校验成功的class。这是最安全的设定,也是默认的。
你也可以设定dalvik.vm.dexopt-flags v=n使得框架传输-Xverify:none –Xdexopt:verified从而不使能校验(我们可以传输-Xdexopt:all从而允许优化,但是这并不能优化更多代码,因为没有通过校验的class可能被优化器以同样的理由跳过)。这时class不会被dexopt校验,而没被校验的代码很大难以执行。
使能校验会使得dexopt命令明显花费更多时间,因为校验过程相对较慢,一旦校验和优化过的dex文件准备就绪,校验就不会占用额外的开销除非在加载预校验失败的class。
如果你的dex文件的校验关闭了,而后来又打开了校验器,应用加载会明显变慢(大概40%以上)因为class会在第一次被调用的时候校验。
为了最佳效果,当特性变化的时候你应该为dex文件强制重新调用dexopt,即:
adbshell “rm /data/dalvik-cache/*” 它删除了暂存的dex文件,记住要中止再打开运行时(adb shell stop:adb shell start)。
(老的运行时版本支持布尔型的dalvik.vm.verify-bytecode特性,但是被dalvik.vm.dexopt-flags替代了)

五、运行模式
当前dalvik vm的实现包括三个独立的解释内核:“快速”(fast)、“可移植”(portable)、“调试”(debug)。快速解释器是为当前平台优化的,可能包括手动优化的汇编文件;相对的,可移植解释器是用C写的,可在广泛的平台上使用;调试解释器是可移植解释器的变种,包括了支持程序分析(profiling)和单步。
vm可能也支持just-in-time编译,严格的说它并不是另一个解释器,JIT编译器也可以被同样的标志位使能/不使能(查看dalvik –help的输出信息来查看JIT编译器是否在你的虚拟机里面使能)。
vm允许你在快速、可移植和jit中选择,通过使用-Xint参数的扩展来实现,该参数的值可以通过dalvik.vm.execution-mode系统特性来设置。为了选择可移植解释器,你应该用:
adb shell setpropdalvik.vm.execution-mode int:portable
如果该参数没有指定,系统会自动选择最合适的编译器,有时候机器可能允许选择其他模式,例如jit编译器。
不是所有的平台都有优化的实现,有时候,快速编译器是由一系列的c实现的,这个结果会比可移植编译器还慢(当我们对所有流行平台都有优化版本的时候,这个命名“快速”就更准确了)。
如果程序分析使能或者调试器连接了,vm会变为调试解释器。当程序分析结束或者调试器中断连接,就会恢复原来的解释器。(用调试解释器会明显变慢,这是在评估数据时要记住的)
JIT编译器可以通过在应用程序AndroidManifest.xml中加入android:vmSafeMode=”true”来不使能,你怀疑JIT编译器会使得你的应用运行不正常的时候可以使用。



六、死锁预测
如果虚拟机以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框架层已经设定过了。

<script>window._bd_share_config={"common":{"bdSnsKey":{},"bdText":"","bdMini":"2","bdMiniList":false,"bdPic":"","bdStyle":"0","bdSize":"16"},"share":{}};with(document)0[(getElementsByTagName('head')[0]||body).appendChild(createElement('script')).src='http://bdimg.share.baidu.com/static/api/js/share.js?v=89860593.js?cdnversion='+~(-new Date()/36e5)];</script>
阅读(1732) | 评论(1) | 转发(1) |
给主人留下些什么吧!~~
20_avatar_small.jpg

niao59292012-11-05 08:23:12

虚拟机本身的代码更希望了解.PYTHON,底层就是完全开放的。呵呵.现在的GO也是如此.那多好玩.呵呵

评论热议
版权声明:本文为博主原创文章,转载请注明出处。 https://blog.csdn.net/chituhuan/article/details/52383702

Android JIT带来的虚拟机崩溃问题及解决方案

Android自从2.2开始加入了JIT技术,号称速度提高了3~5倍。不过JIT的稳定性有待考证。。。看一下这个issue:http://code.google.com/p/android/issue...
  • a345017062
  • a345017062
  • 2011-05-05 16:56:00
  • 11971

android运行apk停止运行---dalvik vm兼容性问题

genymotion android4.3 http://blog.csdn.net/a345017062/article/details/6397465
  • yanxiangyfg
  • yanxiangyfg
  • 2014-10-10 14:34:30
  • 2899

Android6.0 dex优化

一、代码 Android6.0 PackageManagerService dex优化是在scanPackageDirtyLI函数中,代码如下: [cpp] view plain copy ...
  • q1183345443
  • q1183345443
  • 2016-11-29 19:10:32
  • 2265

安卓手机优化,修改build.prop

转载自“魔趣 ViPER520”         最近有好多人找小Z优化手机,用了很多办法。只有root和修改build.prop文件屡试不爽。有网友要问了,root?我的国产小厂机,不行啊。那么我...
  • fuying1234
  • fuying1234
  • 2014-12-29 16:24:45
  • 3850

Android 优化开机启动

Android开机启动慢,是一个众所周知的问题。优化方向: 1、在网上看的资料,对于开机启动来说,耗时最久的是preload classes和scan packages。所以第一个优化方向就是预加载...
  • myvest
  • myvest
  • 2016-06-23 11:16:57
  • 3192

dalvik VM的解释器分析

以KK的dalvik源码为基础来解析。 使用的源码基于https://github.com/AOKP/dalvik, 可以从https://github.com/AOKP/dalvik/archive...
  • doon
  • doon
  • 2016-07-25 17:29:39
  • 1959

有关android加快开机速度

有关android加快开机速度       我们知道,android开机速度慢,在恢复出厂设置后开机速度更慢,其中优化dex文件的过程就耗时很多。那么我们就可以尝试将优化dexopt步骤...
  • haima1998
  • haima1998
  • 2014-06-04 23:18:38
  • 1333

Dalvik——如何控制vm

一、简介          Dalvik虚拟机支持一系列的命令行参数(使用adbshell dalvikvm –help获取列表),但是不可能通过android应用运行时来传递任意参数,但是可以通过特...
  • Neuuranus
  • Neuuranus
  • 2011-07-15 13:14:34
  • 818

(翻译)Bytecode for the Dalvik VM -General Design

Bytecode for the Dalvik VM -General Design 以下所述的machine model和调用约定采用了一般架构和C语言调用约定来表述: Dalvi虚拟机是基于寄存...
  • kinghuangjin
  • kinghuangjin
  • 2015-05-18 18:36:26
  • 660

Android Dalvik VM内存优化之内存查看篇。

Android Dalvik VM内存优化之内存查看篇。 前序: Android采用Java语言(虽然官方认定Kotlin语言为新语言,目前已经替换中),而Java语言虚拟机为JVM,但是...
  • pd_liu_w
  • pd_liu_w
  • 2017-10-11 20:33:50
  • 288
收藏助手
不良信息举报
您举报文章:Dalvik——如何控制vm
举报原因:
原因补充:

(最多只允许输入30个字)