Jadual Kandungan
Peruntukan pada timbunan" >Peruntukan pada timbunan
Penggantian skalar" >Penggantian skalar
Rumah Java javaTutorial Fahami analisis pelarian JVM dalam masa 3 minit

Fahami analisis pelarian JVM dalam masa 3 minit

Aug 15, 2023 pm 04:39 PM
jvm

Sebagai pembangun Java yang berkelayakan, kita semua tahu bahawa pada asasnya semua objek dicipta pada timbunan. Walau bagaimanapun, masih tiada perkataan mutlak di sini, ia merujuk kepada secara asasnya semuanya.

Semalam semasa temu bual, seorang kawan mengatakan bahawa semua objek dicipta dalam timbunan, dan kemudian mentertawakan penemuduga.

Memulakan teks utama kami, mari bercakap tentang analisis melarikan diri hari ini.

Escape Analysis (Analisis Escape) kini merupakan teknologi pengoptimuman yang agak canggih dalam mesin maya Java. Ini ialah algoritma analisis aliran data global fungsi silang yang boleh mengurangkan beban penyegerakan dan tekanan peruntukan timbunan memori dalam program Java dengan berkesan. Melalui analisis melarikan diri, pengkompil Java Hotspot boleh menganalisis julat penggunaan rujukan objek baharu dan memutuskan sama ada untuk memperuntukkan objek ke timbunan.

Prinsip asas analisis melarikan diri ialah : menganalisis skop dinamik objek Apabila objek ditakrifkan dalam kaedah, ia mungkin dirujuk oleh kaedah luaran, seperti dihantar ke kaedah lain sebagai parameter panggilan kaedah Escape; ia juga boleh diakses oleh utas luaran, seperti menetapkan pembolehubah contoh yang boleh diakses dalam utas lain Ini dipanggil melarikan diri daripada tiada, kaedah melarikan diri ke utas, ia dipanggil objek dari rendah ke tahap pelarian yang berbeza.

Apabila analisis melarikan diri dihidupkan, pengkompil boleh mengoptimumkan kod seperti berikut:

  1. Penghapusan segerak: Jika objek ditemui oleh analisis melarikan diri hanya boleh diakses oleh satu utas, operasi pada objek ini boleh tak segerak.
  2. Peruntukan pada tindanan: Jika anda pasti bahawa objek tidak akan terlepas daripada benang, adalah idea yang sangat baik untuk memperuntukkan memori untuk objek ini pada tindanan Ruang memori yang diduduki oleh objek boleh dilepaskan dengan bingkai tindanan dan dimusnahkan.
  3. Penggantian skalar: Jika objek ditemui oleh analisis melarikan diri untuk tidak diakses oleh kaedah luaran, dan objek ini boleh dibongkar, maka atur cara mungkin tidak mencipta objek ini apabila ia sebenarnya dilaksanakan, sebaliknya mencipta secara langsung beberapa ia. Daripada kaedah ini menggunakan pembolehubah ahli sebaliknya. Selepas membelah objek, pembolehubah ahli objek boleh diperuntukkan, dibaca dan ditulis pada tindanan.

Dalam JVM, anda boleh menentukan sama ada untuk mendayakan analisis melarikan diri melalui parameter berikut:

-XX:+DoEscapeAnalysis: Menunjukkan menghidupkan analisis melarikan diri (ia dihidupkan secara lalai selepas JDK 1.7). -XX:+DoEscapeAnalysis :表示开启逃逸分析(JDK 1.7之后默认开启)。

-XX:-DoEscapeAnalysis

-XX:-DoEscapeAnalysis: Mewakili Matikan analisis melarikan diri. 🎜

Penghapusan penyegerakan

Penyegerakan benang itu sendiri adalah proses yang agak memakan masa jika analisis escape dapat menentukan bahawa pembolehubah tidak akan terlepas dari utas dan tidak boleh diakses oleh utas lain, maka pastinya tidak akan ada bacaan dan penulisan. daripada pembolehubah ini, langkah penyegerakan yang dilaksanakan pada pembolehubah ini boleh dihapuskan dengan selamat.

Seperti kod berikut:

public void method() {
    Object o = new Object();
    synchronized (o) {
        System.out.println(o);
    }
}
Salin selepas log masuk

