5

最近、Eclipseを使用してscalaでAndroidアプリを作成しました。私のプログラムにいくつかのクラス/アクティビティしかなかったまで、すべてが大丈夫でした。コードを追加すると、JVMがクラッシュし始め、Eclipseがフリーズすることが多く、adbは常に接続を失いました。タスクマネージャーは、Javaプロセスが800から1300MBのメモリを使用していることを示しました。

私のコンピューターのハードウェアパラメーターは、i7第3世代、8GB DDR3、SSD 256のように非常に優れています。したがって、それは理由ではありません。

また、私のソフトウェアは最新であり、Eclipseの最新バージョン、Android SDK、Scala、Java開発キット、すべてのEclipse用プラグインで構成されています。-vmargsはscala開発用に構成されていますが、まったく役に立ちませんでした。それで問題の原因としてそれを排除しました。

コードをJavaに書き直すと、everythigはうまくいき、プロジェクトを続行できます。

Androidプロジェクトでscalaを操作するための解決策をすでに見つけている人はいますか?私はこことグーグルグループでいくつかの同様のトピックを読みましたが、この質問に対する答えはありませんでした。

編集:

ビジュアルVMを使用してコードのプロファイルを作成しましたが、ヒープスペースの使用量は正常でした。これが私のコードの抜粋です。

imports ...

class MainActivity extends FragmentActivity {
  private lazy val timePicker = findViewById(R.id.timePicker).asInstanceOf[TimePicker]
  private lazy val spinner_sourceBank = findViewById(R.id.spinnerSource).asInstanceOf[Spinner]
  private lazy val spinner_targetBank = findViewById(R.id.spinnerDestination).asInstanceOf[Spinner]
  private lazy val myApplication = getApplication.asInstanceOf[MyApplication]
  private var ignoreTimeChange = false

  override protected def onCreate(savedInstanceState: Bundle) = {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)

    timePicker.setIs24HourView(true)
    initializeSpinner(spinner_sourceBank)
    initializeSpinner(spinner_targetBank)
  }

  private def initializeSpinner(spinner: Spinner) = {
    val adapter = ArrayAdapter.createFromResource(this, R.array.banks, R.layout.spinner_item)
    adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item)
    spinner.setAdapter(adapter)
  }

  def reset(w: View) = {
    timePicker.setCurrentHour(13)
    timePicker.setCurrentMinute(00)
    spinner_sourceBank.setSelection(0)
    spinner_targetBank.setSelection(0)
  }

  def submit(w: View) = {
    if (spinner_sourceBank.getSelectedItemPosition == 0 || spinner_targetBank.getSelectedItemPosition == 0) {
      new AlertDialog.Builder(this).setPositiveButton("OK", new OnClickListener {
        override def onClick(dialog: DialogInterface, which: Int) { dialog dismiss }
      }).setMessage(getString(R.string.alert_title)).setTitle("Alert Dialog").setIcon(android.R.drawable.ic_dialog_alert).create.show
    } else manageFragments(sourceBank, targetBank)
  }

  def manageFragments(sourceBank: String, targetBank: String) = {
    val fragmentTransaction = getSupportFragmentManager.beginTransaction

    if (targetBank == sourceBank) myApplication.setCurrentFragment(MyApplication.NOW)
    else myApplication.setCurrentFragment(MyApplication.FIRST_SESSION)

    fragmentTransaction.replace(R.id.fragment_container, myApplication.getCurrentFragment)
    fragmentTransaction.commit
  }

  override def onCreateOptionsMenu(menu: Menu): Boolean = { getMenuInflater.inflate(R.menu.activity_main, menu); true }
}

私は自分のアプリケーションをモバイルデバイスでテストすることができ、それはかなりうまく動作しました。コードを書くこともできましたが、eclipseは古いコンピューターで実行されたように動作しました。タブの切り替えには時間がかかり、ビルドとデプロイに時間がかかりました。

4

2 に答える 2

5

これらを eclipse.ini に追加 (または、存在する場合は編集) し、Scala 開発用に最適化します。これらは、-vm などの eclipse エントリの下に表示されます。

-Xverify:none
-Dosgi.requiredJavaVersion=1.6
-Xms900m
-Xmx900m
-Xss2m
-XX:PermSize=256m
-XX:MaxPermSize=256m
-XX:MaxGCPauseMillis=20
-XX:MaxHeapFreeRatio=70
-XX:+ScavengeBeforeFullGC
-XX:+UseParallelOldGC
-XX:+UnlockExperimentalVMOptions
-XX:+UseFastAccessorMethods
-XX:ReservedCodeCacheSize=128m
-XX:+TieredCompilation
-XX:+AggressiveOpts

可能性は低いですが、CMS GC を使用している場合は、CMS GC への参照をファイルから削除してください。

于 2013-01-05T21:01:01.000 に答える
-1

私はAndroid固有の開発ではこれを行っていませんが、「Scalaでの関数型プログラミングの原則」Courseraコースを行っているときに同様の問題が発生しました。結局のところ、Eclipse JVMのPermGenスペースが最大になり、あらゆる種類のランダムで混沌としたEclipseの動作が発生していました。舞台裏では、Scalaコンパイラーは、ほぼ同じサイズのJavaプロジェクトよりも何倍も多くのクラスファイルを生成していることがわかりました。そこで、Eclipseのコマンドラインスタートアップに以下を追加しました。

-XX:MaxPermSize = 256m

これまで、私は最も奇妙なEclipseエラーを抱えていましたが、最も奇妙な時期には、それらを一貫して再現するための合理的な方法がありませんでした。そして、コースの最初の3週間はこれを持っていました。コース用に明示的にダウンロードしたTypeSafeのバージョンのEclipseを使用していたため、コースをほぼ終了しました。上記をEclipseのJVMスタートアップに追加すると、別の問題は発生しませんでした。これを行う前にScalaIDEを安定して使用することができなかったので、ScalaIDEがどれほど素晴らしいか信じられませんでした。

お役に立てれば。

于 2013-01-05T18:57:34.710 に答える