cari

Rumah  >  Soal Jawab  >  teks badan

java程序运行的时候,是把所有的class文件都加载到内存吗?还是用的什么加载什么?

一运行就全部加载?

高洛峰高洛峰2802 hari yang lalu582

membalas semua(4)saya akan balas

  • PHP中文网

    PHP中文网2017-04-18 10:51:58

    Tidak semua dimuatkan, ia boleh difahami sebagai memuatkan atas permintaan.
    Contohnya, kelas induk yang diwarisi, antara muka yang dilaksanakan, pembolehubah yang diisytiharkan, jenis pemulangan kaedah, dsb.

    Iaitu, apabila menggunakan kelas semasa, mana-mana kelas yang diperlukan yang tiada akan dimuatkan serta-merta.

    balas
    0
  • 天蓬老师

    天蓬老师2017-04-18 10:51:58

    Muat atas permintaan.
    Masa pemuatan kelas:

    1) Apabila menemui empat arahan kod bait baharu, getstatic, putstatic atau invokestatic, jika kelas belum dimulakan, permulaannya perlu dicetuskan terlebih dahulu. Senario kod Java yang paling biasa yang menjana empat arahan ini ialah: apabila menggunakan kata kunci baharu untuk membuat seketika objek, membaca atau menetapkan medan statik kelas (diubah suai secara akhir, dan hasilnya telah dimasukkan ke dalam kumpulan malar pada masa penyusunan ).
    2) Apabila menggunakan kaedah pakej java.lang.reflect untuk membuat panggilan reflektif ke kelas, jika kelas belum dimulakan, pemulaannya perlu dicetuskan terlebih dahulu.
    3) Apabila memulakan kelas, jika didapati bahawa kelas induknya belum dimulakan, anda perlu mencetuskan permulaan kelas induknya terlebih dahulu.
    4) Apabila mesin maya dimulakan, pengguna perlu menentukan kelas utama untuk dilaksanakan (kelas yang mengandungi kaedah main()), dan mesin maya akan mula-mula memulakan kelas utama.
    5) Apabila menggunakan sokongan bahasa dinamik JDK 1.7, jika hasil penghuraian akhir bagi contoh java.lang.invoke.MethodHandle ialah pemegang kaedah REF_getStatic, REF_putStatic, REF_invokeStatic dan kelas yang sepadan dengan pemegang kaedah ini mempunyai belum dimulakan, anda perlu mencetuskan permulaannya terlebih dahulu.
    Untuk lima senario yang akan mencetuskan permulaan kelas, spesifikasi mesin maya menggunakan kelayakan yang sangat kuat: "ya dan sahaja". Di samping itu, semua kaedah merujuk kelas tidak akan mencetuskan permulaan dan dipanggil rujukan pasif.

    Sumber: Pemahaman mendalam tentang masa pemuatan kelas JVM 7.2

    balas
    0
  • 巴扎黑

    巴扎黑2017-04-18 10:51:58

    Saya belum memahami sepenuhnya bidang ini, jadi saya tidak berani untuk mengelirukan orang lain.
    Seperti yang saya tahu, apabila mesin maya sedang berjalan, ia akan pramuat kelas yang biasa digunakan, seperti kelas di bawah pakej java.lang.
    Bagi fail kelas/pakej balang yang anda rujuk dalam program anda, terdapat proses pemuatan.
    Apabila mesin maya memerlukan fail kelas, ia akan memanggil classLoader.loadClass() untuk memuatkannya terlebih dahulu ditemui, ia akan diserahkan kepada pemuat induk. Selepas mencari lapisan demi lapisan, classLoader akan memanggil kaedah findClass untuk memuatkan fail.
    Kelas yang dilindungi<?> loadClass(Nama rentetan, penyelesaian boolean)

        throws ClassNotFoundException
    {
        synchronized (getClassLoadingLock(name)) {
            // First, check if the class has already been loaded
            Class<?> c = findLoadedClass(name);
            if (c == null) {
                long t0 = System.nanoTime();
                try {
                    if (parent != null) {
                        c = parent.loadClass(name, false);
                    } else {
                        c = findBootstrapClassOrNull(name);
                    }
                } catch (ClassNotFoundException e) {
                    // ClassNotFoundException thrown if class not found
                    // from the non-null parent class loader
                }
    
                if (c == null) {
                    // If still not found, then invoke findClass in order
                    // to find the class.
                    long t1 = System.nanoTime();
                    c = findClass(name);
    
                    // this is the defining class loader; record the stats
                    sun.misc.PerfCounter.getParentDelegationTime().addTime(t1 - t0);
                    sun.misc.PerfCounter.getFindClassTime().addElapsedTimeFrom(t1);
                    sun.misc.PerfCounter.getFindClasses().increment();
                }
            }
            if (resolve) {
                resolveClass(c);
            }
            return c;
        }

    balas
    0
  • 伊谢尔伦

    伊谢尔伦2017-04-18 10:51:58

    http://blog.csdn.net/briblue/...
    Anda boleh rujuk blog ini, ia sangat bagus

    balas
    0
  • Batalbalas