Javaの知識(2)

8.どのようなガベージコレクションアルゴリズム?

    1. オブジェクトがガベージであることを判断する方法

        1.1。参照カウント

        1.2。到達可能性解析

    2. 一般的なガベージコレクションアルゴリズム

        2.1 マーク -スイープアルゴリズム(マークスイープ)

        2.2 レプリケーションアルゴリズム(コピー)

        2.3 マーク -照合アルゴリズム(マーク・コンパクト)

        2.4。世代コレクションアルゴリズム(世代別コレクション)

    3. 典型的なガベージコレクタ

        3.1。シリアル/ SerialOld

        3.2。ParNew

        3.3。ParallelScavenge

        3.4。パラレル古いです

        3.5。CMS

        3.6。G1

   1.1。参照カウント

ジャワ、参照オブジェクトが関連付けられています。あなたがオブジェクトを操作したい場合は参照でなければなりません。これにより、簡単な方法は、オブジェクトを再利用することができるかどうかを決定するために参照カウントによるものであることは明らかです。すべての参照に関連付けられていないオブジェクトは、そのオブジェクトが使用しにくい場合は簡単に言えば、そのオブジェクトは、リサイクル可能なオブジェクトです。これは、参照カウントという方法です。このアプローチの問題は、問題が循環参照を解決できないということです。

   1.2。到達可能性解析

    基準サイクルカウント法を解決するために、問題を挙げたJava 到達可能性分析を用いる方法。一連の「GCのルート」検索の開始点としてオブジェクト。場合は、「GCのルーツは、」オブジェクトへの間に、最大パスがない、オブジェクトが到達不能であると言われています。リサイクルオブジェクトが到達不能オブジェクトは、少なくとも二つのマーキングプロセスであるとなり、到達不能なオブジェクトがオブジェクト回収と同等ではないことに留意されたいです。2つのマークはまだリサイクルオブジェクトである後に、それは回復に直面するだろう。

    2.一般的なガベージコレクションアルゴリズム

    2.1マーク - スイープアルゴリズム(マークスイープ)

    最も基本的なガベージコレクションのアルゴリズムは、2つの段階に分けマークされ、クリアされます。マークフェーズマークは、すべてのオブジェクトは、回復期が明確なスペースは、オブジェクトによって占有マークされ、回復する必要があります。
    2.2レプリケーションアルゴリズム(コピー)
    2.3数字- 。アルゴリズム(コンパクトマーク)仕上げ
    2.4世代コレクションアルゴリズム(世代別コレクション)。

    解決するためにマークスイープアルゴリズム不良メモリフラグメンテーションアルゴリズムを提案します。二つの等しいサイズにメモリを分割押しメモリ。すべての時間の使用メモリがいっぱいになった後に、この1のオブジェクトがまだ生きているとき、別のブロックまでのコピーが1つだけ、メモリの使用のためにクリアされています。

    欠陥を回避するために提案された上記2つのアルゴリズムの組み合わせ。マーク相とマークスイープ同じアルゴリズムは、タグは、オブジェクトをクリーンアップするが、メモリ内のライブオブジェクトの終わりに向かっていません。そして、オブジェクト境界の外端をオフにします。

    世代収集方法は、ほとんどのJVMで使用される方法で、核となるアイデアは、メモリが異なるドメインに分割されて生きている異なるオブジェクトのライフサイクルに基づいており、一般的には、GCヒープは、旧世代(テニュア/旧世代)に分割され、新世代(若い世代)。旧世代オブジェクトによって特徴づけられる少量にのみ、ガベージコレクションが回収されるたびに必要な、新世代の特徴は、ごみの多くは、各時間ガベージコレクションを復元するがある、様々な領域に応じて異なるアルゴリズムを選択することが可能です。

    3. 典型的なガベージコレクタ

    3.1。シリアル/シリアル古いです

    コレクターの最も古い、コレクタはそれを使用しているとき、あなたはすべてのユーザーのスレッドを中断しなければならないシングルスレッド、ガベージコレクションです。シリアル使用して、新しい世代のためのAコレクタ、コピーして、アルゴリズムをシリアル旧使用して古い世代に対するコレクタマークコンパクトアルゴリズム。利点は、シンプルかつ効率的で、欠点は、ユーザスレッドを停止する必要があります。

    3.2。ParNew

    Seral /シリアル旧マルチスレッドのバージョンは、ガベージコレクションのために複数のスレッドを使用しています。

    3.3。パラレル清掃を

    使用して、他のスレッドの回復時に一時停止することなく並列コレクターの新世代、コピーアルゴリズムを。主制御スループットを達成するための最初の2つの異なったコレクタ、コレクタ。

    3.4。パラレル古いです

    パラレル清掃を使用して、古い世代のバージョンの、マーク・コンパクトアルゴリズムとマルチスレッド。

    3.5。CMS

    現在のマークスイープコレクター最小リカバリー時間は、このように使用して、一時停止同時収集対象であるマークスイープアルゴリズム。

    3.6。G1

    G1(ガベージファースト)コレクタ技術の先端、コレクタのサービス指向の側には、をフルに活用することができますCPU やマルチコア環境を。予測可能な休止時間モデルを確立することが可能である、並列と並行コレクターです。


