Rumah > Java > javaTutorial > teks badan

Penjelasan kes Ruang memori JVM (koleksi disyorkan)

Lepaskan: 2023-08-15 17:16:46
ke hadapan
1076 orang telah melayarinya

Hari ini, mari berbincang dengan anda tentang topik ruang ingatan JVM Ini juga merupakan soalan yang sering ditanya dalam temu bual di syarikat Internet peringkat pertama. Okey, jangan bercakap lagi, mari kita ke topik utama hari ini.

JVM akan membahagikan memori kepada kawasan data yang berbeza, jadi di manakah kelas yang dimuatkan diperuntukkan?

Gambar di bawah menunjukkan pelbagai kawasan ingatan, termasuk: kawasan kaedah, timbunan, tindanan mesin maya, tindanan kaedah tempatan dan pembilang program.

Penjelasan kes Ruang memori JVM (koleksi disyorkan)

Kaedah kawasan

Kawasan kaedah digunakan untuk menyimpan data seperti maklumat kelas, pemalar, pembolehubah statik, kod yang disusun oleh pengkompil tepat dalam masa, dsb. oleh mesin maya. Lima peringkat pemuatan kelas disebut dalam Pemuatan Kelas. Dalam fasa pemuatan, struktur storan statik yang diwakili oleh aliran bait akan ditukar kepada struktur data masa jalan bagi kawasan kaedah Dalam fasa penyediaan, semua memori yang digunakan oleh pembolehubah akan diperuntukkan dalam kawasan kaedah.

Program Counter

Ayuh kod mudah, kira (1+2)*3 dan kembali

public int cal() {
    int a = 1;
    int b = 2;
    int c = 3;
    return (a + b) * c;
}
Salin selepas log masuk

Apabila kod ini dimuatkan ke dalam mesin maya, ia menjadi bait berikut Apabila melaksanakan kod, ia akan dilaksanakan baris demi baris.

Penjelasan kes Ruang memori JVM (koleksi disyorkan)

Java berbilang benang Selepas benang bertukar kembali, ia perlu tahu di mana kedudukan pelaksanaan asal. Pembilang program digunakan untuk merekodkan kedudukan pelaksanaan ini Untuk memastikan pembilang antara utas tidak menjejaskan satu sama lain, kawasan memori ini adalah peribadi kepada utas.

虚拟机栈

虚拟机栈也是线程私有的,生命周期与线程相同。每个线程都有自己的虚拟机栈,如果这个线程执行了一个方法,就会创建一个栈帧,方法从调用直至执行完成的过程,就对应着一个栈帧在虚拟机栈中入栈到出栈的过程。比如下面的例子,fun1调用fun2,fun2调用fun3,fun3创建Hello对象。

public void fun1() {
    fun2();
}

public void fun2() {
    fun3();
}

public void fun3() {
    Hello hello = new Hello();
}
Salin selepas log masuk

调用的时候,流程图如下:

Penjelasan kes Ruang memori JVM (koleksi disyorkan)

执行完成的时候,流程图如下:

Penjelasan kes Ruang memori JVM (koleksi disyorkan)

每一个栈帧都包括了局部变量表、操作数栈、动态连接、方法返回地址和一些额外的附加信息。局部变量主要是存放方法参数以及方法内部定义的局部变量,操作数栈是一个后入先出栈,当方法刚刚开始执行的时候,这个方法的操作数栈是空的,在方法的执行过程中,会有各种字节码指令往操作数栈中写入和提取内容,也就是出栈/入栈操作。

我们通过上面(1+2)*3的例子,把方法区、程序计数器、虚拟机栈的协同工作理一下。首先通过javap查看它的字节码,经过类加载器加载后,此时这个字节码存在方法区中。stack表示栈深度是2,locals是本地变量的slot个数,args_size是入参的个数,默认是this。栈的深度、本地变量个数,入参个数,都是在编译器决定的。

Penjelasan kes Ruang memori JVM (koleksi disyorkan)

如下图,指令的位置是方法区,局部变量和操作数栈的位置是虚拟机栈,程序计数器就在程序计数器(这个下面的图就不再重复)。当执行偏地址为0的指令的时候,程序计数器为0,局部变量第一个值是this,当前的指令就是方法区0:iconst_1,指令iconst_1就是把int常量值1进栈,这个1就到了虚拟机栈的操作数栈中。

Penjelasan kes Ruang memori JVM (koleksi disyorkan)

当执行偏地址为1的指令的时候,程序计数器为1,把操作数栈的值赋值到局部变量,此时操作数栈清空了,局部变量多了一个1,这条指令执行完,就是对应上面int a=1的语句。

