item 8 junghyunlyoo - JAVA-JIKIMI/EFFECTIVE-JAVA3 GitHub Wiki

์ž๋ฐ”๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๊ฐ์ฒด ์†Œ๋ฉธ์ž 2๊ฐ€์ง€, finalizer์™€ cleaner

@Override
public void finalize() {
    // ...
}

Object ํด๋ž˜์Šค์— ์ •์˜๋œ finalize ๋ฉ”์„œ๋“œ๋ฅผ Overrideํ•˜๋ฉด ํ•ด๋‹น ๊ฐ์ฒด๊ฐ€ GC ๋Œ€์ƒ์ด ๋  ๋•Œ finalize ๋ฉ”์†Œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋œ๋‹ค.

public class CleaningExample implements AutoCloseable {
    // A cleaner, preferably one shared within a library
    private static final Cleaner cleaner = <cleaner>;

    static class State implements Runnable {

        State(...) {
            // initialize State needed for cleaning action
        }

        public void run() {
            // cleanup action accessing State, executed at most once
        }
    }

    private final State;
    private final Cleaner.Cleanable cleanable

    public CleaningExample() {
        this.state = new State(...);
        this.cleanable = cleaner.register(this, state);
    }

    public void close() {
        cleanable.clean();
    }
}

cleaner์˜ ์‚ฌ์šฉ ๋ฐฉ๋ฒ•์€ finalizer๋ณด๋‹ค ์•ฝ๊ฐ„ ๋ณต์žกํ•˜๋‹ค.

๊ทธ๋ฆฌ๊ณ  finalizer์™€ ๋‹ฌ๋ฆฌ cleaner๋Š” ํด๋ž˜์Šค์˜ public API์— ๋‚˜ํƒ€๋‚˜์ง€ ์•Š๋Š”๋‹ค.

์šฐ์„  CleaningExample ์ธ์Šคํ„ด์Šค๊ฐ€ close ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๊ฒŒ ๋˜๋ฉด cleaner๊ฐ€ ์‹คํ–‰๋œ๋‹ค.

๊ทธ๋ฆฌ๊ณ  cleaner๋Š” State ์Šค๋ ˆ๋“œ๋ฅผ ์‹คํ–‰์‹œํ‚ค๊ฒŒ ๋˜๊ณ  State ์Šค๋ ˆ๋“œ ๋‚ด๋ถ€์— ์ž์› ํ•ด์ œ์— ๊ด€๋ จ๋œ ๋‚ด์šฉ์„ ์ฑ„์šฐ๋ฉด ๋œ๋‹ค.

์ฐธ๊ณ ๋กœ State ์Šค๋ ˆ๋“œ๋Š” ๋”ฑ ํ•œ๋ฒˆ๋งŒ ํ˜ธ์ถœ๋œ๋‹ค. ๋งŒ์•ฝ ์‚ฌ์šฉ์ž๊ฐ€ CleaningExample ์ธ์Šคํ„ด์Šค์˜ close๋ฅผ ํ˜ธ์ถœํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด

GC๊ฐ€ CleaningExample ์ธ์Šคํ„ด์Šค๋ฅผ ํšŒ์ˆ˜ํ•  ๋•Œ cleanable.clean์„ ์‹คํ–‰์‹œ์ผœ์ค„ ๊ฒƒ์ด๋‹ค.

๊ทธ๋Ÿฐ๋ฐ GC์— ๋”ฐ๋ผ ์‹ค์ œ๋กœ ์‹คํ–‰๋  ์ˆ˜๋„ ์‹คํ–‰์ด ์•ˆ ๋  ์ˆ˜๋„ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์ฃผ์˜ํ•ด์•ผ ํ•œ๋‹ค.

finalizer์™€ cleaner๋ฅผ ์ง€์–‘ํ•ด์•ผ ํ•˜๋Š” ์ด์œ 

