JVM Java仮想マシンの実行時のデータ領域

ランタイムデータ領域
ここに画像を挿入説明ここに画像を挿入説明

プログラムカウンタ
1、小さなメモリ空間、スレッドプライベート。この作品のバイトコードインタプリタがあることは、命令をバイトコード実行される命令の1つを選択するために、カウンタの値を変更する分岐、ループ、分岐、例外処理、およびその他の基本的な機能のスレッドの復旧が完了カウンタに依存していることである
ならば、2スレッドは、Javaメソッドを実行して、カウンタは、実行中の仮想マシンのバイトコード命令のアドレスを記録し、このカウンタの値が(未定義)と比較した場合、ネイティブメソッドが実行されています。このメモリ領域は、地域のOutOfMemoryError Java仮想マシン仕様でどのような状況のために用意されていませ唯一のものです。
ZhanのJava仮想マシン
Java実行に作用する1メモリ領域
原理はアウト前進従うスタックコール
2オペランドを格納するためのローカル変数テーブルを行いながら、各方法は、スタックフレーム(スタックフレーム)を作成します輸出用スタック、動的にリンクされた、及び他の情報、スタックフレームが完了するまでプロセスからの各メソッド呼び出しは、スタックにスタックから仮想マシンに対応することになる
3、ローカル変数テーブルに格納されるデータの種類が含まれる:
ブール、バイト、文字、ショート、整数、フロート、長い、二重、およびオブジェクト参照のタイプ(基準型)とRETURNADDRESS型(バイトコード命令のアドレスポインティング)などが挙げられます。
4.スタックは、スレッドの深さは、仮想マシンの許容深さを要求されたよりも大きい場合には、例外にStackOverflowErrorがスローされます
、再帰呼び出しを異常なヒープメモリが生成されますが、(再帰的な原因にStackOverflowErrorが、それぞれの方法は、スタックフレームを作成することができますので、スタックフレームがあまりにも作成しますそしてそれ以上)のメモリ拡張のために適用し続けることができない
スレッドで例外を「メイン」によってjava.lang.StackOverflowError
ここに画像を挿入説明
StackOverflowError:仮想マシンで許可された深さよりもスレッド要求スタック深さより大きい。
OutOfMemoryErrorが発生:仮想マシンが動的にスタックを拡張することができ、および展開するときに十分なメモリに適用することができない場合。

ネイティブメソッドは、スタック
1を、同じスタックのJava仮想マシン、店舗情報、ローカル変数テーブル、オペランドスタック、動的リンクにスタック・フレーム(スタック・フレーム)を作成する各方法等出口の方法を行いながら、各メソッドスタックフレームがスタックにスタックから仮想マシンに対応することになるまで、呼び出しプロセスから
Java仮想マシンのスタック実行するJavaメソッドをバイトコードにコンパイルされます2、ネイティブメソッドスタックネイティブメソッドが実行される(コールときに、他の言語)
3、Java仮想マシン・スタックは異なるメソッドを実行するために、Java仮想マシン用のJava仮想マシンのスタックである(つまり、バイトコード)サービス、ネイティブメソッドスタック、ネイティブサービスのメソッドを使用するように仮想マシン。StackOverflowErrorとOutOfMemoryErrorがあるでしょう。
Javaスタック
のほぼすべてのオブジェクトインスタンスのストアオブジェクトのインスタンス領域に使用されるJavaメモリ領域1は、ここで仕切られています。
2は、JAVAヒープメモリJAVA仮想マシン管理の最大の作品で、JAVAスタックはメモリの領域内のすべてのスレッドで共有されている
3、JAVAスタックは古いものと新しい世代の新しい世代が宇宙から、エデンに分けることができますに分けることができます、空間に
。4、Javaヒープは、したがって、しばしば「GCヒープ」と呼ばれるメインガベージコレクタ領域管理である
5は、ヒープメモリのオーバーフロー
ここに画像を挿入説明
方式エリア
1仮想マシンを格納するための共有メモリ領域に属していたロードされたクラスは情報、定数、静的変数は、タイムコンパイラは、コードやその他のデータをコンパイルします。
ランタイム・データ格納されたコンテンツのゾーンJava仮想マシン
ここに画像を挿入説明
の実行時定数プール
1、ゾーン法の一部、及び様々なリテラルシンボルを格納するための基準を生成コンパイル。コンパイラとランタイム(文字列のインターン())がプールに定数することができます。限られたメモリに適用することができないのOutOfMemoryErrorがスローされた
オブジェクトへのアクセス
1、アクセスハンドル
脇のJavaヒープセットハンドルとしてメモリ・プールのブロック、オブジェクトに格納されたハンドルの参照アドレス、ハンドルは、オブジェクトインスタンスデータを含む、データのタイプのアドレス情報
参照記憶ハンドラ・アドレスは安定している、データオブジェクトのみがアドレス参照スタック自体を変更することなく、移動されたときにポインタインスタンスハンドルプールハンドルを変更する必要がある(ガベージコレクションオブジェクトは異なる領域に移動する必要があります)
ここに画像を挿入説明

2、ダイレクトポインタ・
インスタンス・データ・オブジェクトに格納されている参考文献、例えば、アドレスデータタイプデータ含まれていることを直接ポインタ異なる
ハンドルに比べて利点は、使用上に位置ポインタの時間コスト、JVMホットスポットを低減するために、速度でありますこのよう
ここに画像を挿入説明

