cari
RumahJavajavaTutorialPenjelasan kes Ruang memori JVM (koleksi disyorkan)

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;
}

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();
}

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

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!

Kenyataan
Artikel ini dikembalikan pada:Java后端技术全栈. Jika ada pelanggaran, sila hubungi admin@php.cn Padam
Bagaimanakah JVM menyumbang kepada kemampuan 'Write Once, Run, di mana -mana' Java?Bagaimanakah JVM menyumbang kepada kemampuan 'Write Once, Run, di mana -mana' Java?May 02, 2025 am 12:25 AM

JVM melaksanakan ciri-ciri Wora Java melalui tafsiran bytecode, API bebas platform dan pemuatan kelas dinamik: 1. Bytecode ditafsirkan sebagai kod mesin untuk memastikan operasi silang platform; 2. Perbezaan sistem operasi abstrak API standard; 3. Kelas dimuatkan secara dinamik pada masa runtime untuk memastikan konsistensi.

Bagaimanakah versi baru Java menangani isu-isu khusus platform?Bagaimanakah versi baru Java menangani isu-isu khusus platform?May 02, 2025 am 12:18 AM

Versi terbaru Java berkesan menyelesaikan masalah khusus platform melalui pengoptimuman JVM, penambahbaikan perpustakaan standard dan sokongan perpustakaan pihak ketiga. 1) Pengoptimuman JVM, seperti ZGC Java11 meningkatkan prestasi pengumpulan sampah. 2) Penambahbaikan perpustakaan standard, seperti sistem modul Java9 yang mengurangkan masalah berkaitan platform. 3) Perpustakaan pihak ketiga menyediakan versi yang dioptimumkan platform, seperti OpenCV.

Terangkan proses pengesahan bytecode yang dilakukan oleh JVM.Terangkan proses pengesahan bytecode yang dilakukan oleh JVM.May 02, 2025 am 12:18 AM

Proses pengesahan bytecode JVM termasuk empat langkah utama: 1) Periksa sama ada format fail kelas mematuhi spesifikasi, 2) mengesahkan kesahihan dan ketepatan arahan bytecode, 3) melakukan analisis aliran data untuk memastikan keselamatan jenis, dan 4) mengimbangi ketelitian dan prestasi pengesahan. Melalui langkah -langkah ini, JVM memastikan bahawa hanya selamat, bytecode yang betul dilaksanakan, dengan itu melindungi integriti dan keselamatan program.

Bagaimanakah kemerdekaan platform memudahkan penggunaan aplikasi Java?Bagaimanakah kemerdekaan platform memudahkan penggunaan aplikasi Java?May 02, 2025 am 12:15 AM

Java'splatformindependenceAllowsApplicationStoranyoperatingsystemwithajvm.1) singlecodebase: writeandcompileonceforallplatforms.2) Easyupdates: UpdateTecodeForsimulteUseUlyDeployment.3)

Bagaimanakah kemerdekaan platform Java berkembang dari masa ke masa?Bagaimanakah kemerdekaan platform Java berkembang dari masa ke masa?May 02, 2025 am 12:12 AM

Kemerdekaan platform Java terus dipertingkatkan melalui teknologi seperti JVM, kompilasi JIT, penyeragaman, generik, ekspresi Lambda dan Projectpanama. Sejak tahun 1990-an, Java telah berkembang dari JVM asas kepada JVM moden berprestasi tinggi, memastikan konsistensi dan kecekapan kod di platform yang berbeza.

Apakah beberapa strategi untuk mengurangkan isu khusus platform dalam aplikasi Java?Apakah beberapa strategi untuk mengurangkan isu khusus platform dalam aplikasi Java?May 01, 2025 am 12:20 AM

Bagaimanakah Java mengurangkan masalah khusus platform? Java melaksanakan platform bebas melalui JVM dan perpustakaan standard. 1) Gunakan bytecode dan JVM untuk abstrak perbezaan sistem operasi; 2) Perpustakaan standard menyediakan API silang platform, seperti laluan fail pemprosesan kelas Paths, dan pengekodan aksara pemprosesan kelas charset; 3) Gunakan fail konfigurasi dan ujian pelbagai platform dalam projek sebenar untuk pengoptimuman dan debugging.

Apakah hubungan antara kebebasan platform Java dan seni bina microservices?Apakah hubungan antara kebebasan platform Java dan seni bina microservices?May 01, 2025 am 12:16 AM

Java'splatformindependenceEnhancesMicroservicesarchitectureByOfferingDeploymentflexability, konsistensi, skalabilitas, andPortability.1) DeploymentflexabilityAllowsMicroserviceStorunonAnanyplatformWithAjvm.2) ConsistencyAcsServicSservicesSimpliesDevelanDanDevelan

Bagaimanakah GraalVM berkaitan dengan matlamat kemerdekaan platform Java?Bagaimanakah GraalVM berkaitan dengan matlamat kemerdekaan platform Java?May 01, 2025 am 12:14 AM

GraalVM meningkatkan kemerdekaan platform Java dalam tiga cara: 1. 2. Persekitaran Runtime Bebas, menyusun program Java ke dalam fail boleh laku tempatan melalui GraalvmnativeImage; 3. Pengoptimuman Prestasi, Graal Compiler menjana kod mesin yang cekap untuk meningkatkan prestasi dan konsistensi program Java.

See all articles

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

Video Face Swap

Video Face Swap

Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

SecLists

SecLists

SecLists ialah rakan penguji keselamatan muktamad. Ia ialah koleksi pelbagai jenis senarai yang kerap digunakan semasa penilaian keselamatan, semuanya di satu tempat. SecLists membantu menjadikan ujian keselamatan lebih cekap dan produktif dengan menyediakan semua senarai yang mungkin diperlukan oleh penguji keselamatan dengan mudah. Jenis senarai termasuk nama pengguna, kata laluan, URL, muatan kabur, corak data sensitif, cangkerang web dan banyak lagi. Penguji hanya boleh menarik repositori ini ke mesin ujian baharu dan dia akan mempunyai akses kepada setiap jenis senarai yang dia perlukan.

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Dreamweaver Mac版

Dreamweaver Mac版

Alat pembangunan web visual