Saya memiliki kelas berikut
class Student{
int rollNumber;
int marks;
public void setResult(int rollNumber, int marks){
this.rollNumber=rollNumber;
this.marks=marks;
}
public void displayResult(){
System.out.println("Roll Number= "+this.rollNumber+" Marks= "+this.marks);
}
}
Sekarang saya membuat dua objek bertipe Student sebagai berikut
Student s1=new Student();
Student s2=new Student();
Sekarang dua set memori yang berbeda dialokasikan untuk bidang misalnya. Sekarang pertanyaan saya adalah apakah memori dialokasikan untuk metode (setResult
dan displayResult
) dua kali atau sekali?
Silakan lihat gambar berikut dan dapatkah Anda membantu saya mengatakan angka mana yang memberikan informasi yang benar.
java
object-oriented
memory
jvm
Harish_N
sumber
sumber
Jawaban:
Kode untuk metode adalah bagian dari
Class
(lebih ringkas,Class<Student>
) dan itu dimuat ke dalam memori ketika kelas pertama kali dimuat.Yang mengatakan, ketika Anda menjalankan metode apa pun memori tambahan digunakan, untuk mengalokasikan memori ke parameter, variabel lokal, hasil ekspresi sementara, mengembalikan nilai dan sebagainya. Tetapi memori tersebut dialokasikan dalam tumpukan (memori yang digunakan saat membuat instance baru dialokasikan di heap .
Sesuai pertanyaan Anda, harus jelas sekarang bahwa angka B sudah benar (meskipun itu tidak mencerminkan apa yang terjadi ketika Anda benar-benar memanggil metode).
sumber
Bidang instance (termasuk bidang dukungan properti) mendapatkan N-salinan untuk objek-N.
Bidang statis mendapatkan satu salinan per kelas.
Metode adalah blok bytecode (atau setelah JIT, blok instruksi asli) yang merupakan bagian dari program "gambar" atau segmen kode yang dapat dieksekusi. Metode sudah menjadi bagian dari gambar program saat ia duduk di disk. Setelah gambar dimuat oleh OS (atau CLR), ada satu salinan bersama dari kode metode.
Mereka bukan bagian dari "heap" atau alokasi runtime secara umum, kecuali dalam kasus di mana Anda dapat menggunakan kompiler yang dapat di-host untuk mengkompilasi metode baru dengan cepat. Metode tidak mendapatkan "dialokasikan" seperti objek dan mereka tidak "dialokasikan" relatif terhadap pembuatan objek. Mereka hanya ada sebagai bagian dari program sebelum objek tunggal pernah dipakai. Bahkan lambda / delegasi tidak dialokasikan dengan cepat. Compiler membuat kelas sesuai permintaan untuk mengimplementasikan objek kode yang tampaknya dinamis ini, dan mereka juga ada sebagai bagian dari gambar bytecode pada disk.
PEMBARUAN per komentar:
Standar JVM mengatakan ini:
Jadi jelas bahwa (1) ya spec tidak menentukan bagaimana hal ini dilakukan, tetapi (2) itu analog dengan area penyimpanan untuk kode yang dikompilasi dari bahasa konvensional, yaitu. segmen teks. Inilah poin yang saya buat.
sumber
objek yang dialokasikan dalam memori tumpukan. ketika objek dialokasikan slot untuk semua variabel contoh dibuat dan dihancurkan ketika objek dihancurkan. variabel contoh juga dialokasikan dalam memori tumpukan. Dan variabel lokal dibuat dalam tumpukan pada saat metode disebut.
sumber