1

かなり大きなファイルをロードすると、Java プログラムが (Eclipse で) クラッシュします。

VisualVM を実行しましたが、クラッシュする前に CPU の使用率が 20% でピークに達し、ヒープ サイズもそれほど大きくないようです。クラッシュ時に実行されているスレッドの数は ~20 です。

エラー メッセージは表示されますが、クラッシュが発生するたびに表示されるわけではありません。表示される 2 つのエラー メッセージは次のとおりです。

[エラーが多すぎて中止]

# Java ランタイム環境によって致命的なエラーが検出されました:

#

# pc=0x00007f096d096942 での SIGSEGV (0xb)、pid=12102、tid=139678234564352

#

# JRE バージョン: 6.0_24-b24

# Java VM: OpenJDK 64 ビット サーバー VM (20.0-b12 混合モード linux-amd64 圧縮 oops)

# 派生: IcedTea6 1.11.5

# ディストリビューション: Ubuntu 12.04 LTS、パッケージ 6b24-1.11.5-0ubuntu1~12.04.1

# 問題のあるフレーム:

# J java.util.HashMap.put(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;

2 番目の警告に関連するスレッドを見つけましたが、ハードウェアの問題を示唆しているようです。大きな入力ファイルの特定のインスタンスでのみ発生するように見えるため、私のエラーはソフトウェアにあると思います。

どんな助けでも大歓迎です。

4

2 に答える 2

5

X量のメモリを使用する許可が与えられている場合、JVMはクラッシュしますが、システムにはそれを与えるためのメモリがありません。たとえば、512MB(-Xmx512m)を使用できると言っていましたが、プログラムのヒープは128MBしか使用していません。さらに384MBを割り当てることが許可されている必要があります。ただし、マシンがタップされたメモリをさらに割り当てる場合、OSが「いいえ」と表示すると、これらの状況でJVMがクラッシュします。CPU使用率を見ると、ヒープサイズは正常に見えますが、問題は、マシンにそれを提供するためのメモリがないことです。したがって、これが発生したときに合計メモリと空きメモリを確認し、メモリが不足していないかどうかを確認してください。

興味深いことに、JVMの上位メモリ(-Xmx)を下げると、より多くのメモリを割り当てる前にJavaがGCに強制されるため、クラッシュを防ぐことができます。ただし、下げすぎると、実行が遅くなるか、OOM例外がスローされます。これが、アプリを効果的に実行するために大きすぎたり小さすぎたりしないサイズを選択することが重要である理由です。また、事前に割り当てを増やしたり、メモリをより効率的に使用するようにプログラムを変更したりすることもできます。アプリの中心ではないメモリを消費しているプロセスをシャットダウンするか、単にメモリを追加購入する必要があります。

于 2012-11-27T01:13:05.283 に答える
3

OutOfMemoryExceptionEclipseが通常これらを報告していることは認めますが、おそらくそれは です。

ただし、起動されたアプリのヒープ サイズは IDE 自体のヒープ サイズとは異なり、デフォルトは非常に小さいことに注意してください (覚えていませんが、大きくはありません)。

デフォルトの起動プロファイルの VM 設定を確認するか、アプリ固有の起動用に VM を変更して大量のヒープを追加する-Xmx1Gなど

于 2012-11-27T01:12:12.770 に答える