Rumah >Java >javaTutorial >Pengoptimuman prestasi teknologi asas Java: cara melaksanakan penalaan GC dan strategi peruntukan memori

Pengoptimuman prestasi teknologi asas Java: cara melaksanakan penalaan GC dan strategi peruntukan memori

WBOY
WBOYasal
2023-11-08 13:37:461353semak imbas

Pengoptimuman prestasi teknologi asas Java: cara melaksanakan penalaan GC dan strategi peruntukan memori

Java ialah salah satu bahasa pengaturcaraan yang paling banyak digunakan pada masa ini, dan teknologi asas bahasa Java adalah penting untuk pengoptimuman prestasi program. Dalam artikel ini, kami akan menumpukan pada pengoptimuman prestasi teknologi asas Java, termasuk cara melaksanakan penalaan GC dan strategi peruntukan memori serta menyediakan contoh kod khusus.

  1. GC Tuning

Bahasa Jawa menggunakan mekanisme pengurusan memori automatik iaitu mekanisme kutipan sampah (Garbage Collection, GC). Mekanisme GC secara automatik boleh menuntut semula memori yang tidak lagi digunakan dan melepaskannya kepada aplikasi untuk digunakan semula. Walau bagaimanapun, disebabkan oleh mekanisme GC yang tidak boleh dikawal dan penggunaan sumber boleh laku, beberapa masalah dan cabaran mungkin berlaku dalam sistem dengan konkurensi yang tinggi, jumlah data yang besar dan sistem yang berjalan lama, seperti GC Penuh yang kerap dan STW yang terlalu lama ( Hentikan dunia) masa, dsb. Oleh itu, penalaan GC adalah bahagian penting dalam pengoptimuman program Java.

1.1 Algoritma GC

Algoritma GC ialah mekanisme teras yang menentukan cara JVM melaksanakan operasi pengumpulan sampah. JVM menggunakan pelbagai algoritma GC, termasuk algoritma mark-sweep, algoritma salin, algoritma mark-collation, algoritma pengumpulan generasi, dsb. Algoritma GC yang berbeza sesuai untuk senario yang berbeza. Dalam pembangunan sebenar, kita harus memilih algoritma GC yang sesuai untuk memastikan kecekapan pengumpulan sampah sambil meminimumkan kesan ke atas aplikasi.

1.2 Penalaan parameter GC

JVM menyediakan satu siri parameter GC yang melaluinya pembangun boleh melaraskan gelagat mekanisme pengumpulan sampah untuk mengoptimumkan prestasi aplikasi. Beberapa parameter GC yang biasa digunakan termasuk:

  • -XX:+PrintGC: Cetak log GC
  • -XX:+PrintGCDetails: Cetak butiran GC
  • -XX:+PrintGCDateStamps: Cetak cap waktu apabila GC
  • berlaku :-XX
  • UseSerialGC: Gunakan algoritma GC bersiri
  • -XX:+UseParallelGC: Gunakan algoritma GC selari
  • -XX:+UseConcMarkSweepGC: Gunakan algoritma CMS GC
  • -Xms: Saiz timbunan awal
  • -Xmx
  • : Saiz heap maksimum

-Xmx

: aplikasi sebenar, kita perlu melaraskan parameter GC berdasarkan senario aplikasi dan konfigurasi perkakasan tertentu.

1.3 Analisis log GC

Untuk penalaan GC, log GC ialah alat yang sangat penting. Log GC merekodkan maklumat terperinci tentang kutipan sampah JVM dan boleh membantu kami mendiagnosis masalah tingkah laku dan prestasi GC. Dalam log GC, kita boleh melihat maklumat seperti masa, jenis, masa yang diambil dan jumlah memori yang dituntut semula oleh GC. Dengan menganalisis log GC, anda boleh mengesan kesesakan dan masalah yang mengambil prestasi semasa operasi GC, dan membuat pelarasan yang sepadan.

Berikut ialah contoh log GC:

2019-07-01T11:06:03.837+0800: 1.012: [GC (Allocation Failure) [PSYoungGen: 335544K->52432K(392192K)] 335544K->94764K(1179648K), 0.4857061 secs] [Times: user=0.66 sys=0.01, real=0.49 secs] 

Seperti yang anda lihat, ini adalah GC generasi muda. Cap masa apabila GC berlaku ialah 2019-07-01T11:06:03.837+0800, yang mengambil masa 0.49 saat ini masa 52432K ruang memori dikumpul dalam GC.
  1. Strategi peruntukan memori

