web-dev-qa-db-ja.com

SunVMでできるDalvik VM(AndroidのVM)でできないことは何ですか?

JavaのVMで実行できるほぼすべてのJavaDalvikのVMで実行できることを知っています)しかし、制限はあまり明確ではありません。誰かが大きな障害に遭遇したことがありますか?問題を抱えている主要なライブラリがありますか?Javaバイトコード(ScalaJythonなど...)期待どおりに機能しませんか?

56
Ichorus

Dalvikが処理しない、または標準のJavaバイトコード)とまったく同じ方法で処理しないものがいくつかありますが、それらのほとんどは非常に高度です。

最も深刻な例はランタイムバイトコードの生成ですおよびカスタムクラスのロード。バイトコードを作成し、クラスローダーを使用してそれをロードしたいとします。そのトリックが通常のマシンで機能する場合、バイトコードの生成を変更しない限り、Dalvikでは機能しないことが保証されます。

これにより、特定の依存性注入フレームワークを使用できなくなります。最もよく知られている例はGoogle Guiceです(ただし、一部の人はそれに取り組んでいると思います)。一方、AspectJは、コンパイルステップとしてバイトコードインストルメンテーションを使用するため、機能するはずです(ただし、誰かが試したかどうかはわかりません)。

他のjvm言語に関しては、最終的に標準のバイトコードにコンパイルされ、実行時にバイトコードインストルメンテーションを使用しないものはすべて、Dalvikに変換でき、機能するはずです。人々がJythonをAndroidで実行し、問題なく動作したことを知っています。

他に注意すべきことは、インタイムコンパイルだけではありませんがあるということです。これは厳密にはDalviksの問題ではありません(必要に応じていつでもその場でバイトコードをコンパイルできます)が、Androidはそれをサポートしておらず、サポートする可能性は低いです。事実上、標準のマイクロベンチマーク中Javaは役に立たなかった-コンポーネントはテストで大規模なシステムの一部とは異なるランタイム特性を持っていた-Android電話のマイクロベンチマークは完全に理にかなっている。

34
Marcin

" Dalvik Virtual Machine internals " Google IO session、Dalvikがサポートしていないことがわかります 世代別GC

そのため、頻繁なオブジェクトの作成と削除のパフォーマンスが低下する可能性があります。 Java VMは世代別GCをサポートしているため、同じ状況でより優れたGCパフォーマンスを示します。

また、Dalvikはメソッドgranuality JITの代わりに trace-granuality JIT を使用します。

12
Wonil

ここに追加できると思うもう1つのことは、リフレクションAPIを使用してクラスのフィールドを一覧表示するときに、Dalvikがフィールドの順序を保持していないことです。さて、リフレクションAPIはとにかくそれを保証しません(したがって、理想的にはとにかくそれに依存すべきではありません)が、そこにある他のほとんどのVM do順序を保持します。

2