Bir nesne oluşturduğumda, hem örnek alanlarına hem de yöntemlere veya yalnızca örnek alanlarına yeni bir bellek ayrılır


14

Aşağıdaki dersim var

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

}
}

Şimdi Öğrenci türünde iki nesne aşağıdaki gibi oluşturuyorum

Student s1=new Student();
Student s2=new Student();

Şimdi, örneğin alanlar için iki farklı bellek kümesi tahsis edilmiştir. Şimdi benim sorum bellek yöntemleri ( setResultve displayResult) için iki kez veya bir kez tahsis edilir mi?

Lütfen aşağıdaki şekle bakın ve hangi şeklin doğru bilgi verdiğini söylememe yardımcı olabilir misiniz?

resim açıklamasını buraya girin


1
Araştırmanızı paylaşmak herkese yardımcı olur . Neyi denediğinizi ve neden ihtiyaçlarınızı karşılamadığını bize bildirin. Bu, kendinize yardımcı olmak için zaman ayırdığınızı gösterir, bizi açık cevapları tekrar etmekten kurtarır ve en önemlisi daha spesifik ve ilgili bir cevap almanıza yardımcı olur. Ayrıca bkz. Nasıl
Sorulur

3
Java öğreniyorum ... ve tüm materyallerde sadece bir nesne yarattığımızda tüm örnek alanlarına yeni bir bellek tahsis edildiğini söylüyorlar ... ama, malzemelerin hiçbiri yöntemler için taze belleğin tahsis edilip edilmeyeceğini söylemedi. değil
Harish_N

Yanıtlar:


13

Yöntem kodu Class(daha kısaca Class<Student>) bir parçasıdır ve sınıf ilk yüklendiğinde belleğe yüklenir.