Selain penalaan GC, satu lagi kaedah pengoptimuman biasa ialah strategi peruntukan memori. Strategi peruntukan memori boleh ditetapkan melalui parameter apabila program bermula, dan menentukan cara JVM memperuntukkan memori untuk menyesuaikan diri dengan senario aplikasi yang berbeza. Tetapan munasabah strategi peruntukan memori boleh menghapuskan pemecahan memori dengan berkesan, mengurangkan kekerapan GC, dan meningkatkan kecekapan operasi aplikasi.

2.1 Saiz objek

Dalam strategi peruntukan memori, isu pertama yang perlu dipertimbangkan ialah saiz objek. Saiz objek biasanya boleh dikira dengan dua kaedah berikut:
  • Kaedah ukuran sebenar: Gunakan alat yang disediakan oleh JVM untuk mengira ruang memori yang diduduki oleh objek.
  • Kaedah anggaran: Dengan menganalisis struktur data objek dan bilangan pembolehubah ahli, kita boleh menganggarkan secara kasar ruang memori yang diduduki oleh objek.

2.2 Kitaran hayat objek

Dalam strategi peruntukan memori, kitaran hayat objek juga perlu dipertimbangkan, termasuk masa penciptaan, masa penggunaan dan masa pemusnahan objek. Menganggarkan kitaran hayat objek secara munasabah dan tepat boleh membantu kami melaksanakan pengurusan memori dengan munasabah dan tepat untuk mencapai tujuan mengoptimumkan aplikasi.

2.3 Algoritma Peruntukan Memori

Di Java, algoritma peruntukan memori biasanya termasuk yang berikut:
  • Bump algoritma Penunjuk: digunakan untuk peruntukan memori berterusan.
  • Algoritma Senarai Percuma: digunakan untuk peruntukan memori diskret.
  • Algoritma Penimbal Peruntukan Tempatan Benang (TLAB): digunakan untuk peruntukan memori khusus benang, yang boleh mengelakkan penyegerakan benang di atas apabila berbilang benang memperuntukkan objek.

2.4 Tetapan parameter peruntukan memori

Di Java, parameter peruntukan memori boleh ditetapkan oleh parameter berikut:
  • -Xms: Saiz timbunan awal
  • -Xmx: Saiz timbunan Maksimum
  • :
  • Saiz awal penjanaan
  • -XX: MaxNewSize: Saiz maksimum generasi baharu
  • -XX: SurvivorNisbah: Nisbah saiz kawasan Eden dan kawasan Survivor
  • -XX: PretenureSizeThreshold: Apabila objek lebih besar daripada nilai ini, ia diperuntukkan terus kepada generasi lama

Dalam aplikasi sebenar, kita harus menetapkan parameter peruntukan memori mengikut ciri dan keperluan aplikasi, digabungkan dengan konfigurasi perkakasan dan keadaan beban.

Berikut ialah contoh strategi peruntukan ingatan yang mudah: 🎜
public class MemAllocPerformance {
    private static final int LOOP_COUNT = 10000000;
    private static final int SIZE = 256;

    public static void main(String[] args) throws InterruptedException {
        long start = System.currentTimeMillis();
        for (int i = 0; i < LOOP_COUNT; i++) {
            // 方式一:使用new关键字创建对象
            Object obj = new Object();

            // 方式二:使用对象池技术
            // Object obj = ObjectPool.getInstance().getObject();

            // 方式三:使用ThreadLocal技术
            // Object obj = ThreadLocalObjectPool.getInstance().getObject();

            // 模拟对象使用
            byte[] data = new byte[SIZE];
        }
        long end = System.currentTimeMillis();
        System.out.println("Time cost: " + (end - start) + "ms");
    }
}

在以上代码中,我们使用了三种不同的内存分配策略,分别是new方式、对象池技术和ThreadLocal技术。new方式是最简单常见的对象创建方式,而对象池技术和ThreadLocal技术则可以充分利用Java内存分配特性,避免过多的内存分配和回收,从而提高程序的性能表现。

总结

Java底层技术之性能优化是Java程序员的一项重要技能。在本文中,我们介绍了GC调优和内存分配策略两种优化方式,并提供了一些具体的代码示例。在实际的开发中,我们应该根据应用程序的特点和需求,综合考虑硬件的配置和负载情况,选取和调整合适的GC算法和内存分配策略,以达到优化应用程序性能的目的。

Atas ialah kandungan terperinci Pengoptimuman prestasi teknologi asas Java: cara melaksanakan penalaan GC dan strategi peruntukan memori. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
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