忘却からのエントリへのJava --Day02
メモリ分析セクション
スタック、ヒープ、メソッドエリア:Java仮想マシンのメモリは、3つの領域に分割することができます。
スタック機能
- メモリモデルは、実行スタックの方法が記載されています。各方法は、スタックフレームが作成されると呼ばれる(格納されたローカル変数、オペランド、方法輸出)
- JVMは、各スレッドのスタックを作成し、スレッド情報(等実際のパラメータ、ローカル変数、)方法を実行するために記憶されます
- スレッド間で共有スレッドプライベート属しスタックは、達成することはできません!
- スタックの保存特性が「最後のアウト、LIFO」であります
- スタックは、システムによって自動的に割り当てられ、速い!スタックは、連続したメモリ空間です!
特性のヒープ
- ヒープは、作成されたオブジェクトと配列を(配列はオブジェクトである)を格納するために使用され
- すべてのスレッドで共有する唯一のJVMヒープ、
- ヒープは遅く、柔軟な非連続メモリ空間の割り当てです!
メソッドの地区の特徴
- JVMは、1つの方法だけ面積がすべてのスレッドで共有されています!
- 実際の方法は、唯一のストレージ・クラス定数関連情報については、ヒープ領域です!
- プログラムの内容は常に変更されない格納するために使用されるかのみを含みますクラス情報Classオブジェクト[]、静的変数、staticメソッド、文字列定数など)
非常に良いリンク:プログラムの実行について説明します。
ガベージコレクションの記事
メモリ管理
- 割り当てられたスペース:あなたは新しいキーワードを使用してオブジェクトを作成することができます
- オブジェクト空間をリリース:オブジェクトがnullを割り当てることができます。ガベージコレクタは、メモリ空間はすべて「到達不能」オブジェクトの責任となります取り戻します。
ごみリサイクルのコンセプト
任意のガベージコレクションのアルゴリズムは、一般的に、2つの基本的な事柄を実行します。
- 無駄なオブジェクトが見つかりました。
- メモリ空間の回復は役に立たないオブジェクトによって占有しました。
無駄なオブジェクトは、任意の変数の参照せずにオブジェクトを参照します。Javaのガベージコレクタは、関連するアルゴリズムによって無用の物体を発見し、除去と仕上げ。
ガベージコレクションのアルゴリズムに関連
1.参照カウント
各オブジェクトが参照カウントを持っているヒープ。カウントが0になるまでカウントがインクリメントされ、一度参照され、参照変数の値がnullになり、カウントはその後、役に立たないオブジェクトになり、減少します。利点は、不利な点は、「無駄な円形の参照オブジェクトが」など、認識していない単純なアルゴリズムです。
public class Student {
String name;
Student friend;
public static void main(String[] args) {
Student s1 = new Student();
Student s2 = new Student();
s1.friend = s2;
s2.friend = s1;
s1 = null;
s2 = null;
}
}
S1、S2は互いを参照し、彼らが参照カウントがゼロではありませんが、実際には役に立たないでしたが、認識できない原因となります。
方法アップ2.参照(ルート探索アルゴリズム)
マップとの間の関係を参照するように見られるように、すべての手順の後、ノードGCルートから開始対応する基準ノードを見つけ、ノードを見つけ、この基準ノードを探し続け、そして場合探しているすべての基準ノードが完了した後、残りのノードは、ノードを参照し、無用であるノードではないと考えられます。
3.世代別ガベージコレクション
世代別ガベージコレクション機構が事実に基づいている:異なるオブジェクトのライフサイクルは同じではありません。そのため、異なるライフサイクルのオブジェクトは、回収効率を向上させるために、異なる回復アルゴリズムを取ることができます。若い世代、旧世代、世代を持続:私たちは3つの状態に分けました。JVMのヒープメモリはエデン、サバイバーと終身/オールド・スペースに分かれています。
(1)若い世代
エデン領域上の全ての第一全て新たに生成されたオブジェクト。若い世代の目標は、に対応する、それらのオブジェクトの短いライフサイクル、クイックOFFとして収集することですマイナーGC各マイナーGCは、メモリの若い世代をクリーンアップします、このアルゴリズムは、高効率を使用していますレプリケーションのアルゴリズム頻繁な操作が、メモリ空間の無駄になります。オブジェクトの完全な場合は、「若い世代」ストレージ・エリア、オブジェクトは旧世代領域に格納されます。
(2)旧世代
Nの若い世代での経験(デフォルト15)は、第2のガベージコレクションのオブジェクトがまだ生きているの後に、それは古い世代に配置されます。したがって、オブジェクトの長いライフサイクルの一部に格納されている旧世代と考えられています。より多くの古い世代のオブジェクト、我々は、起動する必要があります主なGCとフルGC総合的なクリーンアップの若い世代と旧世代の地域のエリア。
(3)永久世代
例えばJavaクラス、メソッドなどの静的ファイルを格納します。ガベージコレクションの発生に有意な持続的な影響はありませんでした。
GCは、3種類の区別します:
- マイナーGC:若い世代のための領域をクリーンアップします。
エデンの面積は、それがマイナーGCをトリガーしますいっぱいです。、無用のオブジェクトをクリーンアップ「Survivor1」、「Survivor2」ゾーンへのライブオブジェクトをコピー(二つのゾーンを、空間の大きさが同じで、同じ時間Survivor1とSurvivor2空で一つだけ)- 主なGC:の古い地域をクリーンアップするために使用されます。
- フルGC:若い世代、旧世代領域をクリーンアップするために使用されます。高いコストは、システムのパフォーマンスに影響を与えます。
ガベージコレクションプロセス
- 大多数で新しく作成されたオブジェクトは、エデンに保存されます。
- エデンが一杯になると(一定の割合)は、ガベージコレクション(GC)をトリガーする、新しいオブジェクトを作成できない無駄なオブジェクトを一掃し、その後エデン地区を空にしながら、S1のように、サバイバーに残りのオブジェクトをコピーします。
- エデン領域が満杯再びとき面積がエデン・オブジェクトを空にしないが、物体のS1も、エデンを確保するためにS1、及びS1にされているコピー、S2として、他の記憶サバイバーに空にすることはできません空;
- 数回繰り返しは、(デフォルト15)サバイバーが洗浄されていないオブジェクトは、古いの旧ゾーンにコピーされます。
- 古い領域が一杯になると、ガベージコレクションの新世代は(minorGC)と呼ばれる前に、それは、一度、完全なガベージコレクション(FullGC)をトリガします
メモリリークの記事
フルGC
JVMを調整する過程で、作業の大部分は、フルGCに調整されます。全GCにつながる可能性があり、次の理由:
- 古い世代(終身の位置)に満ちています。
- 永久世代(パーマ)満ちています。
- System.gc()を明示的に呼び出す(GCではなくGCを呼び出すのでは、プログラムの開始を推奨)、できるだけフルGCを開始適用する、高コストであり、システムのパフォーマンスに影響を与えます。
- 前回は、動的割り当て戦略は、GC後の各ドメインヒープを変更します。
操作は、おそらくメモリリークが発生します
- 役に立たない多数のオブジェクトを作成します。私たちは、文字列連結の多くを必要とする場合、例えば、我々は代わりのStringBuilderの文字列を使用します。
- クラスの静的なセットを使用。メモリはこれらの静的変数の同じライフサイクルとアプリケーションに最も発生しやすいを使用してなどのHashMap、ベクトル、リスト、漏れたように、すべてのオブジェクトを解放することができないオブジェクト。
- 様々な接続オブジェクト(IOストリームオブジェクト、オブジェクトデータベース接続、ネットワーク接続オブジェクト)が閉じられていません。
- リスナーを使用してください。オブジェクトが解放されると、リスナーを削除しないでください。
記事オブジェクトの作成プロセス
オブジェクトの作成
コンストラクタは、Javaの新しいキーワード呼び出して、コンストラクタオブジェクト作成するための重要な方法である、コンストラクタは、クラスのオブジェクトを返していますが、オブジェクトが作成されますコンストラクタの責任ではありません。次の4つのステップに分けオブジェクトを作成します。
- 割り当てられたスペースおよびオブジェクトのメンバ変数は0または空に初期化されます
- 初期表示属性値の実行
- コンストラクタが実行されます
- 関連する変数へのオブジェクトのリターンアドレス
このキーワード
- これの本質は、「良好な標的アドレスを作成」することです!
- これはまた、「現在のオブジェクト」、コンストラクタで初期に約すなわちオブジェクトのために使用され得る、および構成方法で配置されなければなりません。
- これは静的なプロセスではありません。
遡及継承ツリー
属性/メソッドの検索順序
例:変数hを探します
- 現在のクラスを検索してもプロパティhを持っていません
- 順番にそれぞれの親は、オブジェクトまでの時間であれば、それぞれの親を見にさかのぼること
- 見つからない場合は、コンパイルエラーが発生します。
- 上記の手順は、単に時間変数を見つけ、その後、この処理を終了します。
コンストラクタの順序で呼び出されます
スーパー(...)は、対応する親クラスのコンストラクタを呼び出す:最初の文は、常にコンストラクタです。したがって、フローは次のとおりXianxiangバックオブジェクトの追跡、ブロック及び現在の日付サブクラスまで行う初期化クラスのコンストラクタメソッドを断ります。
注:静的な初期化ブロックの呼び出しシーケンスは、同じ呼び出しシーケンスコンストラクタで、繰り返されません。
ポリモーフィズム
注意点:
- 多型であります方法多型多型ではない属性(属性の独立した多型)。
- 複数の状態が3つの必要な条件を持っているがあります。継承、メソッドのオーバーライド、親子クラスオブジェクトへの参照。
- コンパイルの外観は、実行するために右に見て左に。
- 親サブクラスオブジェクトへの参照は、上向きの遷移のためのプロセスは、自動型変換です。親クラスまでの移行後に参照変数は、それを呼び出すことができますコンパイルタイプメソッドの実行時の型と呼ばれることができない方法。
- 操作タイプのユニークな方法が必須の変換タイプのニーズに呼び出す必要がある場合は、ダウンキャストと呼ばれます。
- 下方遷移過程において、参照変数は、実際のサブクラス型(ランタイム型)に変換されなければならない、または実行時に型変換が異常ClassCastExceptionが表示されます。
- この例外を回避するには、使用することができますinstanceofはオペレータが判断して、強力なオンにします。