terkunci 对象o, tetapi kitaran hayat objek o adalah sama dengan kaedah kaedah(), jadi ia tidak akan diakses oleh utas lain, dan isu keselamatan benang tidak akan berlaku akan disekat semasa fasa kompilasi JIT Dioptimumkan untuk kelihatan seperti ini:

public void method() {
    Object o = new Object();
    System.out.println(o);
}
Salin selepas log masuk

Ini juga dikenali sebagai Penghapusan Kunci.

Peruntukan pada timbunan

Dalam mesin maya Java, memperuntukkan ruang memori untuk objek yang dicipta pada timbunan Java hampir masuk akal kepada pengaturcara Java. selagi anda memegang rujukan kepada objek ini, anda boleh mengakses data objek yang disimpan dalam timbunan. Subsistem pengumpulan sampah mesin maya akan mengitar semula objek yang tidak lagi digunakan dalam timbunan, tetapi tindakan kitar semula, sama ada menanda dan menapis objek kitar semula, atau mengitar semula dan menyusun memori, memerlukan banyak sumber. Walau bagaimanapun, terdapat kes khas Jika analisis melarikan diri mengesahkan bahawa objek tidak akan terlepas daripada benang, ia mungkin dioptimumkan untuk diperuntukkan pada tindanan. Ini menghapuskan keperluan untuk memperuntukkan memori pada timbunan dan menghapuskan keperluan untuk pengumpulan sampah.

Seperti kod berikut:

public static void main(String[] args) throws InterruptedException {

    for (int i = 0; i < 1000000; i++) {
        alloc();
    }

    Thread.sleep(100000);
}

private static void alloc() {
    User user = new User();
}
Salin selepas log masuk

Kod ini sangat mudah, ia adalah untuk mencipta gelung 1 juta kali dan menggunakan kaedah alloc() untuk mencipta 1 juta objek Pengguna. Objek Pengguna yang ditakrifkan dalam kaedah alloc() di sini tidak dirujuk oleh kaedah lain, jadi ia memenuhi keperluan untuk peruntukan pada tindanan.

Parameter JVM adalah seperti berikut:

-Xmx2G -Xms2G -XX:+DoEscapeAnalysis -XX:+PrintGCDetails -XX:+HeapDumpOnOutOfMemoryError
Salin selepas log masuk

Mulakan atur cara dan semak bilangan kejadian melalui alat jmap:

jmap -histo pid