finalize ๋ฉ”์†Œ๋“œ๋ฅผ ์žฌ์ •์˜ํ•˜๋Š” ๊ฒƒ์„ ์ง€์–‘ํ•ด์•ผํ•  ์ด์œ ๊ฐ€ ๋ช‡ ๊ฐ€์ง€ ์žˆ๋‹ค.

  1. ์–ธ์ œ ํ˜ธ์ถœ๋ ์ง€ ์˜ˆ์ธกํ•  ์ˆ˜ ์—†๋‹ค.

  2. ๋ง‰์ƒ ํ˜ธ์ถœ๋์„ ๋•Œ, ์ƒํ™ฉ์— ๋”ฐ๋ผ ์œ„ํ—˜ํ•  ์ˆ˜ ์žˆ๋‹ค.

๊ทธ๋ž˜์„œ ๊ธฐ๋ณธ์ ์œผ๋กœ '์“ฐ์ง€ ๋ง์•„์•ผ' ํ•œ๋‹ค.

Java 9์—์„œ๋Š” finalize ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉ ์ž์ œ(deprecated) API๋กœ ์ง€์ •ํ•˜๊ณ 

์ƒ๋Œ€์ ์œผ๋กœ ๋œ ์œ„ํ—˜ํ•œ clean ๋ฉ”์†Œ๋“œ๋ฅผ ๊ทธ ๋Œ€์•ˆ์œผ๋กœ ์†Œ๊ฐœํ•˜๊ธฐ๋„ ํ–ˆ๋‹ค.

ํ•˜์ง€๋งŒ clean ๋ฉ”์†Œ๋“œ๋„ ์—ญ์‹œ ์˜ˆ์ธก ๋ถˆ๊ฐ€๋Šฅํ•˜๊ณ  ์ผ๋ฐ˜์ ์œผ๋กœ ๋ถˆํ•„์š”ํ•˜๋‹ค.

์˜ˆ์ธก ๋ถˆ๊ฐ€๋Šฅํ•œ finalizer์™€ cleaner์˜ ์ˆ˜ํ–‰ ์‹œ์ 

finalize ๋ฉ”์†Œ๋“œ๋Š” ์–ธ์ œ ์‹คํ–‰๋ ์ง€ ์•Œ ์ˆ˜ ์—†๋‹ค.

finalize ๋ฉ”์†Œ๋“œ๋Š” GC๊ฐ€ ์‹คํ–‰๋  ๋•Œ ๋ฐ”๋กœ ์‹คํ–‰๋˜์ง€ ์•Š๋Š”๋‹ค.

๊ทธ ์ด์œ ๋Š” ์ด๋ ‡๋‹ค.

GC๊ฐ€ ์‹คํ–‰๋ ๋•Œ ๊ฐ์ฒด๋“ค์„ ์Šค์บ”ํ•˜๋Š”๋ฐ, ๊ทธ ๊ฐ์ฒด๊ฐ€ finalize ๋ฉ”์†Œ๋“œ๋ฅผ ์žฌ์ •์˜ํ–ˆ์„ ๊ฒฝ์šฐ ๊ทธ ๊ฐ์ฒด๋Š” Finalization Queue์— ๋“ค์–ด๊ฐ€๊ฒŒ ๋œ๋‹ค.

๊ทธ๋ฆฌ๊ณ  Finalizer์— ์˜ํ•ด ์ •๋ฆฌ๊ฐ€ ๋œ๋‹ค.

Fianlizer๊ฐ€ Queue์— ๋“ค์–ด๊ฐ„ ๊ฐ์ฒด๋“ค์„ ๋น ๋ฅด๊ฒŒ ์ฒ˜๋ฆฌํ•˜๋ฉด ์ข‹์„ํ…๋ฐ ์•„์‰ฝ๊ฒŒ๋„ Fianlizer ์Šค๋ ˆ๋“œ๋Š” ์šฐ์„ ์ˆœ์œ„๊ฐ€ ํ•ญ์ƒ ๊ฐ€์žฅ ๋†’์ง€๋Š” ์•Š๋‹ค.

Finalizer ์Šค๋ ˆ๋“œ๋ฅผ ์ง์ ‘ ์ปจํŠธ๋กคํ•  ์ˆ˜ ์—†์–ด์„œ ์šฐ์„ ์ˆœ์œ„๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