9.スレッドセーフなコンテナが持っている何ですか?

    9.1 Mapクラス2スレッドセーフなコンテナを提供します


    するjava.util.Hashtable

    ハッシュテーブルと同様のHashMapのは、ハッシュテーブル、ストレージ・キーマッピングされています。主な違いは、ハッシュテーブルは、スレッドセーフであるということです。私たちはハッシュテーブルのソースコードを表示するときは、Hashtableのメソッドがスレッドセーフ動作を実現するために、同期メソッドレベルの同期で行われている見ることができます。

    java.util.concurrent.ConcurrentHashMap

    ConcurrentHashMapのより良い性能のハッシュテーブル。両方のスレッドセーフが、ハッシュテーブルに対して、大幅に効率が向上しています。ReentrantLockのは、他の同時方式によって最適化されるよう私たちは、ハッシュテーブルを同期させる達成するために、スレッドセーフな方法で、推測することができ、それは、明らかです。ConcurrentHashMapのはReentrantLockのを使用しています。ブロックではなく、メソッドのロック分離技術、すなわちロック適用使用。機能しばらくConcurrentHashMapのは、同時変更操作を複数できるようにすることです。これは面白いです、私たちは一般的に書かれたが、相互に排他的である知っている、なぜ同じ時間は、それはより多くの書くことができますか?セグメントを使用して内部機構へのConcurrentHashMapは、多くの小片に分割ConcurrentHashMapのであろうからです。限り、あなたは小さな断片に書いていないと書き込みに複雑になることがあります。

  9. 2.Collectionクラス



    コレクションの一部は、の使用であるコピーオンライトのメカニズム、コピーオンライトメカニズム。文字通り、それは我々がコンテナ、初めてのレプリケーションのためのコンテナ、コピーの書き込みに要素を追加したときにということである意味を理解することができます。書き込み操作の後、コンテナ船の新しいコピーを元の基準点は、リフレッシュの書き込みを完了します。

     その実装の原則から、我々はこのメカニズムは、欠陥の存在であることがわかります。1. メモリフットプリント:間違いなく、それぞれの時間が必要で、元の容器をコピーするために再び書き込む際にコピーまたは元の容器自体の多くが比較的大きい場合、それは確かに多くのメモリを取るだろう。コンテナ要素を圧縮すると、過剰なメモリ消費を防止するために使用することができます。2. データの整合性の問題:私たちは、コピー・グループでの演習を書くときにのみデータの同期の最終終了後にリアルタイム同期できない場合は、あなたが見ることができ、このメカニズムが適用される読み取り操作書き込み少なく、長い上のシナリオ。

     java.util.concurrent.CopyOnWriteArrayList

    コレクションスレッドセーフなコンテナクラスが実装され、メインReentrantLockの、CopyOnWriteArrayListと例外なくの安全な使用をスレッドです。同時書き込みは、取得ロックする必要がある場合。読み取りはロックする必要がないときは

     java.util.concurrent.CopyOnWriteArraySet

    CopyOnWriteArraySetの実装が実現CopyOnWriteArrayListと認識に基づいて行われ、デコレータを使用しました。2とListとSet同じとの違いの違い。

    ベクター

    それは確かにスレッドセーフです。他のコンテナに関しては、ランダムアクセスを提供します。

   9.3 StringBufferののStringBuilder

    ネイティブ文字列文字列連結を完了するために、Stringオブジェクトを再作成します運転中の文字列+は、この操作はかなり多くの言葉は、サーバーの負担が増加します。だから我々は、StringBufferをとのStringBuilderを使用する必要があります。StringBufferのは、StringBuilderのではなく、スレッドセーフです。StringBufferのは、それが達成同期同期の方法を使用して、ソースから見ることができます。しかし、同期メカニズムを追加し、パフォーマンスは確かに影響を与えます。

 


公開された36元の記事 ウォン称賛19 ビュー30000 +

おすすめ

転載: blog.csdn.net/qq_27182767/article/details/79703304