num     #instances         #bytes  class name
----------------------------------------------
1:          3771        2198552  [B
2:         10617        1722664  [C
3:        104057        1664912  com.miracle.current.lock.StackAllocationTest$User
Salin selepas log masuk

Kita dapat melihat bahawa atur cara telah mencipta sejumlah 104057 objek Pengguna, yang jauh kurang daripada 1 juta. Kami boleh mematikan analisis melarikan diri dan melihat sekali lagi:

-Xmx2G -Xms2G -XX:-DoEscapeAnalysis -XX:+PrintGCDetails -XX:+HeapDumpOnOutOfMemoryError
Salin selepas log masuk

Mulakan program dan semak bilangan kejadian melalui alat jmap:

jmap -histo 42928

 num     #instances         #bytes  class name
----------------------------------------------
   1:           628       22299176  [I
   2:       1000000       16000000  com.miracle.current.lock.StackAllocationTest$User
Salin selepas log masuk

Anda dapat melihat bahawa sejumlah 1 juta objek Pengguna telah dicipta selepas mematikan analisis melarikan diri . Sebagai perbandingan, peruntukan pada tindanan memainkan peranan penting dalam penggunaan memori timbunan dan GC.

Penggantian skalar

Jika data tidak lagi boleh diuraikan menjadi data yang lebih kecil untuk diwakili, jenis data asal dalam mesin maya Java (int, long dan jenis berangka lain dan jenis rujukan, dsb.) tidak boleh digunakan Selanjutnya Terurai, maka data ini boleh dipanggil skalar. Sebaliknya, jika sekeping data boleh terus diuraikan, ia dipanggil agregat dalam Java ialah agregat biasa.

Jika analisis melarikan diri boleh membuktikan bahawa objek tidak akan diakses di luar kaedah, dan objek ini boleh dibongkar, maka program mungkin tidak mencipta objek ini apabila ia benar-benar dilaksanakan, sebaliknya mencipta secara langsung beberapa daripadanya untuk digunakan oleh kaedah ini sebaliknya.

mempunyai kod berikut:

public static void main(String[] args) {

    method();
}

private static void method() {
    User user = new User(25);

    System.out.println(user.age);
}

private static class User {

    private int age;

    public User(int age) {
        this.age = age;
    }
}
Salin selepas log masuk

method()方法中创建User对象,指定age为25,这里User不会被其他方法引用,也就是说它不会逃逸出方法,并且User是可以拆解为标量的。所以alloc()代码会优化为如下:

private static void alloc() {
    int age = 25;

    System.out.println(age);
}
Salin selepas log masuk

总结

尽管目前逃逸分析技术仍在发展之中,未完全成熟,但它是即时编译器优化技术的一个重要前进方向,在日后的Java虚拟机中,逃逸分析技术肯定会支撑起一系列更实用、有效的优化技术。

Atas ialah kandungan terperinci Fahami analisis pelarian JVM dalam masa 3 minit. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

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

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

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Alat pemantauan JVM yang diedarkan, sangat praktikal! Alat pemantauan JVM yang diedarkan, sangat praktikal! Aug 15, 2023 pm 05:15 PM

Projek ini direka untuk memudahkan pembangun memantau berbilang JVM hos jauh dengan lebih cepat Jika projek anda adalah Spring boot, ia adalah sangat mudah untuk disepadukan. Jika ia bukan but Spring, anda boleh cepat memulakan program but Spring dan memperkenalkannya sendiri pakej Jar sudah memadai

Penjelasan terperinci tentang parameter baris arahan JVM: senjata rahsia untuk mengawal operasi JVM Penjelasan terperinci tentang parameter baris arahan JVM: senjata rahsia untuk mengawal operasi JVM May 09, 2024 pm 01:33 PM

Parameter baris arahan JVM membolehkan anda melaraskan tingkah laku JVM pada tahap yang terperinci. Parameter biasa termasuk: Tetapkan saiz timbunan Java (-Xms, -Xmx) Tetapkan saiz generasi baharu (-Xmn) Dayakan pengumpul sampah selari (-XX:+UseParallelGC) Kurangkan penggunaan memori kawasan Survivor (-XX: -ReduceSurvivorSetInMemory) Hilangkan lebihan Hapuskan kutipan sampah (-XX:-EliminateRedundantGCs) Cetak maklumat kutipan sampah (-XX:+PrintGC) Gunakan pemungut sampah G1 (-XX:-UseG1GC) Tetapkan masa jeda kutipan sampah maksimum (-XX:MaxGCPauXX

Perkara utama pengurusan memori JVM dan langkah berjaga-jaga Perkara utama pengurusan memori JVM dan langkah berjaga-jaga Feb 20, 2024 am 10:26 AM

Perkara utama dan langkah berjaga-jaga untuk menguasai penggunaan memori JVM JVM (JavaVirtualMachine) ialah persekitaran di mana aplikasi Java dijalankan, dan yang paling penting ialah pengurusan memori JVM. Mengurus memori JVM dengan betul bukan sahaja dapat meningkatkan prestasi aplikasi, tetapi juga mengelakkan masalah seperti kebocoran memori dan limpahan memori. Artikel ini akan memperkenalkan perkara utama dan pertimbangan penggunaan memori JVM dan menyediakan beberapa contoh kod khusus. Pembahagian memori JVM Memori JVM terutamanya dibahagikan kepada kawasan berikut: Heap (He

Analisis fungsi dan prinsip mesin maya JVM Analisis fungsi dan prinsip mesin maya JVM Feb 22, 2024 pm 01:54 PM

Pengenalan kepada analisis fungsi dan prinsip mesin maya JVM: Mesin maya JVM (JavaVirtualMachine) ialah salah satu komponen teras bahasa pengaturcaraan Java, dan ia merupakan salah satu titik jualan terbesar Java. Peranan JVM adalah untuk menyusun kod sumber Java ke dalam kod bait dan bertanggungjawab untuk melaksanakan kod bait ini. Artikel ini akan memperkenalkan peranan JVM dan cara ia berfungsi serta menyediakan beberapa contoh kod untuk membantu pembaca memahami dengan lebih baik. Fungsi: Fungsi utama JVM adalah untuk menyelesaikan masalah mudah alih program Java pada platform yang berbeza.

Ralat Java: Ralat limpahan memori JVM, cara menangani dan mengelak Ralat Java: Ralat limpahan memori JVM, cara menangani dan mengelak Jun 24, 2023 pm 02:19 PM

Java ialah bahasa pengaturcaraan yang popular Semasa pembangunan aplikasi Java, anda mungkin menghadapi ralat limpahan memori JVM. Ralat ini biasanya menyebabkan aplikasi ranap, menjejaskan pengalaman pengguna. Artikel ini akan meneroka punca ralat limpahan memori JVM dan cara menangani dan mengelakkan ralat tersebut. Apakah ralat limpahan memori JVM? Mesin Maya Java (JVM) ialah persekitaran berjalan untuk aplikasi Java. Dalam JVM, memori dibahagikan kepada beberapa kawasan, termasuk timbunan, kawasan kaedah, tindanan, dll. Timbunan digunakan untuk menyimpan objek yang dicipta

Bagaimana untuk melaraskan saiz memori timbunan JVM dengan cekap? Bagaimana untuk melaraskan saiz memori timbunan JVM dengan cekap? Feb 18, 2024 pm 01:39 PM

Tetapan parameter memori JVM: Bagaimana untuk melaraskan saiz memori timbunan secara munasabah? Dalam aplikasi Java, JVM ialah komponen utama yang bertanggungjawab untuk menguruskan memori. Antaranya, ingatan timbunan digunakan untuk menyimpan contoh objek Tetapan saiz ingatan timbunan mempunyai kesan penting ke atas prestasi dan kestabilan aplikasi. Artikel ini akan memperkenalkan cara melaraskan saiz memori timbunan secara munasabah, dengan contoh kod tertentu. Pertama, kita perlu memahami beberapa pengetahuan asas tentang memori JVM. Memori JVM dibahagikan kepada beberapa kawasan, termasuk ingatan timbunan, ingatan tindanan, kawasan kaedah, dll. dalam

Program Java untuk menyemak sama ada JVM ialah 32-bit atau 64-bit Program Java untuk menyemak sama ada JVM ialah 32-bit atau 64-bit Sep 05, 2023 pm 06:37 PM

Sebelum menulis program java untuk menyemak sama ada JVM adalah 32-bit atau 64-bit, mari kita bincangkan tentang JVM dahulu. JVM ialah mesin maya java, bertanggungjawab untuk melaksanakan bytecode. Ia adalah sebahagian daripada Java Runtime Environment (JRE). Kita semua tahu bahawa java adalah bebas platform, tetapi JVM bergantung pada platform. Kami memerlukan JVM berasingan untuk setiap sistem pengendalian. Jika kami mempunyai kod bait mana-mana kod sumber java, kami boleh menjalankannya dengan mudah pada mana-mana platform disebabkan oleh JVM. Keseluruhan proses pelaksanaan fail java adalah seperti berikut - Pertama, kami menyimpan kod sumber java dengan sambungan .java dan pengkompil menukarnya kepada kod bait dengan sambungan .class. Ini berlaku pada masa penyusunan. Sekarang, pada masa tayangan, J

Menjelaskan prinsip kerja JVM: Penerokaan mendalam tentang prinsip mesin maya Java Menjelaskan prinsip kerja JVM: Penerokaan mendalam tentang prinsip mesin maya Java Feb 18, 2024 pm 12:28 PM

Penjelasan terperinci tentang prinsip JVM: Penerokaan mendalam tentang prinsip kerja mesin maya Java memerlukan contoh kod khusus 1. Pengenalan Dengan perkembangan pesat dan aplikasi meluas bahasa pengaturcaraan Java, Mesin Maya Java (JavaVirtualMachine, dirujuk sebagai JVM ) juga menjadi sangat diperlukan dalam pembangunan perisian. Sebagai persekitaran berjalan untuk program Java, JVM boleh menyediakan ciri merentas platform, membenarkan program Java berjalan pada sistem pengendalian yang berbeza. Dalam artikel ini, kita akan menyelidiki cara JVM berfungsi

See all articles