我正在研究Android进程管理,我想知道使用多个进程(而非线程)的应用程序是否共享Dalvik实例,或者每个进程是否存在Dalvik实例,即使对于同一个应用程序也是如此.
你能指点我一些官方消息来源(doc,talk,paper等)吗?
谢谢
哪里可以找到带有相应允许操作数及其大小的dalvik操作码列表(8位/ 16位/ 32位/ 62位)
虚拟机用于在不同的操作系统上运行应用程序(Java将代码编译为独立于操作系统的.class文件,这些文件被解释为字节码).由于Android应用程序在相同的操作系统(即Android)上运行,因此它不需要VM(我可能在这里错了).那为什么需要Dalvik VM呢?
文档似乎是错误的.有人能告诉我哪个是真的吗?
在Performance Myths部分中:
在没有JIT的设备上,缓存字段访问比重复访问字段快约20%.使用JIT,字段访问成本与本地访问大致相同.
在避免内部Getters/Setters部分是:
没有JIT,直接字段访问速度比调用一个简单的getter快约3倍.使用JIT(直接字段访问与访问本地一样便宜),直接字段访问比调用一个简单的getter快约7倍.
很明显,没有JIT本地访问速度更快.同样清楚的是,访问字段比直接访问更快,而不是使用getter.
但是,为什么在第一种情况下性能提高20%,而在第二种情况下,由于同样的原因,性能提高了133%,那就是调用对象字段的JIT优化?
我知道有很多这方面的主题和资源,但我想知道一个非常具体的问题(可能需要很长时间才能检查所有来源以获得明确答案).
我知道JVM/Dalvik保证当你访问类的静态字段时(final static原始值除外),类的静态字段已经初始化.反之亦然吗?如果我从来没有在所有访问类(例如,因为switch-case在另一个静态方法的代码永远不会达到一定的分支),是它保证了虚拟机并没有初始化这个类的静态?
假设我有一个这样的类:
public class Boo {
public static int[] anything = new int[] { 2,3,4 };
private static int[] something = new int[] { 5,6,7 }; // this may be much bigger as well
public static final int[] getAndClear() {
int[] st = something;
something = null;
return st;
}
}
Run Code Online (Sandbox Code Playgroud)
我的应用程序是一个非常特殊的应用程序(在某些方面不典型),并且它可能包含数百个类,例如Boo(由代码生成器生成),其中something可能是不同元素计数的数组(因此它可能包含很多元素,如好吧有时候).
根据应用程序输入,许多这些预生成的类可能永远不会被访问.我不希望很多int[]对象被不必要地初始化,占用大量内存.
我的情况是,我的Android应用程序无法及时执行软实时任务,因为调用垃圾收集器需要几毫秒.给GC几分钟的时间不足以错过从IO设备读取数据的小任务的一些重要截止日期.
我正在考虑引入另一个线程,并为其提供轮询重要数据的任务.但是我不确定GC是暂停所有线程还是暂停内存?
让我们假设我们有三个(或更多)类
公共课A {}
公共B级扩展A {}
公共类C扩展B实现G {}
假设每个类都有自己的20个(或更多)方法.
铸造到C与铸造到A对性能有更大的影响吗?Java编译如何在幕后工作?
在向下投射时,是否必须通过反射检查所有方法和字段是否存在?
编辑: 类的大小(字段和方法的数量)是否会在投射时影响性能?我对OpenJRE和Dalvik感兴趣.
作为参考,我知道可以毫无问题地完成向上转换.
我正在创建一个在我的libs文件夹中使用3个jar文件的Application.
当我运行应用程序时,我收到错误"Dx trouble processing"javax/xml XMLConstants.class":"
"在不构建核心库时,不明智或错误地使用核心类(java.*或javax.*)."
和
"转换为Dalvik格式失败,错误1"
我尝试删除JAR文件,但它导致代码中的错误.
请建议我在这里需要做些什么来解决这个问题.
我最近研究了一些smali代码,并希望学习它。我已经检查了dalvik字节码参考,但是找不到何时/如何使用这些参考的结构参考
.locals
.local
.registers
.prologue
.line
.annotation
.parameter
Run Code Online (Sandbox Code Playgroud)
您知道其他资源来解释更多的smali结构吗?
我有一个使用NDK的Android应用程序 - 一个带有常规UI和C++核心的常规Android Java应用程序.核心中有些地方我需要调用Java方法,这意味着我需要一个JNIEnv*for该线程,这反过来意味着我需要调用JavaVM->AttachCurrentThread()才能获得有效的env.
以前,只是做了AttachCurrentThread,根本没有分手.它在Dalvik中运行良好,但是一旦一个调用AttachCurrentThread退出而没有调用的线程,ART就会中止该应用程序DetachCurrentThread.所以我已经阅读了JNI参考资料,事实上它说我必须打电话DetachCurrentThread.但是当我这样做时,ART会使用以下消息中止应用程序:
试图在仍然运行代码时分离
这里有什么问题,以及如何DetachCurrentThread正确呼叫?