Javaのメモリ:ヒープ空間とガベージコレクタ

Javaはヒープ領域とガベージコレクションを介してメモリを管理する方法については、こちらをご覧ください。 メモリ割り当てを理解することは、Javaプログラムのメモリリークを避けるのを助けることができます。

A+ A-

最近、私は実行し、Javaアプリケーションを書いて、かなりの必要とするメモリを 、私はのOutOfMemoryエラーを取得するために開始しました:

 エラー:java.lang.OutOfMemoryErrorを:Javaのヒープ領域 

我々は、メモリ-がぶ飲みプログラムを実行する必要がある場合によく発生します。 以下は、このような問題を解決するには、いくつかの方法があります。

Javaヒープ・スペースとは何ですか?

まず第一に、ヒープ領域であるかを理解することができます。 まあ、Javaは主のアレンジでメモリを使用してヒープスタック 。 Javaはから渡されたパラメータ保持呼び出されたメソッドに呼び出し元のメソッドを (すなわちパラメータが押し込まと必要性に従って、スタックからポップされている)スタック構造の形で、。 一方、ヒープはJavaが作成したオブジェクトを保持するランダムアクセスメモリ空間です。 それは、オブジェクトを格納するのに十分なスペースが見つけた場所にJavaがこのヒープ領域内のオブジェクトを作成します。 だから、あなたは新しいオブジェクトを作成するとき(例えば、新しい文字列を() ;)オブジェクトはヒープ領域に作成され、それがに収まることができ、メモリを占有します。 ガベージコレクション中に、Javaは、もはや参照されているそれらのオブジェクトのヒープ領域を解放します。 参照の数(すなわち「必要」)オブジェクトは増加を続けていると我々は彼らを尊敬していない場合でも-the JVMは、ヒープ領域が不足しました。

クラスが必要となるメモリの量は、そのデータメンバの数と種類によって異なります。

  1. クラス自体は、8バイトの最小値を必要とします
  2. すべてのデータメンバは4バイト(ロング、ダブルは8バイトが必要)が必要です。 でもブール変数はそれだけで保存されている取得する1つのビットを必要とするものの、4バイトを使用しています。
  3. メモリの使用量は、8バイトのチャンクで育ちます
Javaプログラムの最適化

この問題を回避する最初のステップは、プログラムを通過し、それが少ないメモリを使用するようにするように修正することができる方法を参照してくださいする必要があります。 長いので、メモリのコストは、それが1960年代にあったものと比較して非常に低かったです。 そして、プログラマが自分のプログラムにメモリ手当の面でかなり贅沢になってきています。 しかしそれでも、少なからず、私たちは、利用可能なより多くのメモリを必要とするプログラムを記述する必要があります。 それはプログラムのクラッシュの可能性を減少させるだけでなく、時にはそれが実行速度を向上させるだけでなくので、メモリ使用量の文脈で倹約は常に良いです。

あなたは、彼らはもはやあなたのコード内で要求される場合はnullにならないようにオブジェクトを設定する必要があります。 あなたがオブジェクト(複数可)を作成しますが、彼らが必要とされていないときにそれらを破棄しないでループを実行している場合、これはさらに重要です。

Javaのガベージコレクタの方法をご利用ください

メモリ使用量の最適化に向けた第二段階は、明示的にガベージコレクションのメソッドを呼び出すことができます。 Javaは自動的に必要なと、このメソッドを呼び出すと、もはや参照されるオブジェクトが含まれているメモリ領域が解放されます。 しかし、あなたはまた、あなたのコード内で明示的にこのメソッドを呼び出すことができます(例えば、達成される「大きな課題」と次の「大きな課題」の後に開始されようとしています)。 ガベージコレクタを呼び出すには、次のコマンドを使用します。

 。Runtime.getRuntime()GC()。 

あなたは前とGC()メソッドが呼び出された後のメモリの状態を監視することができます。

 System.out.println( "nnCallingごみCollectornn");
System.out.println( "フリーメモリBEFORE:" + Runtime.getRuntime()freeMemory());
。Runtime.getRuntime()GC()。
System.out.println( "AFTERフリーメモリ:"。+ Runtime.getRuntime()freeMemory());
System.out.println( "nnGarbage収集finishednn"); 

freememory()メソッドは、バイト単位で測定された利用可能な空きメモリの量を返します。 ランタイムクラスによって提供される他の方法を参照のJava APIを

JVMに多くのメモリを与えます

メモリ使用量の最適化にもかかわらずのための取り組みは、時にはJVMは確かに多くのメモリを必要としません。 このような例では、指定された量のメモリを使用するには、コマンドライン経由でJVMを伝えることができます:

 javaの-Xms2000m -Xmx3500m 

-Xms-Xmxは JVMがあなたのマシンで使用できるスワップ領域(仮想メモリ)の量を指定するスイッチ。

-Xmsは、メモリの最小値(すなわち、最初の)量を指定します

-Xmxは JVMが使用できるメモリの最大量を指定します。

これらのメモリの値はメガバイト単位で指定する必要があります。

だから、これは、Javaについてのヒープ領域とガベージコレクション機構を介してメモリを管理しました。 これらは、スマートな選択であり、すべてのJavaプログラマは、Javaがメモリをどのように扱うかを明確に理解している必要があります。 あなただけが効率的にメモリ集中的に使用するプログラムに取り組むことができるようになります。

Ads

シェア

最近

あなたがLinuxの恋人している場合を探すために、ベストUbuntuの代替

さんが何かに精通取得することから始めましょう。 基本的な、少しオフトラック! あなたは今までLinuxとUbuntuの...

Gmailの受信トレイに署名を追加する方法 - GmailでGoogleの署名を追加します。

Googleによる受信トレイには、Googleが過去数年間に発売された最高のものの一つでした。 これは、統一された受信...

週刊技術のニュース:ノキア、Googleと任天堂

みなさん、こんにちは、それは金曜日、3月3日だとちょうどいつものように私たちは毎週のニュースラウンドアップに戻っていま...

初心者のためのラズベリーパイプロジェクト - あなたはラズベリーパイで何ができますか

ラズベリーパイは、低消費電力、ラズベリーパイ財団が作成したシングルボードコンピュータのシリーズです。 もともと発展途上...

Androidの2017のためのベストVPN - Androidの中でVPNを使用する方法

ゴーンは、VPNはハイテクsavviesやハッカーのためだけであった時代です! そして、私たちはこれらのサービスについ...

コメント