java usuwanie obiektow

0

Witam mam kilka problemow zwiazanych z java, ktore mnie drecza.

Class MyObject {

public MyObject itself;

public void set (MyObject it){
itself = it; }

//metody

}

MyObject  obj = new MyObject 
obj.set(obj);

1.1Czy w takim przypadku obiekt ten nie zostanie nigdy skasowany? tzn zeby sie go pozbyc nalezaloby zarowno itself jak i obj ustawic na null? Czy take cos sie stosuje? Co by sie stalo jakbym obj ( this ) jak i itself ustawil na null wewnatrz jakiejs metody?

  1. Watki
//jakas klasa
public void Metoda(){


Klasa  klasa= new Klasa;

klasa.rob();

}

2.1Czy istnieje w javie cos takiego jak zasieg lokalny obiektu? Czy ten obiekt zostanie usuniety wraz z konciem metody Metoda() ?

//jakas klasa
public void Metoda(){


KlasaWatku  watek= new KlasaWatku().start();


}

2.2 Jak bedzie w tym przypadku wzgledem 2.1?

0

1.1. obj będzie gotowy do odśmiecenia, gdy nigdzie nie będzie do niego referencji. Najłatwiej sprawdzić to poprzez nadpisanie metody finalize w tej klasie. finalize() jest uruchamiane przez Garbage Collectora.

@Override
protected void finalize() throws Throwable {
	System.out.println("obj żegna!");
	super.finalize();
}

2.1. Wraz z końcem metody będzie gotowy do odśmiecenia. Niekoniecznie zostanie odśmiecony. Garbage Collector sam zdecyduje, kiedy go wywalić. Więc tak, istnieje coś takiego w Javie. Ponadto możesz jeszcze bardziej ograniczać zasięg obiektów (chociaż nigdy nie widziałem, aby ktoś to stosował) w ten sposób:

private void metoda() {
	String test1 = "test1";
	{
		String test2 = "test2";
		System.out.println(test1 + test2);
	}
	System.out.println(test1);
}

2.2. Tu mam wrażenie, że coś jest nie tak jak chciałeś, ale zakładamy, że uruchomiłeś wątek prawidłowo, czyli

Thread t = new Thread(new KlasaImplementujacaRunnable);
t.start();

Jeżeli nie przetrzymujesz referencji tak jak powyżej albo na końcu metody, jeżeli referencja była w ciele metody, instancja będzie gotowa do odśmiecenia po zakończeniu metody run().

Pisałem z pracy, więc może być trochę chaotycznie.

0

Dzieki.

Czyli w przypadku, gdy mam przypisany jakis actionListener do przycisku, ktory po kzdym kliknieciu tworzy jakis obiekt, przykladowo.

public void actionPerformed(...){

InfoOKliknieciu info = new InfoOKliknieciu( //jakies parametry)


}

, to zeby nie stracic tych obiektow z pamieci, musialbym dodac ich referencje np, do listy?
Jakkolwiek ten przyklad jest bez sensu, ale chodzi mi tylko o iedee.

0

Tak. Musiałbyś w jakiś sposób przechowywać referencje do nich. No bo jak chcesz wykorzystać instancję (powiedzmy wywołać jakąś metodę klasy), do której i tak nie masz referencji? :) Przecież ciało metody actionPerformed zostało już wykonane. Chyba, że nie do końca łapię o co Ci chodzi.

0

Dlatego zaznaczylem, ze ten przyklad jest bez sensu. CHodzilo tylko o idee :p

0

Nie zgadzam się z tym finalize(). Metoda finalize() MOŻE ale NIE MUSI zostać wywołana. Dlatego nie jest zalecane jej stosowanie. Garbage Collector, o ile wiem, wykrywa proste cykle w grafie referencji, więc takie coś, jak pokazałeś na początku, powinno zostać usunięte (zakładając, że nic więcej nie trzyma tego obiektu).

0

Nie zgadzam się z tym finalize(). Metoda finalize() MOŻE ale NIE MUSI zostać wywołana. Dlatego nie jest zalecane jej stosowanie. Garbage Collector, o ile wiem, wykrywa proste cykle w grafie referencji, więc takie coś, jak pokazałeś na początku, powinno zostać usunięte (zakładając, że nic więcej nie trzyma tego obiektu).

Finalize jest zawsze wykonywane - ale jest niezalecana ponieważ powoduje potencjalny spadek wydajności GC.
GC wykrywa cykle, to właśnie najtrudniejsza część jego roboty.
Zresztą tworzenie własnego finalizera jest so C++. Jeśli piszesz w Javie to pisz jak javowiec, nie jak asemblerowy dłubacz.
Napisane na podstawie podobieństwa do .NET które podobno jest kalką Javy.

0

@Tezcatlipoca: Masz rację, pomyliło mi się. "Finalizatory są nieprzewidywalne, często niebezpieczne i zwykle niepotrzebne. Ich zastosowanie może powodować nieprawidłową pracę programu, problemy z przenośniością i obniżenie wydajności. (...) Nie ma żadnej gwarancji, że finalizator zostanie wykonany natychmiast." [Java. Efektywne programowanie, str. 47]

0
[losowa nazwa] napisał(a)

Nie zgadzam się z tym finalize(). Metoda finalize() MOŻE ale NIE MUSI zostać wywołana. Dlatego nie jest zalecane jej stosowanie. Garbage Collector, o ile wiem, wykrywa proste cykle w grafie referencji, więc takie coś, jak pokazałeś na początku, powinno zostać usunięte (zakładając, że nic więcej nie trzyma tego obiektu).

O finalize() wspomniałem tylko i wyłącznie w kontekście obserwowania jak działa GC (stąd syso). Nigdzie nie sugerowałem "ręcznego" wywoływania tej metody.

1 użytkowników online, w tym zalogowanych: 0, gości: 1