Ketika saya membuat objek, apakah memori segar dialokasikan untuk bidang contoh dan metode atau hanya untuk bidang contoh

14

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.

masukkan deskripsi gambar di sini

Harish_N
sumber
1
Berbagi penelitian Anda membantu semua orang . Beri tahu kami apa yang telah Anda coba dan mengapa itu tidak memenuhi kebutuhan Anda. Ini menunjukkan bahwa Anda telah meluangkan waktu untuk mencoba membantu diri sendiri, itu menyelamatkan kami dari mengulangi jawaban yang jelas, dan yang paling utama itu membantu Anda mendapatkan jawaban yang lebih spesifik dan relevan. Lihat juga Cara Meminta
nyamuk
3
Saya belajar java ... dan dalam semua materi mereka hanya mengatakan bahwa setiap kali kita membuat objek, memori segar dialokasikan ke semua bidang instance..tapi, tidak ada bahan yang mengatakan apakah memori segar akan dialokasikan untuk metode atau tidak
Harish_N

Jawaban:

13

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).

SJuan76
sumber
Baik. Saya 90% jelas sekarang .... Tapi sedikit keraguan .. Misalkan jika saya membuat 10 objek bertipe Student maka hanya 1 set memori segar dialokasikan untuk metode yang ada di kelas Student sedangkan 10 set memori segar adalah dialokasikan untuk menyimpan variabel instance untuk 10 objek .. Apakah saya benar?
Harish_N
Baik. Pikirkan bahwa bukan hanya properti yang mengambil memori, ada overhead kecil yang terkait dengan instance itu sendiri (instance dari kelas tanpa properti akan menggunakan lebih dari 0 byte memori).
SJuan76
Satu hal lagi ... Saya mengajukan pertanyaan dengan mengingat java .... Apakah hal yang sama terjadi di java .....
Harish_N
Spesifikasi Bahasa Jawa tidak mengatakan apa-apa tentang berapa banyak memori yang dialokasikan kapan dan untuk tujuan apa. Itu diserahkan kepada pelaksana, dan setiap pelaksana dapat memilih secara berbeda.
Jörg W Mittag
6

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:

2.5.4. Area Metode

Java Virtual Machine memiliki area metode yang dibagi di antara semua utas Java Virtual Machine. Area metode analog dengan area penyimpanan untuk kode yang dikompilasi dari bahasa konvensional atau analog dengan segmen "teks" dalam proses sistem operasi. Ini menyimpan struktur per-kelas seperti pool konstan run-time, data lapangan dan metode, dan kode untuk metode dan konstruktor, termasuk metode khusus (§2.9) yang digunakan dalam kelas dan instance inisialisasi dan inisialisasi antarmuka.

Area metode dibuat pada permulaan mesin virtual. Meskipun area metode secara logis bagian dari heap, implementasi sederhana dapat memilih untuk tidak mengumpulkan sampah atau memadatkannya. Versi spesifikasi Java Virtual Machine ini tidak mengamanatkan lokasi area metode atau kebijakan yang digunakan untuk mengelola kode yang dikompilasi. Area metode dapat berukuran tetap atau dapat diperluas seperti yang dipersyaratkan oleh perhitungan dan dapat dikontrak jika area metode yang lebih besar menjadi tidak perlu. Memori untuk area metode tidak perlu bersebelahan.

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.

codenheim
sumber
Apa yang Anda katakan masuk akal, tetapi apakah itu sebenarnya dijamin oleh JLS? Biasanya, JLS memberi banyak kelonggaran bagi pelaksana pertanyaan seperti ini.
Jörg W Mittag
Tidak yakin tentang hal itu, @ JörgWMittag. Kamu mungkin benar. Poin yang saya coba buat adalah "T baru ()" tidak mengalokasikan contoh baru metode. Mengenai spesifik JVM, classloader memang menyimpan bytecode di heap, dan saya kira ada skenario yang mungkin di mana kelas itu sendiri dipakai dan bahkan sampah dikumpulkan. Tetapi ini adalah detail implementasi runtime, dan secara konseptual, heap yang saya bicarakan adalah heap "user". Kelas & metode tidak dianggap sebagai data dalam konteks pengguna normal. Tapi karena kita juga bisa mengendalikan classloader dari userland, kurasa aku tidak tahu.
codenheim
JLS bahkan tidak berbicara tentang tumpukan sama sekali, bukan? Sangat sah untuk mengimplementasikan Java dengan tumpukan dinamis dan tanpa tumpukan alih-alih tumpukan ukuran tetap terbatas dan tumpukan dinamis. JLS juga tidak mengatakan apa-apa tentang JVM, sangat sah untuk mengimplementasikan Java tanpa JVM.
Jörg W Mittag
Anda mereferensikan JLS, tapi saya sedang berbicara JVM. Standar JVM tentu saja membahas heap. Anda harus memberikan lingkup variabel / masa pakai yang lolos dari cakupan lokal tumpukan. Adapun apa yang secara teori mungkin, saya lebih suka berpikir dalam hal "implementasi yang dikenal". Saya cukup yakin menerapkan JVM penuh tanpa tumpukan primitif adalah pekerjaan yang sulit, atau bahkan tidak mungkin, karena JVM bukan mesin tumpukan murni. Pemahaman saya tentang mesin Forth, dan arsitektur stack murni lainnya, adalah bahwa dimungkinkan jika ada primitif untuk akses variabel acak, tapi saya belum melihatnya.
codenheim
@ JörgWMittag - Saya menambahkan ke jawaban sesuatu yang mungkin menarik untuk diskusi kita. Intinya adalah saya menggambar analogi dengan kode tradisional atau segmen teks dalam sistem runtime konvensional.
codenheim
-4

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.

Abhishek Tripathi
sumber
1
Tampaknya hanya mengulang informasi yang disediakan dalam jawaban sebelumnya.