๊ทธ๋ž˜์„œ Finalizer ์Šค๋ ˆ๋“œ๊ฐ€ ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ๋“ค์— ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋ฐ€๋ ค ์‹คํ–‰์ด ๋ฏธ๋ค„์ง„๋‹ค๋ฉด Finalization Queue์— ๊ฐ์ฒด๊ฐ€ ์Œ“์ด๊ฒŒ ๋œ๋‹ค.

๊ทธ๋ ‡๊ฒŒ ๋˜๋ฉด OutOfMemory ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

ํ˜น์€ finalize ๋ฉ”์†Œ๋“œ ๋‚ด์— file์— ๊ด€๋ จ๋œ ๊ฐ์ฒด์˜ ์ž์›์„ ํšŒ์ˆ˜ํ•˜๋Š” ๋กœ์ง์ด ๋“ค์–ด์žˆ๋‹ค๋ฉด,

์ƒˆ๋กœ์šด ํŒŒ์ผ์„ ์—ด์ง€ ๋ชปํ•ด ํ”„๋กœ๊ทธ๋žจ์ด ์‹คํŒจํ•ด๋ฒ„๋ฆด ์ˆ˜๋„ ์žˆ๋‹ค.

์™œ๋ƒํ•˜๋ฉด ์‹œ์Šคํ…œ์ด ๋™์‹œ์— ์—ด ์ˆ˜ ์žˆ๋Š” ํŒŒ์ผ ๊ฐœ์ˆ˜๋Š” ํ•œ๊ณ„๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.


finalizer๋‚˜ cleaner๋ฅผ ์–ผ๋งˆ๋‚˜ ์‹ ์†ํžˆ ์ˆ˜ํ–‰ํ• ์ง€๋Š” ์ „์ ์œผ๋กœ

GC ์•Œ๊ณ ๋ฆฌ์ฆ˜์— ๋‹ฌ๋ ธ์œผ๋ฉฐ ์ด๋Š” GC ๊ตฌํ˜„๋งˆ๋‹ค ์ฒœ์ฐจ๋งŒ๋ณ„์ด๋‹ค.

finalizer๋‚˜ cleaner ์ˆ˜ํ–‰ ์‹œ์ ์— ์˜์กดํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์˜ ๋™์ž‘ ๋˜ํ•œ ๋งˆ์ฐฌ๊ฐ€์ง€๋‹ค.

๋‚ด JVM์—์„œ๋Š” ์ž˜ ๋Œ์•„๊ฐ€๋Š”๋ฐ, ๋‹ค๋ฅธ JVM์—์„œ๋Š” ์‹คํŒจํ•  ์ˆ˜๋„ ์žˆ๋‹ค.


ํ•œํŽธ cleaner๋Š” ์ž์‹ ์„ ์ˆ˜ํ–‰ํ•  ์Šค๋ ˆ๋“œ๋ฅผ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๋ฉด์—์„œ ์กฐ๊ธˆ ๋‚ซ๋‹ค.

ํ•˜์ง€๋งŒ ์—ฌ์ „ํžˆ ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ์ˆ˜ํ–‰๋˜๋ฉฐ GC์˜ ํ†ต์ œํ•˜์— ์žˆ์œผ๋‹ˆ ์ฆ‰๊ฐ ์ˆ˜ํ–‰๋˜๋ฆฌ๋ผ๋Š” ๋ณด์žฅ์€ ์—†๋‹ค.

๋ณด์žฅ๋˜์ง€ ์•Š๋Š” finalizer์™€ cleaner์˜ ์ˆ˜ํ–‰ ์—ฌ๋ถ€

์ž๋ฐ” ์–ธ์–ด ๋ช…์„ธ๋Š” finalizer๋‚˜ cleaner์˜ ์ˆ˜ํ–‰ ์‹œ์ ๋ฟ ์•„๋‹ˆ๋ผ ์ˆ˜ํ–‰ ์—ฌ๋ถ€์กฐ์ฐจ ๋ณด์žฅํ•˜์ง€ ์•Š๋Š”๋‹ค.