Bununla birlikte, herhangi bir yöntemi yürüttüğünüzde, parametrelere, yerel değişkenlere, geçici ifade sonuçlarına, dönüş değerlerine vb. Bellek ayırmak için ek bellek kullanılır. Ancak bu tür bellek yığına ayrılır (yeni bir örnek oluşturulurken kullanılan bellek yığına ayrılır .

Sorunuza göre, şimdi şekil B'nin doğru olduğu açık olmalıdır (ancak yöntemi gerçekten çağırdığınızda ne olduğunu yansıtmasa da).


Tamam. Şimdi% 90 açıkım .... Ama küçük bir şüphe .. Varsayalım 10 tür Öğrenci nesnesi oluşturursam, o zaman Öğrenci sınıfında mevcut yöntemlere sadece 1 set taze bellek tahsis edilirken 10 set taze bellek ise 10 nesne için örnek değişkenleri saklamak için ayrıldı .. değil mi?
Harish_N

Sağ. Sadece bellek alan özellikler değil, örneğin kendisiyle ilgili küçük bir ek yük olduğunu düşünün (özelliği olmayan bir sınıfın örneği 0 bayttan fazla bellek kullanır).
SJuan76

Bir şey daha ... Java akılda tutarak soru sordum .... Aynı şey java olur .....
Harish_N

Java Dil Spesifikasyonu ne zaman ve hangi amaçla ne kadar bellek ayrıldığı hakkında bir şey söylemez. Bu, uygulayıcıya bırakılır ve her uygulayıcı farklı seçim yapabilir.
Jörg W Mittag

6

Örnek alanları (özellik destek alanları dahil), N nesneleri için N kopya alır.

Statik alanlar sınıf başına tek bir kopya alır.

Yöntemler, programın "görüntüsü" veya yürütülebilir kod segmentinin parçası olan bayt kodu bloklarıdır (veya JIT'den sonra, yerel talimat bloklarıdır). Yöntemler, diskte bulunduğu için program görüntüsünün bir parçasıdır. Görüntü OS (veya CLR) tarafından yüklendikten sonra, yöntem kodunun tek bir paylaşılan kopyası vardır.

Bunlar, hostable derleyicisini anında yeni yöntemler derlemek için kullanabileceğiniz durumlar dışında, "yığın" veya genel olarak çalışma zamanı tahsisinin bir parçası değildir. Yöntemler nesneler gibi "tahsis edilmez" ve nesne oluşturmaya göre "tahsis edilmez". Tek bir nesne somutlaştırılmadan önce sadece programın bir parçası olarak var olurlar. Lamdalar / delegeler bile anında tahsis edilmiyor. Derleyici, bu diğer dinamik kod nesnelerini uygulamak için isteğe bağlı sınıflar oluşturur ve bunlar diskteki bayt kodu görüntüsünün bir parçası olarak da bulunur.

Yorum başına GÜNCELLEME:

JVM standardı şunları söylemektedir:

2.5.4. Yöntem Alanı

Java Sanal Makinesi'nin tüm Java Sanal Makinesi iş parçacıkları arasında paylaşılan bir yöntem alanı vardır. Yöntem alanı, geleneksel bir dilin derlenmiş kodu için depolama alanına benzer veya bir işletim sistemi işlemindeki "metin" segmentine benzer. Çalışma zamanı sabit havuzu, alan ve yöntem verileri gibi sınıf başına yapıları ve sınıf ve örnek başlatma ve arabirim başlatmada kullanılan özel yöntemler (§2.9) dahil olmak üzere yöntem ve kurucular için kodu saklar.

Yöntem alanı sanal makine başlangıcında oluşturulur. Yöntem alanı mantıksal olarak yığının bir parçası olmasına rağmen, basit uygulamalar çöp toplamayı veya sıkıştırmamayı seçebilir. Java Sanal Makine belirtiminin bu sürümü, yöntem alanının konumunu veya derlenmiş kodu yönetmek için kullanılan ilkeleri zorunlu kılmaz. Yöntem alanı sabit bir boyutta olabilir veya hesaplama gereği olarak genişletilebilir ve daha büyük bir yöntem alanı gereksiz hale gelirse daralabilir. Yöntem alanı için belleğin bitişik olması gerekmez.

Bu nedenle (1) evet spesifikasyonun bunun nasıl yapıldığını dikte etmediği açıktır, ancak (2) geleneksel bir dilin derlenmiş kodu için depolama alanına benzerdir, yani. metin segmenti. Yaptığım nokta bu.


Söyledikleriniz mantıklı, ama bu aslında JLS tarafından garanti ediliyor mu? Normalde JLS, uygulayıcılara böyle sorularda çok fazla boşluk sağlar.
Jörg W Mittag

Bu noktada emin değilim, @ JörgWMittag. Haklı olabilirsin. Belirtmeye çalıştığım nokta, "new T ()" yönteminin yeni bir örneğini ayırmıyor. JVM'nin özelliklerine gelince, sınıf yükleyiciler gerçekten bayt kodunu yığın halinde depolar ve sanırım sınıfların kendilerinin örneklendiği ve hatta çöplerin toplandığı olası senaryolar vardır. Ama bu, çalışma zamanının uygulama detayıdır ve kavramsal olarak, bahsettiğim yığın "kullanıcı" yığınıdır. Sınıf ve yöntemler, normal kullanıcı bağlamında veri olarak kabul edilmez. Ancak bir sınıf yükleyiciyi kullanıcı alanından da kontrol edebildiğimiz için, sanırım bilmiyorum.
codenheim

JLS bir yığın hakkında bile konuşmuyor, değil mi? Java'yı sonlu sabit boyutlu bir yığın ve dinamik bir yığın yerine dinamik bir yığınla ve yığın olmadan uygulamak tamamen yasaldır. JLS ayrıca JVM hakkında hiçbir şey söylemez, Java'yı JVM olmadan uygulamak için tamamen geçerlidir.
Jörg W Mittag

JLS'ye atıfta bulunuyorsunuz, ama JVM'den bahsediyorum. JVM standardı kesinlikle yığını tartışıyor. Yığının yerel kapsamından kaçan değişken bir kapsam / yaşam süresi sağlamalısınız. Teorik olarak neyin mümkün olduğunu "bilinen uygulamalar" olarak düşünmeyi tercih ederim. Yığın ilkel olmadan tam bir JVM uygulamak, JVM saf bir yığın makinesi olmadığından zor, hatta imkansız bir iş olduğundan eminim. Forth makineleri ve diğer saf yığın mimarileri hakkındaki anlayışım, rasgele değişken erişim için bir ilkel var olmanın mümkün olabileceğidir, ancak henüz görmedim.
codenheim

@ JörgWMittag - Cevaba tartışmamızın ilgisini çekebilecek bir şey ekledim. Mesele şu ki, geleneksel çalışma zamanı sistemlerindeki geleneksel koda veya metin segmentine bir benzetme yapıyordum.
codenheim

-4

yığın belleğinde ayrılan nesne. nesne tahsis edildiğinde, nesne yok edildiğinde tüm örnek değişkeni için yuva oluşturulur ve yok edilir. bu nedenle, örnek değişkeni de yığın belleğinde ayrılır. Ve yerel değişken, yöntem denir.


1
Bu sadece önceki yanıtlarda verilen bilgileri tekrarlıyor gibi görünüyor.
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.