1

そのため、Androidでクラッシュするコードがいくつかありますが、その理由はわかりません。

while(true)
{
    byte[] colorData = new byte[480*800];
    colorData = null;
    System.out.println("what");
}

「what」を3回出力した後、「Fatal Signal 11SIGSEGV」でクラッシュします(http://i.imgur.com/FYAsi2C.pngを参照)。間違いなくガベージコレクションを実行しているので、メモリが不足しているようには見えませんが、配列のサイズを小さくすると、クラッシュするのに時間がかかります。

colorData行を削除すると、コードは機能し、クラッシュしません。私はとても混乱しています。他のコードの一部である可能性がありますが、配列宣言を追加/削除すると、プログラムがクラッシュする/クラッシュしない理由がわかりません。

何か案は?

編集:

そのため、バイト配列のサイズを大きくしてプログラムを強制的にメモリ不足にすると、メモリ不足の例外が発生します。このセグメンテーション違反の原因は何ですか?

4

2 に答える 2

1

Java は通常、SIGSEGV でクラッシュ ログ ファイルを生成します。また、*nix システムでは .core ファイルが生成されます。これらのファイルは、クラッシュした場所のスタック トレースを知るために使用される場合があり、その多くが問題の原因につながります。

あなたのコードは私にとってはうまくいきます(Windows 7の64ビットJDK 1.7.0_13)。割り当てられたバイト配列はループの次の繰り返しで参照されなくなり、GC によって収集されるため、メモリを使い果たすことはありません。

とにかく、人々に助けてもらいたい場合は、より多くの情報を提供する必要があります。少なくとも次の情報を含めてください: Java バージョン (「java -version」を実行)、OS バージョン (Windows では「ver」を実行、*nix では「uname -a」を実行)、JVM によって生成されたクラッシュ ログ ファイル、あなたが何であるかの完全なソースランニング。

于 2013-02-04T11:21:33.230 に答える
1

colorData=null を設定した後に System.gc() を追加してみてください。これにより、オブジェクトの割り当てが強制的に解除されます。

于 2013-02-04T11:26:39.477 に答える