์ ‘๊ทผํ•  ์ˆ˜ ์—†๋Š” ์ผ๋ถ€ ๊ฐ์ฒด์— ๋”ธ๋ฆฐ ์ข…๋ฃŒ ์ž‘์—…์„ ์ „ํ˜€ ์ˆ˜ํ–‰ํ•˜์ง€ ๋ชปํ•œ ์ฑ„ ํ”„๋กœ๊ทธ๋žจ์ด ์ค‘๋‹จ๋  ์ˆ˜๋„ ์žˆ๋‹ค๋Š” ์–˜๊ธฐ๋‹ค.

๋”ฐ๋ผ์„œ ํ”„๋กœ๊ทธ๋žจ ์ƒ์• ์ฃผ๊ธฐ์™€ ์ƒ๊ด€์—†๋Š”, ์ƒํƒœ๋ฅผ ์˜๊ตฌ์ ์œผ๋กœ ์ˆ˜์ •ํ•˜๋Š” ์ž‘์—…์—์„œ๋Š” ์ ˆ๋Œ€ finalizer๋‚˜ cleaner์— ์˜์กดํ•ด์„œ๋Š” ์•ˆ๋œ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด DB๊ฐ™์€ ๊ณต์œ  ์ž์›์˜ ์˜๊ตฌ ๋ฝ(lock) ํ•ด์ œ๋ฅผ finalizer๋‚˜ cleaner์— ๋งก๊ฒจ ๋†“์œผ๋ฉด ๋ถ„์‚ฐ ์‹œ์Šคํ…œ ์ „์ฒด๊ฐ€ ์„œ์„œํžˆ ๋ฉˆ์ถœ ๊ฒƒ์ด๋‹ค.


ํ˜น์—ฌ๋‚˜ System.gc๋‚˜ System.runFinalization ๋ฉ”์„œ๋“œ์— ํ˜„ํ˜น๋˜์ง€ ๋ง์ž.

finalizer์™€ cleaner๊ฐ€ ์‹คํ–‰๋  ๊ฐ€๋Šฅ์„ฑ์„ ๋†’์—ฌ์ค„ ์ˆ˜๋Š” ์žˆ์œผ๋‚˜, ๋ณด์žฅํ•ด์ฃผ์ง„ ์•Š๋Š”๋‹ค.

์‚ฌ์‹ค ์ด๋ฅผ ๋ณด์žฅํ•ด์ฃผ๊ฒ ๋‹ค๋Š” ๋ฉ”์„œ๋“œ๊ฐ€ 2๊ฐœ ์žˆ์—ˆ๋‹ค.

๋ฐ”๋กœ System.runFinalizersOnExit์™€ ๊ทธ ์Œ๋‘ฅ์ด์ธ Runtime.runFianlizersOnExit์ด๋‹ค.

ํ•˜์ง€๋งŒ ์ด ๋‘ ๋ฉ”์„œ๋“œ๋Š” ์‹ฌ๊ฐํ•œ ๊ฒฐํ•จ ๋•Œ๋ฌธ์— ์ˆ˜์‹ญ๋…„๊ฐ„ ์ง€ํƒ„๋ฐ›์•„ ์™”๋‹ค.

(์ฑ…์—์„œ ๋ฐฉ๊ธˆ ์œ„ ๋ฌธ์žฅ ์˜†์— [ThreadStop] ์ด๋ผ๊ณ  ์ ํ˜€์žˆ๋Š”๋ฐ, ์•„๋งˆ ๋‘ ์Œ๋‘ฅ์ด ๋ฉ”์„œ๋“œ๊ฐ€ ์‹คํ–‰๋˜๋ฉด GC์˜ Stop The World์™€ ๋น„์Šทํ•œ ์ƒํ™ฉ์ด ๋ฒŒ์–ด์ง€๋‚˜๋ณด๋‹ค.)

๋งค์šฐ ์น˜๋ช…์ ์ธ <finalize ๋ฉ”์†Œ๋“œ ์‹คํ–‰ ์ค‘ ๋ฐœ์ƒํ•˜๋Š” ์˜ˆ์™ธ>

