/ Forside / Teknologi / Udvikling / Java / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
Java
#NavnPoint
molokyle 3688
Klaudi 855
strarup 740
Forvirret 660
gøgeungen 500
Teil 373
Stouenberg 360
vnc 360
pmbruun 341
10  mccracken 320
Garbage collection
Fra : Tobias Tobiasen


Dato : 14-03-01 23:23

Hejsa

Tag et kig på denne kode:

public class Test {
public static void main(String args[]) {
new Test();
if (args.length > 0)
System.gc();
}
protected void finalize() throws Throwable {
System.out.println("Finalized");
}
}

Når jeg kalder det med "java Test" skriver den ingenting ud til
prompten. Kaldes programmet med "java Test gc" skriver programmet
"Finalized" ud til prompten. (java = "jdk 1.3.0 på redhat 6.2")

Er der nogen, der kan forklare mig hvorfor garbage collectoren ikke
kører inden java vm'en lukkes ned? Er det muligt at give java en option
så den kalder finalize på alle objekter?
Jeg havde forventet at alle objekters finalize() metode blev kaldt inden
objekterne blev nedlagt og vm'en slået ihjel.

Hvorfor er det et problem for mig at finalize ikke bliver kaldt? Jo nu
skal i høre... Jeg har en database connection pool singleton klasse, den
holder styr på åbne database connections. Når vm ender så vil jeg gerne
have at min finalize() metode bliver kaldt så jeg kan frigive de
connections jeg har i min pool. Ellers dropper java bare forbindelsen og
det giver grimme ting i database logfilen.

T2


 
 
Ulrik Magnusson (15-03-2001)
Kommentar
Fra : Ulrik Magnusson


Dato : 15-03-01 02:38

Tobias Tobiasen wrote:

> Er der nogen, der kan forklare mig hvorfor garbage collectoren ikke
> kører inden java vm'en lukkes ned? Er det muligt at give java en option
> så den kalder finalize på alle objekter?

Muligvis i en eller anden JVM. Jeg tror ikke det er muligt i JDK'erne (?).

> Jeg havde forventet at alle objekters finalize() metode blev kaldt inden
> objekterne blev nedlagt og vm'en slået ihjel.

Det skal du lige præcis ikke regne med:
http://mindprod.com/gotchas.html#FINALIZE

NB! System.runFinalization() :

Calling this method SUGGESTS that the Java Virtual Machine expend
effort toward running the finalize methods of objects that have been
found to
be discarded but whose finalize methods have not yet been run.

Ulrik Magnusson

--
"Uskyldig"
Peter Lundin
Visit my home page: http://www.geocities.com/ulrikm



Niels Ull Harremoës (15-03-2001)
Kommentar
Fra : Niels Ull Harremoës


Dato : 15-03-01 05:35

[...]
Som Ulrik skrev, så virker finalize() desværre ikke på den måde.

Prøv i stedet at bruge en shutdown hook - se

http://java.sun.com/j2se/1.3/docs/api/java/lang/Runtime.html#addShutdownHook
(java.lang.Thread)
og
http://java.sun.com/j2se/1.3/docs/guide/lang/hook-design.html

Niels



Dennis Thrysøe (15-03-2001)
Kommentar
Fra : Dennis Thrysøe


Dato : 15-03-01 08:15

Et shutdown hook ville være en god løsning.

En anden løsning er, at selv at styre destruction/finalization, som en
del af kodens forløb . Det kan gøres ved at lave en try {...} finally
{...} der lukker for dine database forbindelser med videre.

Det *eneste* der kan gå uden om finally {...} blokke er, så vidt jeg
ved, System.exit().

public class Test {
public static void main(String args[]) {
Test test;
try {
test = new Test();
//Other stuff
}
finally {
test.close();
}
}
protected void close() throws Throwable {
System.out.println("Closed");
}
}


-dennis

Niels Ull Harremoës wrote:

> [...]
> Som Ulrik skrev, så virker finalize() desværre ikke på den måde.
>
> Prøv i stedet at bruge en shutdown hook - se
>
> http://java.sun.com/j2se/1.3/docs/api/java/lang/Runtime.html#addShutdownHook
> (java.lang.Thread)
> og
> http://java.sun.com/j2se/1.3/docs/guide/lang/hook-design.html
>
> Niels


Søg
Reklame
Statistik
Spørgsmål : 177558
Tips : 31968
Nyheder : 719565
Indlæg : 6408929
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste