Java仮想マシンに関連する(オブジェクトの作成、ガベージコレクション、クラスローディング、親委任モデル、ロックの最適化)

A.オブジェクトの作成プロセス

  新しい命令1.仮想機会、最初の実行クラスローダにあなたが一定のプールで発見し、クラスのロード処理のクラス実装するかどうかを確認することができれば、新しいクラスの表記法の裏をチェックし、そうでない場合は、

  クラスローダ後2.割り当てられるメモリを決定し、ヒープ(衝突ポインタ、空きリスト)の構造に基づいてメモリを割り当てますが、また、同時、おそらく二つのスレッドの割り当ての問題を検討します

メモリに割り当てられた2つのオブジェクトが、溶液をスレッドにスレッドを作成し、CAS失敗時の再試行を使用して適用、またはTLAB(ThreadLocalの)を使用したときの空間のようなヒープ小さな空間、

振れた後で、CASプラス再試行を使用すると、メモリの割り当てに失敗しました。

  3.最後に、クラスに属するハッシュコードは、そのオブジェクトのインスタンスは、GC対象世代年齢情報は、オブジェクトヘッダに格納されます。この時点で、オブジェクトを作成する仮想マシンが終了し、次のステップは、コンストラクタの初期化処理を実行することです。

オブジェクトインスタンスの組成

  オブジェクトヘッダ

    オブジェクトロック状態、ハッシュコード、GC世代年齢:1.必要なデータ・ストレージ・オブジェクトを実行し

    2.ポインタは、このオブジェクトは、インスタンスが属するを通して見出されます。

  オブジェクトの内容

  アライメントパディング

    いくつかは、オブジェクトのサイズが8バイトの整数倍である必要があります。

III。オブジェクトを使用します

  上面が基準であるが、参照の2つのタイプがありますポインタハンドル。

  1.ポインタ 

  、利点は、高速へのアクセス、ヒープアドレス上のオブジェクトへの直接参照されている、欠点は(ガベージコレクションメカニズム、交換するので)、参照の値を変更する必要があるオブジェクトは、常にヒープアドレスに変更されていることです。

  2.ハンドル

  スタック基準値を指すようにテーブルを処理する、付着効率の欠点は、可変基準ポインタの利点なしで、テーブルアドレスによって、オブジェクト、およびオブジェクトのクラス(面積法)のアドレスを処理することは高くありません。

IV。オブジェクトが生存しているかどうかを決定する方法

  参照カウント

    彼が死んだとき、オブジェクトはプラスへの参照があり、整数を維持し、マイナスいくつかの引用、ゼロ。循環参照があるためない、他の2つのオブジェクトのみが参照されます。

  到達可能性解析アルゴリズム

V.参照型

  そこのオブジェクトのようなクラスは、あるメモリは、メモリがオフのとき、彼らは生き残ることができないタイトであるとき、あなたは(そのようなキャッシング機能として)維持することができますので、参照型があり、捨てられたか引用されている参考文献は回復していないでしょうどちらか両極端。

  強い参照:参照型の通常の使用。

  ソフト引用:便利必ずしも必要ではないが、これらは回復し、メモリオーバーフロー例外の前に行われるようにする場合、オブジェクトを指し示します。

  弱参照:ガベージコレクション、次のなくなっをエスケープよりも弱いです。

  仮想参照:まだ回復し、ときに通知回復を発行する唯一の機能。

VI。リサイクルプロセス

  到達可能性アルゴリズムは、それがビットをマークし、存在するならば、F-キューキューにこれらのオブジェクトを配置する、(オブジェクトは一度だけ実行することができる)必要ファイナライズ()メソッドを決定するオブジェクトへの一つの基準を発見し、その後、その後、それをマーク

仮想マシンは、この時間が基準チェーンは、それがエスケープ(それオブジェクト参照のチェーンを参照すること)のエネルギーとのリンクの確立を確定場合(無限ループが他のオブジェクトに影響を与えますがあるので、成功した結論を保証するものではありません)、それらを実行するためにスレッドを作成しますない場合は、それを回収しました。