finalize ๋ฉ”์†Œ๋“œ ์‹คํ–‰ ์ค‘ ๋ฐœ์ƒํ•˜๋Š” ์˜ˆ์™ธ๋Š” ๋ฌด์‹œ๋˜๋ฉฐ, ์ฒ˜๋ฆฌํ•  ์ž‘์—…์ด ๋‚จ์•˜๋”๋ผ๋„ ๊ทธ ์ˆœ๊ฐ„ ์ข…๋ฃŒ๋œ๋‹ค.

์žก์ง€ ๋ชปํ•œ ์˜ˆ์™ธ ๋•Œ๋ฌธ์— ํ•ด๋‹น ๊ฐ์ฒด๋Š” ์ž์นซ ๋งˆ๋ฌด๋ฆฌ๊ฐ€ ๋œ ๋œ ์ƒํƒœ๋กœ ๋‚จ์„ ์ˆ˜ ์žˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ๊ฐ€ ์ด์ฒ˜๋Ÿผ ํ›ผ์†๋œ ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜๋ ค ํ•œ๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ• ์ง€ ์˜ˆ์ธกํ•  ์ˆ˜ ์—†๋‹ค.

๋ณดํ†ต์˜ ๊ฒฝ์šฐ์—” ์žก์ง€ ๋ชปํ•œ ์˜ˆ์™ธ๊ฐ€ ์Šค๋ ˆ๋“œ๋ฅผ ์ค‘๋‹จ์‹œํ‚ค๊ณ  ์Šคํƒ ์ถ”์  ๋‚ด์—ญ์„ ์ถœ๋ ฅํ•˜๊ฒ ์ง€๋งŒ,

๊ฐ™์€ ์ผ์ด finalizer์—์„œ ์ผ์–ด๋‚œ๋‹ค๋ฉด ๊ฒฝ๊ณ ์กฐ์ฐจ ์ถœ๋ ฅํ•˜์ง€ ์•Š๋Š”๋‹ค.

(๊ทธ๋‚˜๋งˆ cleaner๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ์ž์‹ ์˜ ์Šค๋ ˆ๋“œ๋ฅผ ํ†ต์ œํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด๋Ÿฌํ•œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š”๋‹ค.)

์‹ฌ๊ฐํ•œ ์„ฑ๋Šฅ ๋ฌธ์ œ๋ฅผ ๋™๋ฐ˜ํ•˜๋Š” finalizer์™€ cleaner

์ž์›์„ ํ•ด์ œํ•˜๋Š” ๋ฐฉ๋ฒ•์—๋Š” finalizer์™€ cleaner ๋ง๊ณ ๋„ AutoCloseable ์ธํ„ฐํŽ˜์ด์Šค์˜ close ๋ฉ”์†Œ๋“œ๋ฅผ ํ™œ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ์žˆ๋‹ค. (item 9)

๊ฒฐ๋ก ์ ์œผ๋กœ ์ž์› ํ•ด์ œ ์†๋„ ์ˆœ์„œ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

AutoCloseable > finalizer = cleaner

์™œ๋ƒํ•˜๋ฉด finalizer์™€ cleaner๋Š” GC์˜ ํšจ์œจ์„ ๋–จ์–ด๋œจ๋ฆฌ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

์‹ฌ๊ฐํ•œ ๋ณด์•ˆ ๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚ค๋Š” finalizer์™€ cleaner

finalizer๊ฐ€ ๊ณต๊ฒฉ๋‹นํ•˜๋Š” ์›๋ฆฌ๋Š” ์ด๋ ‡๋‹ค.

A ํด๋ž˜์Šค์™€ ์ด๋ฅผ ์ƒ์†ํ•œ B ํด๋ž˜์Šค๊ฐ€ ์žˆ๋‹ค.

A ํด๋ž˜์Šค์—” finalize ๋ฉ”์†Œ๋“œ๋ฅผ ์žฌ์ •์˜ํ•ด๋†“์ง€ ์•Š์•„์„œ ์•ˆ์ „ํ•˜๋‹ค.

๊ทธ๋Ÿฐ๋ฐ B ํด๋ž˜์Šค๋Š” finalize ๋ฉ”์†Œ๋“œ๋ฅผ ์žฌ์ •์˜ํ•ด ๋†“์•˜๋‹ค.

