詳細JVM顔質問

  1. Javaのメモリ管理の説明のほかに、ガベージコレクションとチューニングツールの原則は、Javaを使用
    、メモリの割り当てのために再利用メモリをメモリ管理の責任を。しやすい自動メモリ管理なかっ言語/プラットフォームん
    エラー。
    典型的な問題は、ポインタをダングリング問題、ポインタ参照につながる、回収されたメモリアドレスなどが
    プログラムを実行し、完全に不明ですが。
    別の典型的な問題は、メモリリークは、メモリが割り当てられているが、そのメモリ・ポインタへのポイントを持っていない
    メモリリークが生じます。プログラマは、このような問題のデバッグに多くの時間を費やしています。
  2. 説明読み込みクラスファイルのJVM原則メカニズムは、
    JVMクラスのロードを達成するためのクラスローダ(クラスローダー)とそのサブクラスによって決定され、クラス内のJava
    ローダが実行するための責任がある重要なJavaランタイムシステムコンポーネントであり、見つけ、クラスでクラスファイルをロードする場合。
    ジャワのクロスプラットフォームな性質として、コンパイルされたJavaソースコードが実行可能プログラムではなく、
    以上のクラスファイル。プログラムは、Javaクラスを使用する必要がある場合、JVMは、クラスがロードされていることを、接続を確認します
    (検証、準備および分析)と初期化を。ローディングは、データのクラスは、メモリ内の.classファイルタイプを読み込む意味
    通常バイトのアレイを作成する.classファイルに読み込まれ、その後、クラスがロードされ、対応するオブジェクトのクラスを生成します。ロード
    が完了するとは、Classオブジェクトはので、この場合にはクラスがまだ利用できない、完全なものではありません。クラスが接続フェーズにロードされた後とき、
    検証、製造(静的変数として割り当てられ、デフォルトの初期値を設定してメモリ)及び解析を含む、この位相(シンボル
    の3つの手順を参照し、直接参照を置換されています)。最後に、JVMクラスが含む、初期化される:1)が直接クラスである場合
    、親クラスがクラスが初期化されていない場合、親クラスを初期化する; 2)クラス初期化ステートメントが存在する場合、
    それは順次初期化ステートメントを実行します。
    ローダルート(ブートストラップ)、プラス拡張:クラスは、クラスローダを含む完成されたクラスローダによってロードされる
    ローダ(拡張)、システムローダ(システム)およびユーザ定義のクラスローダ(java.lang.ClassLoaderのを
    サブクラス)。Java 2(JDK 1.2)を出発して、クラスローディングプロセスは、父親委託機構(PDM)を採用しました。PDM
    ブートストラップローダがルートであるとのより良いが、Javaプラットフォームの安全性を保証する、このメカニズムでは、JVMが来る、
    他のローダは、唯一の親クラスローダを持っています。親クラスローダがロード要求、親クラスに加えて最初のクラスをロードする
    独自のサブクラスローダがロード場合ローダー無力を。ブートストラップJVMは、Javaプログラミングのために用意されていません
    参照。以下は、いくつかのクラスローダの説明で
    、一般的にネイティブコードを使用して実装ロードJVMの基本的なコアライブラリ(rt.jarの)責任がある;:ブートストラップに
    拡張:システムライブラリのディレクトリ指定された属性からのjava.ext.dirsロード親がロードされた
    ブートストラップに、
    システム:アプリケーションクラスローダーと呼ばれる、その親が拡張したものです。これは、最も広く使用されているクラスローダです。
    これは、環境やシステムディレクトリ属性のjava.class.path説明クラス指定したユーザーからの変数をクラスパス
    カスタムデフォルト親ローダーローダー。
  3. JVMは原則について話しますか?メモリリークやオーバーフローの違いは?ときにメモリリーク?
    回答:
    JVMの原則は:
    JVMが全体Javaはクロスプラットフォームの実現であるJava仮想マシン(Java仮想マシン)、の頭文字である
    すべてのJavaプログラムのコア部分は、最初にすることができますクラスファイルの.classこのクラスファイルの中にコンパイルされます仮想内
    マシン実行、そのクラスのマシンのオペレーティングシステムに直接対応していないが、間接的に仮想マシンとを介して
    オペレーティングシステムとの対話、仮想マシンによって手順を実行するには、ローカルシステムに説明します。JVMは、Javaプラットフォームの基盤であり、そして実際の
    機械の際には、それはまた、独自の命令セットを持っており、実行時にメモリの異なる領域で動作します。JVMを引っ張ることによって
    、オペレーティングシステムとCPUアーキテクチャのような特定の実装で、プラットフォームに依存しない、すなわちのコード実行の方法が提供され、
    ホストハードウェア、ホストオペレーティングシステムとは独立。JVM主な仕事は、CPUに命令の独自のセット(すなわち、バイトコード)を説明することである
    命令セットまたは悪意のある嫌がらせことから保護ユーザに対応するシステムコール。Javaソースファイルの上JVMは
    、それはクラスファイル(.classファイル)によって生成されたソースファイルだけを懸念し、懸念されていません。
    メモリリークとオーバーフローとの差:1)メモリのうち、割り当てられたメモリリーク手段は、回収することができません。2)システムの範囲を超えてプログラムメモリ手段のメモリのオーバーフロー要件はオーバーフローに割り当てることができます。そのような使用として
    記憶10000このデータバイト型の変数は、メモリのオーバーフローに属します。
  1. メモリオーバーフローが十分なメモリを提供することであると、メモリリークがメモリリソースを提供することができません。
    ときにメモリリーク:
  2. 静的コレクション:セット、ベクトル、HashMapのや他のコレクションクラスを使用する場合、があるかもしれない特別な注意を払う必要があり
    、メモリリークが発生する可能性があります。これらのセットが原因でアプリケーションとそのライフサイクルの、静的として定義されている場合に
    限り、この時間として、メモリリークが発生することがあります。
  3. リスナー:ではJavaは、私たちはしばしば、このようなリスナーに制御クリックを追加するなど、リスナーに使用し
    たオブジェクトが内部引き起こす可能性がリスナー、削除することを忘れますときaddOnClickListener()が、しばしば解放
    メモリリークを。オブジェクトが解放されたときには良い方法は、避けることができるすべてのリスナー、リリースを忘れてはならないされ
    たリスナーので、原因メモリリークを。
  4. 様々な接続:接続がへの明示的な呼び出した場合、Javaデータベース接続、ネットワーク接続、および接続されたIOを含む
    そのclose()メソッドは自動的に閉じられていない、これらの接続を回復することができず、GCは、メモリリークを引き起こします。一般的な
    場合、tryブロックで接続を作成し、接続がfinally節でリリースされ、そのようなAのメモリリークを回避することができます。
  5. 外部参照モジュール:メモリリークを防ぐために注意しなければならない場合は、外部モジュールを呼び出します。モジュールAは、コール
    パブリックボイドレジスタ(オブジェクトo)のようなモジュールBの外部メソッドを、 。この方法は作る可能性を有する
    モジュールは、着信オブジェクト参照を保持し、この時間が必要とBのモジュールのような参考文献の除去のための方法を提供するかどうかを確認する
    )(登録解除。それは書面である必要があり、それを検出することがより困難であり、この状況は、見過ごすことは容易であり、メモリリークが発生し
    、コード中にこのような問題に注意を払う必要があります。
  6. シングルトン:メモリリークが発生する可能性があります使用にSingletonパターン。初期化後ためにシングルトンオブジェクト
    ライフサイクルを通じてメモリにJVMは、その外部オブジェクト(比較的短いライフサイクル)の参照を、保持している場合
    、それはメモリリークが生じる、この外部オブジェクトを回収することができません。外部オブジェクトは、他のオブジェクトに保持されている場合は
    、参照し、その後、メモリリークは、このような場合に特別な注意を必要とする、より深刻になります。この状況は、単一の下で検討する必要が
    まったくメモリリークを確保するべきではないか、問題になることはありません-caseモデル設計。
  1. GCスレッドがデーモンスレッドでありますか?
    GCスレッドがデーモンスレッドです。デーモンスレッドとスレッドは、非デーモンスレッド(すなわち、ユーザ・スレッド)に分割されます。限り、現在のJVM本物として
    ケース非スレッドデーモン、すべての作業上のデーモンスレッドを存続超えるいずれかにありません。場合にのみ、最後の非守備の
    スレッドの終了を保護する際に、作業の終了と、スレッドガードJVMで。
  2. Javaクラスローダは、各クラスローダは、これらのクラスをロードするために持っているものを、親が何であるかを
    委任モデル、何をしているのですか?

    階層のクラスローダが、上から下へ、以下の3種類に分けられる:
    (1)開始クラスローダ(ブートストラップクラスローダ)
    JAVA_HOMEに格納されている責任クラスローダ/ LIB、またはパラメータは-Xbootclasspath
    パスを指定し、仮想マシンの識別ライブラリは、仮想マシンのメモリにロードされます。スタートクラスローダはできません
    直接Javaプログラムを参照すること。
    (2)拡張されたクラスローダ(拡張子のClassLoader)
    のjava.ext.dirsあるローダは、ローディングJAVA_HOME / LIB / extディレクトリまたはシステム変数の原因である
    すべてのライブラリ、開発者指定されたパスが直接拡張を使用することができますクラスローダ
    (3)アプリケーションクラスローダ(クラスローダアプリケーション)
    この荷重はクラスローダgetSystemClassLoader()メソッドの戻り値が、それは一般的に
    システムクラスローダと呼ばれます。直接することができ、ユーザクラスパス(クラスパス)指定されたライブラリをロードする責任がある
    アプリケーションは、一般的に、これは、独自のカスタムクラスローダでない場合、ローダーを使用して接続されている
    デフォルトのクラスローダでのプログラム
    の両親の代理人モデル:
    両親の委任モデルは、トップレベルのブートローダーのクラスに加えて、他のクラスローダは、独自の親クラスの持っている必要があり必要と
    ローダーを。ここでは、継承のクラスローダ間の親子関係は、一般的に実装されますが、の組み合わせを使用できません
    親ローダのコードの再利用との関係
    :作業プロセスを
    クラスローダの負荷がクラスが要求を受信した場合は、それが最初にこのクラスをロードしようとするために所有していませんが、
    要求はそれぞれを完了するために、親クラスローダに委譲されますクラスローダのレベルはとてもすべて、真実であるプラス
    アップロード要求は、親クラスローダのフィードバックは、彼らが終了できないときにのみ、ブートクラスローダのトップに最終的に渡されるべき
    検索範囲で見つからないこの要求(にときに、所望のカテゴリ)、サブローダは、独自のをロードしようとします。
    利点:
    そのクラスなどのJavaクラスローダは、一緒に優先度レベルとの関係を持っています。例えば、オブジェクトクラスの場合、
    それは関係なく、最終的には、ブートクラスローダに割り当てられているこのクラスをロードするクラスローダーの、rt.jarの置く
    オブジェクトクラスは、様々なクラスローダ環境プログラムであるので、負荷へ同じクラスには、2つのクラスが決定し
    、同じでも、同じクラスファイルにようにすることを、このclassloader.class方法であるか否かの
    2クラスローダがロードされている場合、それらは異なるクラスです。
    示すように、プロセスのロード:
  3. (GC)は根拠ガベージコレクタは何ですか?ガベージコレクタはすぐにメモリを再利用することができますか?
    お知らせどのように仮想マシンのガベージコレクション?
    A:
    1、GCのため、プログラマはオブジェクトを作成するには、GCは、アドレスだけでなく、オブジェクトのサイズ監視始まった
    使用法を。典型的には、レコードを用いたGCは、すべてのオブジェクトを有し、図1の実施形態にヒープ(ヒープ)を管理します。これにより、
    オブジェクトがあるオブジェクトは「到達可能」である、方法、決定する「到達不能に。」GC「ではないとして、ターゲットを識別するとき
    まで」を、GCは、メモリ領域を解放する責任があります。
    2、缶。プログラマは手動にSystem.gc()、GCの実行を通知し実行することができますが、Java言語仕様ではない
    GCが実行されます保証するものではありませ。
  4. System.gc();又はRuntime.getRuntime()GC();
  5. Javaのメモリリークが行う、説明してくださいます。
    :理論的にはJavaのガベージコレクション(GC)があるので(また、Javaが広くされている何のメモリリークが生じない
    パンは、サーバー側のプログラミングの重要な原因のために使用される);しかし、実際の開発では、そこに役に立たないことが、アップも
    GCメモリリーク回収することができないオブジェクトが発生する可能性があります。一例では、休止セッションである
    オブジェクト(キャッシュ)が一貫した状態に属し、ガベージコレクタは、これらのオブジェクトを回復しないであろう、しかし、これらのオブジェクトが
    存在する無駄なジャンクオブジェクトであってもよいです。次の例のJavaのメモリリークで何が起こるかも示しています
    com.bjsxtのためのパッケージ変更、
    インポートjava.util.Arrays;
    インポートjava.util.EmptyStackException。

パブリッククラスMyStack {
プライベートT []の要素;
プライベートint型のサイズ= 0;
プライベート静的最終int型INIT_CAPACITY = 16;
公共MyStack(){
要素=(T [])新しい新しいオブジェクト[INIT_CAPACITY];
}
公共ボイドプッシュ(T ELEM){
ensureCapacity( );
元素【サイズ++] = ELEM;
}
パブリックT POP(){
IF(サイズ== 0)
()とスロー新しい使って、新しいEmptyStackException、
リターン要素[ -サイズ];
}
プライベートボイドensureCapacity(){
IF(= elements.lengthサイズ=){
要素= Arrays.copyOf(要素,. 1つの+ 2 *サイズ);
}
}
}
上記のコード実装スタック(最後のアウト(FILO))構造、一見有意Qはないと思われます
質問は、それもあなたが書いたユニットテストの様々なを介して行うことができます。しかし、ポップ方法の一つが、メモリは求めない漏れがある
私たちが使用するオブジェクトスタックをポップメソッドをポップするときにものスタックと、オブジェクトがガベージコレクトされることはありません、質問を
もはや内部スタックのメンテナンスので、これらのオブジェクトを参照するプログラムこれらのオブジェクト参照(廃止の満了
参照)。言語サポートのガベージコレクションでは、メモリリークは、このメモリリークが実際には、非常に微妙である
無意識のオブジェクトが残ります。オブジェクト参照が無意識まで保持されている場合は、ガベージコレクタはでていない
物理的なオブジェクト、それもほんの数などのオブジェクト場合、オブジェクト参照内の他のオブジェクトを扱うことはありませんが、また、
オブジェクトの多くを引き起こす可能性があります彼らはなります極端な場合には、パフォーマンスに大きな影響を与える、その結果、ガベージコレクションから除外されている
ディスクのページング(物理メモリと仮想メモリのスワップ・ハード・ディスク・データ)、さらには原因につながる
のOutOfMemoryError。
579 GCそれは何ですか?なぜそこGCすべきですか?
A:GCは、ガベージコレクションの手段であり、メモリの扱いが問題にどこプログラマはやすく、忘れたり誤った
メモリの回復プログラムが不安定になったりしてもシステムがクラッシュにつながる、ジャワで提供GC機能は、オブジェクトを自動的に監視することができます
範囲を超えて自動の目的を達成するためには、メモリを再利用するように、Java言語は、割り当てられたメモリの重要なリリース提供していない
操作方法が示されています。Javaプログラマは、ガベージコレクタが自動的に管理されるため、メモリ管理を心配する必要はありません。要求に
次の呼び出しガベージコレクションのいずれかの方法、:.にSystem.gc()またはRuntime.getRuntime()GC()がコール表示をリサイクルJVMガベージをマスクすることができます。
効果的にメモリリークを防ぐことができますガベージコレクションは、メモリの効率的な利用を使用することができます。ガベージコレクタのように、通常
時または死のメモリヒープの予測不可能な長さの場合には、低い優先度を実行している別のスレッド
クリア及び再循環するために使用されていない間のオブジェクト、プログラマは、リアルタイムのガベージコレクションと呼ばれることができませんオブジェクトまたはデバイスに
ガベージコレクションのオブジェクトを持っています。早い出産でJavaは、ガベージコレクションは、サービスのため、Javaの最大のハイライトの一つである
メモリリークを有効に防止する必要性のプログラマ側が、物事が変更されている、と今Javaのガベージコレクションを持っている
となって批判するために何かを。IOSモバイルインテリジェントなエンドユーザーは、通常、システムのAndroidよりも、より良いシステムを考える
根深い理由は、ガベージコレクションのAndroidシステムの予測不可能な性質ということである、ユーザーエクスペリエンス。
追加:ガベージコレクション、インクリメンタルガーベジバックをマーク、世代コピーガベージコレクション:ガベージコレクションを含め、多くのある
他の手段を集めます。標準のJavaは両方のスタック、ヒープが処理します。オリジナルのスタック型のローカル変数保存、作成するために、ヒープを保存する
オブジェクトを。基本的なアルゴリズムのヒープメモリの回復と再利用のためのJavaプラットフォームは、マークとスイープと呼ばれているが、Javaのために
、それが改善されました、「世代別ガベージコレクション。」Javaのオブジェクトヒープメモリのライフサイクルに従います。このアプローチは
異なる領域、ガベージコレクションプロセスに分割して、異なるエリアに移動する可能性があるオブジェクト:
•エデン(エデン):これは最初のターゲット領域の誕生である、とします彼らは唯一のあるほとんどのオブジェクト、
一つは地域に存在していました。
•サバイバーパーク(サバイバー):エデンの園からは、オブジェクトがここに移動されますダウン生き残りました。
•生涯ヤンガーデン(終身在職権):これは、オブジェクトの存続古い十分の運命です。若い世代のコレクション(マイナー-GC)
プロセスは、この場所に触れるつもりはありません。若い世代が人生を楽しんで公園に収集オブジェクトは、それが引き金となることができない場合は
、完全なコレクション(メジャーGC)を、また、ラージオブジェクトのための十分なを解放するために、圧縮が伴うことが
スペース。
JVMのガベージコレクション関連のパラメータ:
•-Xms /初期ヒープサイズ-Xmx --- /最大ヒープサイズ
•-Xmn ---若い世代のヒープサイズ
•-XX:-DisableExplicitGC ---システムをしましょう。 GC()任意の効果はありません
•-XX:+ PrintGCDetailを--- GCの詳細印刷
•-XXを:+ PrintGCDateStamps ---操作GCタイムスタンプを印刷

おすすめ

転載: www.cnblogs.com/linanana/p/12546332.html