七の.GC回収メカニズム

  今、仮想マシンのほとんどはリサイクル管理のためのヒープの代わりに区別されます。

  新世代は:エデン地域、2つのサバイバーゾーンを含んでいます。複製アルゴリズム、マイナーGCを使用しました。

  歳:旧市街。マーク - 照合アルゴリズムの主要なGC。

  fullGCフルクリーンアップ

  ガベージコレクションプロセスは:エデンゾーンオブジェクトへの入金が失敗した場合、それは、プロセスがminorGCと呼ばれsurvivorTo領域にコピー到達可能性解析アルゴリズムの裁量エデン領域とsurvivorfromエリアライブオブジェクトであり、そして必ずしもMancaiエデン一般的ではありません使用しています。

  だからminorGC実行オブジェクトの後に15倍以上を乗り切る、生存者はまだ古い歳の年に保つ実際のオブジェクトの通常の98%を保証するメカニズムを提供するには、死んだChaoshengの夜なので、新世代領域は8に設定されています: 1:1、十分な。ラージ・オブジェクト(アレイ)又は

旧へのオブジェクトの直接の預金、古い時代をクリーンアップするために、古いトリガーFullGCのフルタイムの長い生存期間。

  前の年のそれぞれを判断するために許可されている場合は、古いよりも最大利用可能な連続スペースより大きいかどうかminorGCを行う前にチェックし続けjiupanduanyigeflagは、故障を保証するものではありませいる場合、古いオブジェクトの新しい世代を保持するための判断だろう能力が許されない古い時代の対象に前の昇進の平均をサイズは、ないfullGCに、にすることができます。

  到達可能性アルゴリズム:

 

 

シックス・ロード処理

  手順:ロード、検証、準備、解析し、初期化、使用してアンインストール。また、接続として知られているステップ2.3.4

       初期化時間を実行します

    ときにオブジェクトまたは静的コード1.newを呼び出すことで、

    2.反射を通してオブジェクトを作成します

    3.オブジェクトのサブクラスを作成するプロセスの実装では、親クラスの初期化を実行します

    4.仮想マシンの初期化初期化メインが属する起動します。

  ロード:クラスオブジェクトを生成するクラスベースのバイナリバイトストリームの完全修飾クラス名を変換することもできます。

  検証:要件を満たすかどうかを決定するために、バイトストリームファイル情報は、Java仮想マシン自体を危険にさらすだろう。

  調製:クラス変数は、メモリ(面積法)を割り当て、ゼロにクリアします。

  解像度:クラス参照の定数プールを設定します。

  初期化:初期化コードがプログラムを実行します。

クラスローダ:ステップ実行クラスをロードし、バイナリバイトストリームに変換、クラスの完全修飾クラス名を使用して、クラスコードを見つけます。

 

親委譲モデル

  モデルは継承システムクラスローダ(実際には継承の組み合わせが実装されていない)、次のクラスローダを導入することをいいます

ブートクラスローダ:仮想マシンが来るには、(C ++書かれた)<JAVA_HOME> /ライブラリは、仮想マシンのlibディレクトリにロードされるロードすることができます

拡張クラスローダ:LIB / extディレクトリの下に、<JAVA_HOME> /ライブラリー

アプリケーションクラスローダ:ライブラリユーザクラスパスをロードし、また、システムクラスローダと呼ばれます。

他のユーザーが記述したクラスローダ:継承されたアプリケーション・クラス・ローダーの組み合わせです。

クラスのロード処理:要求の受信をロードするクラスローダ、彼は私がこのパス・ロードでは、サブクラスがロードしようとすることはできませんトップレベルになるまで、その親クラスの男性、親クラスローダプロセスを委託。

ないこのモデルでは、クラスをロードするには、2つのローダは、矛盾の問題と同じタイプがあるだろう場合は、マルチを確保するために、親のデリゲートメカニズムをクラスローダと彼自身のユニークな識別することにより、:両親を使用する利点は、モデルを委任しますローダは、クラスをロードするとき、最終的にローダによってロードされ、その最終的な負荷同じ結果を保証します。

 

両親は損傷モデルを委任:JDK1.2親委任モデルを導入する前に、カスタムクラスローダがあるだろう前に、のloadClass()クラスをオーバーライドするユーザーがロードされたこの時間は、モデルの導入後、メソッド呼び出しそれはように、親クラスローダが、カバーできません

彼は、この方法でメソッドを書き換えるにfindClassための呼び出しを追加しました。

実施JDBCの2:元々Class.forNameの()

そして、マネージャー管理ドライバが、その後、

         // 1.加载数据访问驱动
        Class.forName("com.mysql.jdbc.Driver"); //2.连接到数据"库"上去 Connection conn= DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb?characterEncoding=GBK", "root", "");