๊ทธ๋ฆฌ๊ณ  B ํด๋ž˜์Šค์˜ ์ƒ์„ฑ์ž๊ฐ€ ์‹คํ–‰๋  ๋•Œ ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•˜์—ฌ finalize ๋ฉ”์†Œ๋“œ๊ฐ€ ์‹คํ–‰๋๋‹ค.

B ํด๋ž˜์Šค๊ฐ€ ์žฌ์ •์˜ํ•œ finalize ๋ฉ”์†Œ๋“œ์—์„œ๋Š” B ํด๋ž˜์Šค์˜ static ํ•„๋“œ๋Š” ๋ฌผ๋ก ์ด๊ณ 

A ํด๋ž˜์Šค์˜ static ํ•„๋“œ์—๊นŒ์ง€ ์ ‘๊ทผํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

๊ทธ๋ฆฌ๊ณค ์ด ํ•„๋“œ์— ์ž์‹ ์˜ ์ฐธ์กฐ๋ฅผ ํ• ๋‹นํ•ด๋ฒ„๋ฆฐ๋‹ค๋ฉด GC๊ฐ€ ํ•ด๋‹น ๊ฐ์ฒด๋ฅผ ์ˆ˜์ง‘ํ•˜์ง€ ๋ชปํ•œ๋‹ค.

์ด๋ ‡๊ฒŒ ์ผ๊ทธ๋Ÿฌ์ง„ ๊ฐ์ฒด๊ฐ€ ๋งŒ๋“ค์–ด์ง€๊ณ  ๋‚˜๋ฉด, ์ด ๊ฐ์ฒด์˜ ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•ด

์• ์ดˆ์—๋Š” ํ—ˆ์šฉ๋˜์ง€ ์•Š์•˜์„ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ด๋ฒ„๋ฆด ์ˆ˜๋„ ์žˆ๋‹ค.

๊ฐ์ฒด ์ƒ์„ฑ์„ ๋ง‰์œผ๋ ค๋ฉด ์ƒ์„ฑ์ž์—์„œ ์˜ˆ์™ธ๋ฅผ ๋˜์ง€๋Š” ๊ฒƒ๋งŒ์œผ๋กœ ์ถฉ๋ถ„ํ•˜์ง€๋งŒ finalizer๊ฐ€ ์žˆ๋‹ค๋ฉด ๊ทธ๋ ‡์ง€๋„ ์•Š๋‹ค.


์ด ๊ณต๊ฒฉ์— ๋Œ€ํ•œ ๋Œ€์•ˆ์ด 2๊ฐ€์ง€๊ฐ€ ์žˆ๋‹ค.

  1. class๋ฅผ final๋กœ ๋งŒ๋“ค๊ธฐ (์œ„ ์˜ˆ์—์„œ๋Š” A ํด๋ž˜์Šค)

  2. ์•„๋ฌด ์ผ๋„ ํ•˜์ง€ ์•Š๋Š” final finalize ๋ฉ”์„œ๋“œ ๋งŒ๋“ค๊ธฐ

finalizer์™€ cleaner์˜ ๋Œ€์•ˆ

ํŒŒ์ผ์ด๋‚˜ ์Šค๋ ˆ๋“œ ๋“ฑ ์ข…๋ฃŒํ•ด์•ผ ํ•  ์ž์›์„ ๋‹ด๊ณ  ์žˆ๋Š” ๊ฐ์ฒด์˜ ํด๋ž˜์Šค์—์„œ finalizer๋‚˜ cleaner๋ฅผ ๋Œ€์‹ ํ•ด์ค„ ๋ฌ˜์•ˆ์€ ๋ฌด์—‡์ผ๊นŒ?

๋ฐ”๋กœ AutoCloseable์„ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

๊ทธ๋ฆฌ๊ณ  close ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๊ฑฐ๋‚˜ ์ž๋™์œผ๋กœ ํ˜ธ์ถœ๋˜๋Š” try-with-resource ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด๋‹ค. (item 9) ์œ„์—์„œ ์ž ๊น ์–ธ๊ธ‰ํ•˜๊ธฐ๋„ ํ–ˆ๋‹ค.


