ソースコードの行数制限はあるのしょうか

2,492 views
Skip to first unread message

ロドス

unread,
Feb 16, 2011, 11:42:52 PM2/16/11
to 日本Androidの会
はじめましてロドスと申します。

androidのjavaソースコードに行数制限はあるでしょうか。

以下のような症状が出て困っています。
1:一つのファイルの行数が、65536行を超えるとeclipseでブレークポイントかけられません。ステップ実行時も、-65536行された位置が
表示されてしまいます。
2:行数が極端に長い(2500行以上)メソッドをもつクラスをnewしようとすると、エラー(jitarbitrarily rejecting
large method)になる。

また、行数が多いのが原因なのかわかりませんが以下のようなことも
3:eclipseのデバッグ実行が極端に遅い。FPSが数十分の1以下になる。これは「デバッグ」から「切断」をすれば治る。
4:「デバッグ」中に「切断」をした際に、logcatが、「No free temp registers」「Jit: aborting
trace compilation, reverting to interpreter」というエラーログが、大量に(毎フレーム?)表示される

4は、「行数が長い(数百行?)せいでJitが用意した容量を超えるため、インタプリタ実行にする」みたいな意味だと思うのですが。
Jitが効かないというのも困るので、行数が原因なのか、もし行数が原因なら何行までの制限があるのか。
とかが知りたいです。

1,2は原因が特定できているので、改善できるのですが
3.4は原因がはっきりしないうえに、原因と思われる(メソッドの行数が長い)箇所が莫大にあるため、検証が難しいです。

そもそも行数が多すぎるという自覚はあるのですが、残念ながら個々のソースの行数を少なくしていくことは無理そうです。
(別機種アプリのAndroidへの移植を担当してるのですが、もともとのソースがクラスを少なくするために、行数が長いコードが多いとか。事情があっ
て、もともとのソースをなるべくいじらない形で進める必要があるのです。)

自分はjavaも触ったことがなかったので、基本的なこと質問かもしれませんがよろしくお願いします。

Koutarou Tanaka

unread,
Feb 17, 2011, 12:30:32 AM2/17/11
to android-g...@googlegroups.com
田中@from_kyushuと申します。

androidのDalvikVMでは分かりませんが、JVMは制限があります。
詳しくはこちらを参照してください。

VM Spec The class File Format
4.10 Limitations of the Java Virtual Machine

また、3,4に関してはStack Overflowに同様の質問があり、GoogleのAndroidデベロッパーが回答をしています。

Android exception in dalvikvm - Stack Overflow

ここを読む限り、あまり気にする必要はないようです。
あまり頻繁に起きるのでしたら、ここに書いてある通りバグレポートを上げるとよさそうです。

--
このメールは Google グループのグループ「日本Androidの会」の登録者に送られています。
このグループに投稿するには、android-g...@googlegroups.com にメールを送信してください。
このグループから退会するには、android-group-j...@googlegroups.com にメールを送信してください。
詳細については、http://groups.google.com/group/android-group-japan?hl=ja からこのグループにアクセスしてください。


ロドス

unread,
Feb 17, 2011, 1:07:20 AM2/17/11
to 日本Androidの会
田中さん さっそく詳細な情報がありがとうございます。助かりました。

1,2はJVMの仕様だったんですね。パラメーター数とかでも引っかかってそうな気がします。ちょっと解決を考えてみます。

3,4は、深刻な問題ではないのですね。
3のデバッグ実行(エミュではなく実機での)が遅いのがちょっと作業効率上困りますが、とりあえずこのまま進めています。

ありがとうございました。


On 2月17日, 午後2:30, Koutarou Tanaka <from.kyushu.isl...@gmail.com>
wrote:
> 田中@from_kyushuと申します。
>
> androidのDalvikVMでは分かりませんが、JVMは制限があります。
> 詳しくはこちらを参照してください。
>
> VM Spec The class File Format
> 4.10 Limitations of the Java Virtual Machinehttp://java.sun.com/docs/books/jvms/second_edition/html/ClassFile.doc...
>
> また、3,4に関してはStack Overflowに同様の質問があり、GoogleのAndroidデベロッパーが回答をしています。
>
> Android exception in dalvikvm - Stack Overflowhttp://stackoverflow.com/questions/4936758/android-exception-in-dalvikvm

k.yo...@chime.ocn.ne.jp

unread,
Feb 18, 2011, 3:58:59 AM2/18/11
to android-g...@googlegroups.com
Javac というかJavaはセルフ相対符号付き16ビットです。

ですから、例えばあるイメージ(.jpgでも、.png)でも
そのままバイト列に変換したクラスを作ったことがありますけれど
当然コンパイルできません。

当時作ったのは jpg2java -outjava="some.company.com.images.Hoge" hoge.jpg
のようなもので
public class Hoge implements Serializeble {
public byte [] image = {
...................
 |
|

普通にjavacが通りませんでした。

C とは言語仕様が違うと実感したのはその時以来です。
ですから何でもかんでもプロパティにしたり。

でも確か、
jpg2javabuilder.java

{
Hoge hoge = new Hoge;
byte [] b = readfromfile (filename);
hoge.image = b;
oos = new ObjectOutputStream (FileOutputStream (outfile));
oos.write (hoge);
}

でシリアライズはできたように覚えています。
勘違いならごめんなさい。

ロドス

unread,
Feb 21, 2011, 12:29:53 AM2/21/11
to 日本Androidの会

なるほど。ソースにデータ埋め込む時も注意必要なんですね。
byteの扱いの違いは、シフト演算あたりでもひっかかりました。
がんばって精進します。


ありがとうございます。
Reply all
Reply to author
Forward
0 new messages