Dies ist eine statische Kopie unseres alten Forums. Es sind keine Interaktionen möglich.
This is a static copy of our old forum. Interactions are not possible.

Neo

Erfahrener Schreiberling

  • "Neo" is male
  • "Neo" started this thread

Posts: 322

Date of registration: Jul 24th 2005

Location: Hannover

Occupation: Informatik

1

Tuesday, June 5th 2007, 11:26pm

Java: Speicherreservierung

Hallo,

ich habe mal eine Frage:
Ich möchte einen integer deklarieren, aber den Wert erst später zuweisen.
Reserviert Java nun Speicherplatz für diese Variable? Oder wird
der Speicherplatz erst reserviert, wenn man der Variable einen
konkreten Wert zuweist?

Angenommen, Java würde bei der Deklaration einer Variable bereits den
für die Variable benötigte Speichermenge bereitstellen, ohne dass der Variablen
ein Wert zugewiesen wurde. Woher weiß dann Java, wieviel Speicherplatz für
Objektvariablen bereitgestellt werden muss?

Edit: Wenn Java anhand der für Instanzvariablen erkennt, wieviel Speicherplatz bereitgestellt
werden muss, wieviel Speicherplatz muss Java dann für eine Objektvariable

Object o;

bereitstellen, wenn erst zur Laufzeit ein konkreter Wert, beispielsweise

Source code

1
o = new Fussballfeld();


zugewisen wird?

This post has been edited 2 times, last edit by "Neo" (Jun 5th 2007, 11:31pm)


olexd

Praktikant

Posts: 6

Date of registration: Oct 15th 2006

2

Wednesday, June 6th 2007, 1:33am

Teoretisch kann man der Speicherplatzbedarf des Objekts in eine Formel (in bytes) fassen: 8(stets) + Speicherplatzbedarf der Verweise und Literale. Aber praktisch ist die Groesse von Inkrementierung des Objektes 8 bytes, d.h. ein Objekt kann 8, 16, 24, 32, ... bytes besetzen.

Am besten ist das an einem Beispiel zu zeigen. Sagen wir, haben wir folgendes:

Source code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class A
{
	B b = new B(); // Verweis auf object b der Klasse B - 4 bytes im Speicher
	C c = new C(); // Verweis auf object c der Klasse C - 4 bytes im Speicher
	String s; // Verweis auf objekt s der Klasse String (= null) - 4 bytes im Speicher
}
class B
{
	float floatValue = 0; // Literal - 4 bytes im Speicher
	double doubleValue = 0; // Literal - 8 bytes im Speicher
}
class C
{
	byte byteValue = 0; // Literal - 1 byte im Speicher
	short shortValue = 0; // Literal - 2 bytes im Speicher
	char charValue = 0; // Literal - 2 bytes im Speicher
	int intValue = 0; // Literal - 4 bytes im Speicher
	long longValue = 0; // Literal - 8 bytes im Speicher
}


Im beispiel beduerft Objekt der Klasse C im Heap
teoretisch: 8+1+2+2+4+8=25 bytes
praktisch: 32 bytes

Objekt der Klasse B
teoretisch: 8+4+8=20 bytes
praktisch: 24 bytes

Objekt der Klasse A
teoretisch: 8+4+4+4=20 bytes
praktisch: 24 bytes

Fuer alle 3 Objekte braucht man insgesamt 32 + 24 + 24 = 80 bytes im Speicher

julianr

Erfahrener Schreiberling

Posts: 298

Date of registration: Oct 13th 2005

Location: I live in a giant bucket.

3

Wednesday, June 6th 2007, 2:13am

@OP:

Ein Integer (im Sinne von int) ist so groß, wie der Datentyp eben ist, in dem Fall vier Byte, und die nimmt er ab der Definition ein. Das gilt für alle eingebauten Datentypen. Java unterscheidet hier, und für eingebaute Datentypen gelten direkte Wertsemantiken.

Eine Objektreferenz, egal auf welches Objekt, nimmt wahrscheinlich irgendwie 4 oder 8 Byte ein (auf x86) - ist jedenfalls nichts, worauf man sich verlassen sollte. Der Punkt ist einfach: Mit "Object o" definierst du eine Referenz. Was du ihr später zuweist, ändert an der Größe *der Referenz* nichts.

Da sieht man mal, wofür Sprachen gut sind, wo man Zeiger noch als solche erkennt... *seufz* :)

This post has been edited 1 times, last edit by "julianr" (Jun 6th 2007, 2:17am)


RedKen

Trainee

  • "RedKen" is male

Posts: 105

Date of registration: Nov 15th 2004

Location: Hannover Rock-City

4

Wednesday, June 6th 2007, 2:14am

RE: Java: Speicherreservierung

Alles folgende unter Vorbehalt:
Also die int Variable wird mit 0 vorinitialisert und belegt also sofort Speicherplatz.
Wenn du ein Objekt der Klasse Fussballfeld erzeugst wird von der VM zunächst die Superklasse initilaisiert und dann alle statischen Daten der Klasse im Speicher abgelegt. Dann werden alle nicht statischen Instanzvariablen mit den Initialwerten belegt und dann der Konstruktor ausgeführt. Die Variable o würde also bis zum Aufruf

Source code

1
o = new FussballFeld();

auf null gesetzt sein und somit nur den Platz für eine Objektreferenz belegen.
Für weiter Instanzen der selben Klasse muss nur für die nicht-statischen Variablen Speicherplatz reserviert werden.
Für mehr Details oder korrektere Beschreibung siehe VMSpec
insbesondere 2.17.4 ff.

viel Spass damit ;-)
ich sitz' am Puls der Zeit und schneid' und schneid' und schneid'...

ctk

Trainee

  • "ctk" is male

Posts: 113

Date of registration: Oct 15th 2004

5

Thursday, June 7th 2007, 11:37am

RE: Java: Speicherreservierung

Ansonsten einfach mal ausprobieren.

Source code

1
java -verbose:gc <mainklasse>

Führt dazu das der Garbage Collector jedesmal mitteilt, wieviel Speicher er freigegeben hat.
Technik ist der Wettlauf der Intelligenz mit der Kreativität der Narren.
Bis heute haben die Narren immer gewonnen.

silence

Junior Schreiberling

Posts: 177

Date of registration: Dec 11th 2001

Location: reagenzglas

Occupation: tellerwäscher

6

Wednesday, June 13th 2007, 11:34am

RE: Java: Speicherreservierung

Wer ein bissl präziser messen möchte:

Instrumentation Memory Counter Agent
"Wir stecken immer in der Scheisse, nur die Tiefe ändert sich."
(Ein unbekannter Softwareentwickler)