AutoCloseable ์‚ฌ์šฉ ๊ฟ€ํŒ์ด ์žˆ๋‹ค. ๊ฐ ์ธ์Šคํ„ด์Šค๋Š” ์ž์‹ ์ด ๋‹ซํ˜”๋Š”์ง€๋ฅผ ์ถ”์ ํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

์•„๋ž˜๋Š” FileInputStream์˜ close ๋ฉ”์†Œ๋“œ์ด๋‹ค.

public void close() throws IOException {
    synchronized (closeLock) {
        if (closed) {
            return;
        }
        closed = true;
    }
    if (channel != null) {
       channel.close();
    }

    fd.closeAll(new Closeable() {
        public void close() throws IOException {
           close0();
       }
    });
}

์ž์„ธํžˆ ๋ณด๋ฉด closed๋ผ๋Š” bool ๋ณ€์ˆ˜๊ฐ€ ์žˆ๋‹ค.

์ด ๋ณ€์ˆ˜๋ฅผ ํ†ตํ•ด close ๋ฉ”์„œ๋“œ์—์„œ ์ด ๊ฐ์ฒด๋Š” ๋” ์ด์ƒ ์œ ํšจํ•˜์ง€ ์•Š์Œ์„ ๊ธฐ๋กํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

๊ทธ๋ž˜์„œ ํด๋ž˜์Šค ๋‚ด์˜ ๋‹ค๋ฅธ ๋ฉ”์„œ๋“œ๋Š” ์ด ํ•„๋“œ๋ฅผ ๊ฒ€์‚ฌํ•ด์„œ ๊ฐ์ฒด๊ฐ€ ๋‹ซํžŒ ํ›„์— ๋ถˆ๋ ธ๋‹ค๋ฉด

IllegalStateException์„ ๋˜์ง€๋ฉด ์˜ˆ์ธกํ•˜์ง€ ๋ชปํ•˜๋Š” ์˜ˆ์™ธ๋ฅผ ํ•˜๋‚˜๋ผ๋„ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค.

finalizer์™€ cleaner์˜ ์šฉ๋„

๊ทธ๋ ‡๋‹ค๋ฉด ์ด๊ฒƒ๋“ค์€ ๋„๋Œ€์ฒด ์–ด๋””์— ์“ฐ๋ฉด ์ข‹์€๊ฒƒ์ผ๊นŒ. ์ ์ ˆํ•œ ์“ฐ์ž„์ƒˆ๊ฐ€ ๋‘ ๊ฐ€์ง€ ์žˆ๋‹ค.

[์ž์›์˜ ์†Œ์œ ์ž๊ฐ€ close ๋ฉ”์„œ๋“œ๋ฅผ ๋ฏธ์ฒ˜ ํ˜ธ์ถœํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์— ๋Œ€๋น„ํ•œ ์•ˆ์ „๋ง]

finalizer๋‚˜ cleaner๊ฐ€ ์ฆ‰์‹œ(ํ˜น์€ ๋๊นŒ์ง€) ํ˜ธ์ถœ๋˜๋ฆฌ๋ผ๋Š” ๋ณด์žฅ์€ ์—†๋‹ค.

ํ•˜์ง€๋งŒ ๋ฐ˜๋“œ์‹œ close ๋ฉ”์†Œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋˜์–ด์•ผ ํ•˜๋Š” ์ƒํ™ฉ์—์„œ๋Š” 

finalizer๋‚˜ cleaner์— close ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ์„ ๋„ฃ์–ด์„œ ๊ทธ๋‚˜๋งˆ ์•ˆ์ „ ์žฅ์น˜๋ฅผ ํ•˜๋‚˜ ๋” ๋‘๋Š” ๊ฒƒ์ด ๋‚˜์„ ๊ฒƒ์ด๋‹ค.

FileInputStream, FileOutputStream, ThreadPoolExcecutor๊ฐ€ ๊ทธ ์˜ˆ์ด๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๋งจ ์œ„์˜ cleaner ์˜ˆ์ œ์—์„œ๋„ ์•ˆ์ „๋ง์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

