konto usunięte

Temat: Stos i sterta

Mam pytanie techniczne. Zmienne tworzone wewnątrz ciała klasy to zmienne instancji, które są tworzone na stercie, zmienne wewnątrz metod to zmienne lokalne tworzone na stosie, a co z parametrami metod ? zmienne reprezentujące parametry metody nie statycznej na przykład :

public void doSomething(String s){ // s zostanie stworzone na stosie jako // zmienna lokalna
...
}

a co się dzieje w przypadku kiedy metoda będzie statyczna ?

public static void doSomething(String s){ // ?
...
}

i czy dla metody main będzie tak samo ?

public static void main(String[] args) { // ?
...
}

Bardzo bym prosił o wyjaśnienie.

P.S czy jest jakaś wtyczka, która pozwoli mi śledzić gdzie znajduje się zmienna ? Może macie godny polecenia artykuł, dotyczący zagadnień Java a stos i sterta ?

konto usunięte

Temat: Stos i sterta

Myślę, że to powinno pomóc.

1. Katalog bin JDK,
2. http://www.yourkit.com/home/index.jsp
3. http://java-source.net/open-source/profilers

Pozdrawiam,
Łukasz
Piotr Skoczek

Piotr Skoczek SonarMind, Java
Developer

Temat: Stos i sterta

■ Instance variables and objects live on the heap.
■ Local variables live on the stack.

Reasumując, wszystkie obiekty są umieszczone w stercie, natomiast referencje są umieszczane na stosie. W przypadku wywołania metody:

public void method(String argument);

metoda i referencja do obiektu argument będą na stosie, a sam obiekt już na stercie. W przypadku main(String[] args) należy zwrócić uwagę, iż tablice w javie również są obiektem, czyli po raz kolejny obiekty tablicy będą na stercie, a referencja do obiektu tablicy na stosie. Inaczej jest z typami prymitywnymi, które de facto nie są obiektami. Jeśli się mylę, proszę osoby z większym doświadczeniem o poprawę.

ps. z tym katalogiem bin jdk to zapewne chodziło o JConsole ?? ;) Piotr Skoczek edytował(a) ten post dnia 02.07.11 o godzinie 15:35
Marek Sierbin

Marek Sierbin Java Developer

Temat: Stos i sterta

Zobrazuję działanie JVM na skromnym przykładzie -- tak będzie łatwiej.

 class Test {

int instVar = 47;
Object instObj = new InstanceObject();

int method() {

int locVar = 13;
Object locObj = new LocalObject();
}
}


Pola klasy instVar, instObj wraz z wartością '47' i obiektem 'InstanceObject' są "stanową" częścią obiektu, więc jak sam obiekt przechowywane są na stercie.

Metody są częścią "funkcjonalną" klasy, stąd zmienne lokalne locVar, locObj są przechowywane na stosie. W momencie wywołania metody na stos ładowana jest ramka stosu w której dla powyższego przykładu znajdzie się wartość '13', oraz adres na obiekt LocalObject przechowywany na stercie.Marek S. edytował(a) ten post dnia 08.09.12 o godzinie 18:14



Wyślij zaproszenie do