public class Driver extends NonRegisteringDriver implements java.sql.Driver { public Driver() throws SQLException { } static { try { DriverManager.registerDriver(new Driver()); } catch (SQLException var1) { throw new RuntimeException("Can't register driver!"); } } }
これは、前にClass.forNameである()は、実際に静的コードブロックを引き起こし、その後、MySQLドライバの実装でのDriverManagerに登録。
しかし、その後、
 Connection conn= DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb?characterEncoding=GBK", "root", "");

ここでは、上記のClass.forName()登録プロセスを排除し、直接アクセス接続を見ることができます。
今、我々はプロセスであり、どのようなこの元SPIのサービスを利用した解析モデルを見てみましょう。

  • まず、META-INF /サービス/に、java.sql.driverファイルから特定のカテゴリ名「はcom.mysql.jdbc.Driver」を取得
  • 第二に、このクラスをロードし、ロードするためだけにClass.forName(「はcom.mysql.jdbc.Driver」)と確かにそこにあります

さて、問題は)、Class.forNameの(あるクラスローダは、発信者がロードされ、呼び出し側がrt.jarのDriverManagerの中で、ClassLoaderクラスローダが起動しますが、確かにはcom.mysql.jdbc.Driverないことです<JAVA_HOME> / libの下に、このクラスでMySQLをロードできなければなりませんので。これは、モデルの親デリゲートの制限で、親子クラスローダがクラスローダのパスをロードすることはできません。

特別な設定は通常、デフォルトのアプリケーションクラスローダによって使用される親クラスから継承されていない場合は、Thread.setContextClassLoaserが提供するスレッドコンテキストクラスローダ()メソッド

もちろん、スレッドコンテキストクラスローダは、親クラスローダは、親の委譲モデルの原則を破ったクラスをロードするために子クラスローダを呼び出すことができますことができます


最適化のロック:Javaのセマフォ機構は、オペレーティング・システムを実装するために使用されているため、ロック、カーネルモードを切り替える必要がある、とスレッド、非常に時間がかかるので、最適化されたロックの切り替えのロックが発生します。
  最適化されたロックアクセス:適応スピンロック:ロックを待ってブロックしませんが、それはロック時間を保持しているスレッドのほとんどはそう、我々はできるデータのシェアを得て、非常に短くなることは時間の無駄である、と研究後に発見されました一定時間内に障害なく、サイクルロックを決定し、この可変時間最後の選択、オプションの高成功率、その選択少し長く、これが呼び出された適応に基づきます。
  ロック排除:共有変数へのより多くのアクセスを表示されない、同期ブロック内の仮想マシンが直接などのStringBufferとして、排除ロックします。追加()メソッド、すなわち、内部シンクブロック、及び方法の内側このメソッドを呼び出すが自動的に除去されます。
  ロック粗大化は:ほとんどの場合、ロックの粒度は、より良い、しかし、文のサイクルのロックは、そのたびにサイクルがアンロックをロックする必要がある場合にのみ、それが粗大化をロックします、たとえば、より詳細です粗大化が解消することはできません。
  軽量ロック:オブジェクトヘッダ01がロックストレージオブジェクト記録ヘッドを作成し、ロックされ、その後、操作対象CASが更新した場合、第1マークワード・ポインタ・ロック・レコードを指すように更新されていない場合、ロックフラグビットが、決定されますさもなければ膨張ヘビーロック、実行に成功したことを更新し、ポインタが実行されたシンクブロックに直接独自のスレッドを参照している場合どの決定することができませんでした。CAS記録ヘッドとオブジェクトのコンテンツの切り替えの使用上のロック解除ロックは、それはあまりにも動いていた説明に失敗し、我々はスレッドを覚ます必要があります。
  バイアスされたロック:バイアスロックパラメータを投入後、仮想マシンの設定後、最初のスレッドは、ロックオブジェクト、オブジェクトヘッドロックフラグは、「01」のバイアスモード、およびスレッドIDオブジェクトがヘッドに記録されているように設定されているを取得するようにスレッド後すべてのロックは、直接オブジェクトにアクセスすることができます。それは現在使用されているロック・オブジェクトに応じて、それをアクセスするために他のスレッドがある場合は、使用しない場合、例えば、操作が繰り返され、使用されている軽量なロックに変換する場合は、消去する傾向があります。


おすすめ

転載: www.cnblogs.com/gmzqjn/p/11761026.html