2012-01-17 17 views
2

学校のプロジェクトでは、私は別の種類のアルゴリズムをプログラムする必要があります。問題は、私は動作するアルゴリズムがあるということです。しかし、私はそれを複数回実行する必要があり、それは私に次のエラーを与えるいくつかの時間後:OutOfMemoryErrorを解決するには?

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space

私はエラーが何を意味するか知っているが、それは実行中の空きスペースのためのJava検索を聞かせすることは可能でしょうか?私はそれがある時点で使用されていない多くのスペースを使用することを知っています。これは、アプリケーションの実行中に多くのオブジェクトをnullに設定し、新しいものをたくさん作成します。これは、メモリ不足のためです。

具体的には、nullに設定されているスペースをJVMに解放させることは可能ですか?または、プログラムが実行されている時間に空き領域を解放しますか?私はJVMをより多くのスペースに設定できることを知っていますが、遅かれ早かれ同じ問題に遭遇します。

IDEが必要な場合(IDE専用の場合)はEclipseです。

+0

[「java.lang.OutOfMemoryError:Javaヒープスペース」エラー(64MBヒープサイズ)の処理方法](http://stackoverflow.com/questions/37335/how-to-deal-with- java-lang-outofmemoryerror-java-heap-space-error-64mb-heap) –

+2

メモリが非常に少ない場合を除いて、何か間違っている可能性があります...ほとんどの学校プロジェクトでメモリの問題に直面してはいけません –

+0

http://stackoverflow.com/a/5121287/20394では、特に、Eclipseで実行する場合のメモリ量を増やす方法について説明し、残りの記事では、メモリの問題を診断して修正するための戦略について説明します。 –

答えて

2

Googleのガベージコレクションをご利用ください。 Javaは常に、使用していないオブジェクトからスペースを再利用することを目指しています。メモリが不足している場合は、-Xmxを使用してより多くのメモリを構成するか、コードを修正して少数のオブジェクトを保持する必要があります。 jvisualvmのようなプロファイラは、無駄なメモリ使用量を見つけるのに役立つでしょう。

0

メモリプロファイラを使用して、メモリの使用場所を判断します。 nullに設定することはめったに役に立ちません。あなたがOOMEを取得する前に、GCは常に実行され、できるだけ多くの空き領域が解放されます。

0

Q:「nullに設定されている空き領域をJVMに解放させることは可能ですか、プログラムが実行されている間に空き領域を解放してもかまいませんか?

A:はい、System.gc()への呼び出しを使用しますが、システムによって自動的に時々自動的に行われるため、問題が解決されない可能性があります。すべてのメモリを使用しているオブジェクトを見つけ、コード内で修正する必要があります。おそらくクリアされずに追加された可能性の高いリスト。

大規模なデータ構造を必要とする特に複雑なアルゴリズムを実装する際に、実際にこの問題が発生しました。私はこのウェブサイトに来て質問を投稿しなければならなかった。メモリエラーを避けるために、全く異なるタイプのオブジェクトを使用しなければならないことが判明しました。

ここにはquestionです。

+0

ありがとう、それは非常に便利な答えになるでしょう。私はループでポーズを使うことができます.Javaはカーベージを収集し、それが再び機能するかどうかを確認します。 – Nando

1

Oracle/Sun JVMを使用している場合は、Visual VM 1.3.3をダウンロードし、すべてプラグインをインストールして起動することをおすすめします。すべてのヒープ世代、スレッド、CPU、オブジェクトなどで何が起きているかを示します。どのクラスが最もヒープスペースを占めているかを示すことができます。

データがあればすぐに把握できます。

0

GCは自動的に '未使用'メモリを再利用するため、実行時に空き領域を解放することは可能ですが、可能な限り再利用されるものを理解することは重要です。 基本的には、オブジェクト自体に到達できない場合は、オブジェクトの領域を再利用することができます(ガベージコレクトされます)。 'スペースを空にする'と言うときは、にヌルに設定することでのオブジェクトへのリンク(参照)を1つだけ削除する可能性が最も高いです。これが唯一のリンク(参照)された場合にのみオブジェクトこのことができます

Object First= new Object(); //first object 
Object Second= new Object(); //second object 
Object SecondPrim=Second;  //second reference to second object 

First=null; 
// First memory will be reclaimed (sooner or later) 
Second=null; 
// there is still a reference to second object via SecondPrim 
// second object will not be reclaimed 

希望を取り戻すことができます。正確に何が起きているかを確認するために、私はあなたのプログラムの輪郭を描く第二の助言をします。

関連する問題