GC的概念
GC:Garbage Collection 垃圾收集。这里所谓的垃圾指的是在系统运行过程当中所产生的一些无用的对象,这些对象占据着一定的内存空间,如果长期不被释放,可能导致OOM(堆溢出)。内存区域中的程序计数器、虚拟机栈、本地方法栈这3个区域随着线程而生,线程而灭;栈中的栈帧随着方法的进入和退出而有条不紊地执行着出栈和入栈的操作,每个栈帧中分配多少内存基本是在类结构确定下来时就已知的。在这几个区域不需要过多考虑回收的问题,因为方法结束或者线程结束时,内存自然就跟着回收了。而Java堆和方法区则不同,一个接口中的多个实现类需要的内存可能不同,一个方法中的多个分支需要的内存也可能不一样,只有在程序处于运行期间时才能知道会创建哪些对象,这部分内存的分配和回收都是动态的,GC关注的也是这部分内存,如果涉及到“内存”分配与回收也仅指着一部分内存
回收算法
引用计数算法:(老牌垃圾回收算法。无法处理循环引用,没有被Java采纳)
1、引用计数算法的概念:
给对象中添加一个引用计数器,每当有一个地方引用它时,计数器值就加1;当引用失效时,计数器值就减1;任何时刻计数器为0的对象就是不可能再被使用的。
ここに画像を挿入説明

上面的3个图中,对于最右边的那张图而言:循环引用的计数器都不为0,但是他们对于根对象都已经不可达了,但是无法释放。

public class Object {
 
    Object field = null;
    
    public static void main(String[] args) {
        Thread thread = new Thread(new Runnable() {
            public void run() {
                Object objectA = new Object();
                Object objectB = new Object();//位置1
                objectA.field = objectB;
                objectB.field = objectA;//位置2
                //to do something
                objectA = null;
                objectB = null;//位置3
            }
        });
        thread.start();
        while (true);
    }

上方代码看起来有点刻意为之,但其实在实际编程过程当中,是经常出现的,比如两个一对一关系的数据库对象,各自保持着对方的引用。最后一个无限循环只是为了保持JVM不退出,没什么实际意义。
代码解释:代码中标注了1、2、3三个数字,当位置1的语句执行完以后,两个对象的引用计数全部为1。当位置2的语句执行完以后,两个对象的引用计数就全部变成了2。当位置3的语句执行完以后,也就是将二者全部归为空值以后,二者的引用计数仍然为1。根据引用计数算法的回收规则,引用计数没有归0的时候是不会被回收的。
对于现在使用的GC来说,当thread线程运行结束后,会将objectA和objectB全部作为待回收的对象。而如果我们的GC采用上面所说的引用计数算法,则这两个对象永远不会被回收,即便我们在使用后显示的将对象归为空值也毫无作用。
根搜索算法
1、根搜索算法的概念:
  由于引用计数算法的缺陷,所以JVM一般会采用一种新的算法,叫做根搜索算法。它的处理方式就是,设立若干种根对象,当任何一个根对象到某一个对象均不可达时,则认为这个对象是可以被回收的。
ここに画像を挿入説明
如上图所示,ObjectD和ObjectE是互相关联的,但是由于GC roots到这两个对象不可达,所以最终D和E还是会被当做GC的对象,上图若是采用引用计数法,则A-E五个对象都不会被回收。

図2に示すように、到達可能性分析:
いくつかのルートオブジェクトの確立、いずれかの被験体へのルートオブジェクトではないまで、そのオブジェクトを再利用することができます。私たちは後ろにマークを導入-すべては最初のマークオブジェクトを補うために、ルートから始まる強調常にますアルゴリズムを整理するためのアルゴリズム/タグを清掃するときは、それまではに何ですか?:ここで次のように説明される
到達可能性分析を:
  ダウン検索を開始、オブジェクトのルート(GC根)から出発点として、探索経路は、オブジェクトが任意の参照GCルーツ・チェーンに接続されていない場合、「基準鎖」という横断しました(グラフ理論の用語の概念を使用して、GCのルーツからこのオブジェクトにある到達不能である)、それは、このオブジェクトが使用できないことを証明しています。
図3に示すように、ルート(GCルーツは)
:GC根(GCルート)といえば、Java言語では、オブジェクトのGCルートは、以下の通りで使用することができる
1、スタック(ローカル変数テーブル・スタック・フレーム)参照されるオブジェクト。
2、静的メンバのメソッド領域。
図3に示すように、オブジェクトメソッドリファレンス一定領域(グローバル変数)
JNIネイティブメソッドスタック4、参照されるオブジェクト(典型的にはネイティブメソッドを言います)。
注:ローカル変数テーブルは、第1および第四の方法を参照して、比較的明確な第二の表現の意味は、主に第3の定数値を参照すると、最終的な宣言。スイープアルゴリズム、複製アルゴリズム、マーク- -ソートアルゴリズム近代的な仮想マシン間で認識に基づいて、ルート検索アルゴリズムに基づき、ガベージコレクションのアルゴリズムは3、すなわち、マークがあります。3つのアルゴリズムは、ルート検索アルゴリズムを展開しています。

公開された10元の記事 ウォンの賞賛0 ビュー101

おすすめ

転載: blog.csdn.net/xiaobao1352/article/details/104205818