Penjelasan kes Ruang memori JVM (koleksi disyorkan)

Selain itu, tugasan bagi dua pernyataan b dan c sepadan dengan arahan 2, 3, 4, dan 5, yang tidak akan diulang di sini. Selepas melaksanakan 5, seperti yang ditunjukkan dalam rajah di bawah:

Penjelasan kes Ruang memori JVM (koleksi disyorkan)

Apabila melaksanakan 6, iload_1 dilaksanakan, iaitu untuk menolak pembolehubah tempatan jenis int kedua ke bahagian atas timbunan.

Penjelasan kes Ruang memori JVM (koleksi disyorkan)

Apabila melaksanakan 7, iload_2 dilaksanakan, yang bermaksud menolak pembolehubah tempatan jenis int ketiga ke bahagian atas timbunan Pembolehubah di sini ialah 2.

Penjelasan kes Ruang memori JVM (koleksi disyorkan)

Apabila melaksanakan 8, ia adalah pernyataan iadd, yang bermaksud bahawa dua elemen jenis int di bahagian atas tindanan akan muncul keluar daripada tindanan, dan kemudian ditolak ke bahagian atas tindanan selepas hasilnya diperolehi.

Penjelasan kes Ruang memori JVM (koleksi disyorkan)

Apabila melaksanakan 9, tetapkan elemen 3 di bahagian atas tindanan kepada pembolehubah tempatan kelima.

Penjelasan kes Ruang memori JVM (koleksi disyorkan)

Apabila pelaksanaan mencapai 11, nilai pembolehubah tempatan kelima ditolak ke bahagian atas tindanan Apabila pelaksanaan mencapai 13, nilai pembolehubah tempatan keempat ditolak ke bahagian atas tindanan 14, dua nilai di bahagian atas timbunan ditolak Elemen jenis int muncul dari timbunan, dan hasil darab ditolak ke atas timbunan Apabila 15 dilaksanakan, elemen jenis int di bahagian atas timbunan semasa dikembalikan daripada kaedah semasa. Ini hampir sama dengan yang di atas, jadi saya tidak akan menerangkan secara terperinci.

Heap

Satu-satunya tujuan kawasan ingatan timbunan ialah untuk menyimpan tika objek, dan hampir semua tika objek memperuntukkan memori di sini. Contohnya, fun1 di atas memanggil fun2, fun2 memanggil fun3 dan fun3 mencipta objek Hello. Apabila objek dicipta dalam kaedah fun3, ia dicipta dalam timbunan, dan alamat diberikan kepada pembolehubah tempatan fun3. Timbunan Java juga boleh dibahagikan kepada: generasi baru dan generasi lama;

. Apabila benang memanggil kaedah, ia akan mencipta bingkai tindanan, membaca kod bait dalam kawasan kaedah dan melaksanakan arahan Apabila arahan dilaksanakan, kedudukan pelaksanaan akan direkodkan dalam pembilang program akan dibuat dalam ingatan timbunan Selepas kaedah dilaksanakan, bingkai tindanan akan muncul.
Penjelasan kes Ruang memori JVM (koleksi disyorkan)

Parameter berkaitan

-XX: PermSize: Kapasiti memori penjanaan kekal.
Penjelasan kes Ruang memori JVM (koleksi disyorkan)-XX:MaxPermSize: Kapasiti memori maksimum bagi generasi kekal.

-XX:MetaspaceSize: Saiz nilai awal metaspace -XX:MaxMetaspaceSize: Saiz maksimum metaspace -XX:CompressedClassSpaceSize: Saiz ruang untuk menyimpan bahagian metadata kelas Class -Xss: Kapasiti memori tindanan.

-Xms: Kapasiti memori timbunan.

-Xmx: Kapasiti memori maksimum timbunan, biasanya sama dengan tetapan -Xms, untuk mengelakkan kesan pengembangan masa jalan.

-Xmn: Kapasiti memori generasi baharu, generasi lama ialah kapasiti memori timbunan - kapasiti memori generasi baharu

-XX: SurvivorRatio=8: Generasi baharu juga dibahagikan kepada ruang Eden, Dari ruang Survivor dan ruang To Survivor , tetapkan kepada 8 Mewakili ruang Eden: Dari ruang Survivor: Untuk ruang Survivor = 8:1:1 Contohnya, jika generasi baharu mempunyai 10M, maka ruang Eden menduduki 8M, dan ruang Dari Survivor dan Untuk Ruang Survivor masing-masing menduduki 1M.

Atas ialah kandungan terperinci Penjelasan kes Ruang memori JVM (koleksi disyorkan). Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Label berkaitan:
jvm
sumber:Java后端技术全栈
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!