(๋‹ค์‹œ ๊ฐ•์กฐํ•˜์ง€๋งŒ ์•ˆ์ „๋ง์„ ์„ค์น˜ํ–ˆ์–ด๋„ ์ด ์•ˆ์ „๋ง ์กฐ์ฐจ ์‹คํ–‰์ด ์•ˆ๋  ์ˆ˜๋„ ์žˆ๋‹ค!)
[๋„ค์ดํ‹ฐ๋ธŒ ํ”ผ์–ด์™€ ์—ฐ๊ฒฐ๋œ ๊ฐ์ฒด์— ์‚ฌ์šฉ]

๋„ค์ดํ‹ฐ๋ธŒ ํ”ผ์–ด(native peer)๋ž€ ์ผ๋ฐ˜ ์ž๋ฐ” ๊ฐ์ฒด๊ฐ€ ๋„ค์ดํ‹ฐ๋ธŒ ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ๊ธฐ๋Šฅ์„ ์œ„์ž„ํ•œ ๋„ค์ดํ‹ฐ๋ธŒ ๊ฐ์ฒด๋ฅผ ๋งํ•œ๋‹ค. 

๋„ค์ดํ‹ฐ๋ธŒ ํ”ผ์–ด๋Š” ์ž๋ฐ” ๊ฐ์ฒด๊ฐ€ ์•„๋‹ˆ๋‹ˆ GC๋Š” ๊ทธ ์กด์žฌ๋ฅผ ๋ชจ๋ฅธ๋‹ค. 

๊ทธ ๊ฒฐ๊ณผ ์ž๋ฐ” ํ”ผ์–ด๋ฅผ ํšŒ์ˆ˜ํ•  ๋•Œ ๋„ค์ดํ‹ฐ๋ธŒ ๊ฐ์ฒด๊นŒ์ง€๋Š” ํšŒ์ˆ˜ํ•  ์ˆ˜ ์—†๋‹ค. 

finalizer๋‚˜ cleaner๊ฐ€ ๋“ฑ์žฅํ•˜๋ฉด ์ข‹์€ ์ƒํ™ฉ์ด๋‹ค.

๋‹จ, ์„ฑ๋Šฅ ์ €ํ•˜๋ฅผ ๊ฐ๋‹นํ•  ์ˆ˜ ์žˆ๊ณ  ๋„ค์ดํ‹ฐ๋ธŒ ํ”ผ์–ด๊ฐ€ ์‹ฌ๊ฐํ•œ ์ž์›์„ ๊ฐ€์ง€๊ณ  ์žˆ์ง€ ์•Š์„ ๋–„์—๋งŒ ํ•ด๋‹น๋œ๋‹ค. 

์„ฑ๋Šฅ ์ €ํ•˜๋ฅผ ๊ฐ๋‹นํ•  ์ˆ˜ ์—†๊ฑฐ๋‚˜ ๋„ค์ดํ‹ฐ๋ธŒ ํ”ผ์–ด๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” ์ž์›์„ ์ฆ‰์‹œ ํšŒ์ˆ˜ํ•ด์•ผ ํ•œ๋‹ค๋ฉด, ์•ž์„œ ์„ค๋ช…ํ•œ close ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์ž.

๊ฒฐ๋ก 

cleaner(java 8๊นŒ์ง€๋Š” finalizer)๋Š” ์•ˆ์ „๋ง ์—ญํ• ์ด๋‚˜ ์ค‘์š”ํ•˜์ง€ ์•Š์€ ๋„ค์ดํ‹ฐ๋ธŒ ์ž์› ํšŒ์ˆ˜์šฉ์œผ๋กœ๋งŒ ์‚ฌ์šฉํ•˜์ž

๋ฌผ๋ก  ์ด๋Ÿฐ ๊ฒฝ์šฐ๋ผ๋„ ๋ถˆํ™•์‹ค์„ฑ๊ณผ ์„ฑ๋Šฅ ์ €ํ•˜์— ์ฃผ์˜ํ•ด์•ผ ํ•œ๋‹ค.

โš ๏ธ **GitHub.com Fallback** โš ๏ธ