ITEM 8: Avoid finalizer and cleaner
์๋ฐ๋ finalizer
, cleaner
๋ ๊ฐ์ง ๊ฐ์ฒด ์๋ฉธ์๋ฅผ ์ ๊ณตํ๋ค. finalizer
์ cleaner
๋ GC๊ฐ ๋ ์ด์ ์ฌ์ฉํ์ง ์๋ ์์์ ๋ํ ์ ๋ฆฌ์์
์ ์งํํ๊ธฐ ์ํด ์ฌ์ฉ๋๋ค.
finalizer
์์ธก์ด ๋ถ๊ฐ๋ฅํ๋ฉฐ, ์ํฉ์ ๋ฐ๋ผ ์ํํ ์ ์์ด ์ผ๋ฐ์ ์ผ๋ก ๋ถํ์
์ค๋์, ๋ฎ์ ์ฑ๋ฅ, ์ด์์ฑ ๋ฌธ์ ์ ์์ธ
finalizer
๋๋ฆ์ ์ฐ์์๊ฐ ์์ง๋ง ๊ธฐ๋ณธ์ ์ผ๋ก ์ฌ์ฉ์ ์ง์ํด์ผํ๋ค. (Java 9์์ deprecated)
cleaner
cleaner
๋ finalizer
์ ๋์์ผ๋ก ์๊ฐ๋์๋ค. cleaner
๋ finalizer
๋ณด๋ค๋ ๋ ์ํํ์ง๋ง ์ฌ์ ํ ์๋ ๋จ์ ์ ๊ฐ์ง๊ณ ์๋ค.
์์ธก ๋ถ๊ฐ๋ฅ
๋๋ฆผ
์ผ๋ฐ์ ์ผ๋ก ๋ถํ์
์ฌ์ฉ์ ์ง์ํด์ผํ๋ ์ด์
1. finalizer
์ cleaner
๋ก๋ ์ ๋ ์คํ๋์ด์ผ ํ๋ ์์
์ ์ ๋ ์ ์ ์๋ค.
finalizer
์ cleaner
๋ก๋ ์ ๋ ์คํ๋์ด์ผ ํ๋ ์์
์ ์ ๋ ์ ์ ์๋ค.finalizer
์ cleaner
๋ ์ฆ์ ์ํ๋๋ค๋ ๋ณด์ฅ์ด ์์ผ๋ฉฐ, ๊ฐ์ฒด์ ์ ๊ทผํ ์ ์๊ฒ ๋ ํ finalizer
์ cleaner
๊ฐ ์คํ๋ ๋๊น์ง ์ด๋์ ๋ ๊ฑธ๋ฆฌ๋์ง ์ ์ ์๋ค. ์๋ฅผ ๋ค์ด, ํ์ผ ๋ซ๊ธฐ๋ฅผ finalizer
/ cleaner
์ ๋งก๊ธฐ๊ฒ ๋๋ค๋ฉด ์์คํ
์ด ๋์์ ์ด ์ ์๋ ํ์ผ ๊ฐ์์ ํ๊ณ๊ฐ ์๊ธฐ์ ์ค๋ฅ๊ฐ ๋ฐ์ํ ์ ์๋ค. ํด๋์ค์ finalizer
๋ฅผ ๋ฌ์๋๋ฉด ์ธ์คํด์ค์ ์์ ํ์๊ฐ ์ ๋ฉ๋๋ก ์ง์ฐ๋ ์ ์๋ค. ์ค์ ๋ก ์์ธ์ ์ ์ ์๋ OutOfMemoryError๊ฐ ๋ฐ์ํด ๋ถ์ํด๋ณด์์ ๋, ์ ํ๋ฆฌ์ผ์ด์
์ด ์ฃฝ๋ ์์ ์ ๊ฐ์ฒด ์์ฒ๊ฐ์ finalizer
์ค๋ ๋๋ ๋ค๋ฅธ ์ ํ๋ฆฌ์ผ์ด์
์ค๋ ๋ ๋ณด๋ค ์ฐ์ ์์๊ฐ ๋ฎ์ ๋๊ธฐ์ด์์ ํ์๋๊ธฐ๋ง์ ๊ธฐ๋ค๋ฆฌ๊ณ ์์๋ค. cleaner
๋ ์์ ์ด ์ํํ ์ค๋ ๋๋ฅผ ์ ์ดํ ์ ์๋ค๋ ์ ์์ ๋ซ์ง๋ง, ์ฌ์ ํ ๋ฐฑ๊ทธ๋ผ์ด๋์์ ์ํ๋๋ฉฐ ๊ฐ๋น์ง ์ปฌ๋ ํฐ์ ํต์ ํ์ ์์ด ์ฆ๊ฐ ์ํ๋๋ค๋ ๋ณด์ฅ์ด ์๋ค. ๋ํ, ์๋ฐ๋ finalizer
์ cleaner
์ ์ํ ์์ ๋ฟ๋ง ์๋๋ผ ์ํ ์ฌ๋ถ ์กฐ์ฐจ ๋ณด์ฅํ์ง ์๋๋ค. ์ด๊ฒ์ ์ ๊ทผํ ์ ์๋ ์ผ๋ถ ๊ฐ์ฒด์ ์ข
๋ฃ ์์
์ ์ ํ ์ํํ์ง ๋ชปํ ์ฑ ํ๋ก๊ทธ๋จ์ด ์ค๋จ ๋ ์๋ ์๋ค๋ ๊ฒ์ด๋ค.
์ฆ, ์ํ๋ฅผ ์๊ตฌ์ ์ผ๋ก ์์ ํ๋ ์์
์์ ์ ๋ finalizer
์ cleaner
์ ์์กดํ๋ฉด ์๋๋ค.
System.gc
, System.runFinalization
์ finalizer
์ cleaner
๊ฐ ์คํ๋ ๊ฐ๋ฅ์ฑ์ ๋์ฌ์ค ์ ์์ผ๋, ๋ณด์ฅํด์ฃผ์ง ์์ผ๋ฉฐ, System.runFinalizersOnExit
๊ณผ Runtime.runFinalizersOnExit
์ ์คํ์ ๋ณด์ฅํด์ค๋ค๊ณ ๋์ด์์ง๋ง ThreadStop ์ ์ฌ๊ฐํ ๊ฒฐํจ ๋ฌธ์ ๊ฐ ์๋ค.
๋ํ, finalizer
๋ ๋์ ์ค ๋ฐ์ํ ์์ธ๋ ๋ฌด์๋๋ฉฐ, ์ฒ๋ฆฌํ ์์
์ด ๋จ์ ์๋๋ผ๋ ๊ทธ ์๊ฐ ์ข
๋ฃ๋๋ค. ์ก์ง ๋ชปํ ์์ธ ๋๋ฌธ์ ํด๋น ๊ฐ์ฒด๋ ๋ง๋ฌด๋ฆฌ๊ฐ ๋ ๋ ์ํ๋ก ๋จ์ ์์ ์ ์์ผ๋ฉฐ, ๋ค๋ฅธ ์ค๋ ๋๊ฐ ํผ์๋ ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ๋ ค ํ๋ค๋ฉด, ์ด๋ป๊ฒ ๋์ํ ์ง ์์ธกํ ์ ์๋ค. (cleaner
๋ ์์ ์ ์ค๋ ๋๋ฅผ ํต์ ํ๋ฏ๋ก ์ด๋ฌํ ๋ฌธ์ ๋ฐ์์ํจ)
2. finalizer
์ cleaner
๋ ์ฌ๊ฐํ ์ฑ๋ฅ ๋ฌธ์ ๋ ๋๋ฐ๋ ์ ์๋ค.
finalizer
์ cleaner
๋ ์ฌ๊ฐํ ์ฑ๋ฅ ๋ฌธ์ ๋ ๋๋ฐ๋ ์ ์๋ค.AutoCloseable
๊ฐ์ฒด๋ฅผ ์์ฑํด GC๊ฐ ์๊ฑฐํ๊ธฐ ๊น์ง 12ns๊ฐ ๊ฑธ๋ฆฐ ๊ฒ์ด, finalizer
๋ฅผ ์ฌ์ฉํ๋ 550ns๊ฐ ๊ฑธ๋ ธ๋ค. finalizer
๊ฐ GC์ ํจ์จ์ ๋จ์ด๋จ๋ฆฌ๊ธฐ ๋๋ฌธ์ด๋ค.
cleaner
๋ ํด๋์ค์ ๋ชจ๋ ์ธ์คํด์ค๋ฅผ ์๊ฑฐํ๋ ํํ๋ก ์ฌ์ฉํ๋ฉด finalizer
์ ์ฑ๋ฅ์ ์ ์ฌํ๋ฉฐ, ์์ ๋ง ๋ฐฉ์์ ์ฌ์ฉํ๋ฉด ์ฝ 66ns๊ฐ ๊ฑธ๋ฆฌ๋, ์์ ๋ง์ ์ค์นํ๋ฉด ์ฑ๋ฅ์ด ์ฝ 5๋ฐฐ ์ ๋ ๋๋ ค์ง๋ค.
3. finalizer
๋ฅผ ์ฌ์ฉํ ํด๋์ค๋ finalizer
๊ณต๊ฒฉ์ ๋
ธ์ถ๋์ด ์ฌ๊ฐํ ๋ณด์ ๋ฌธ์ ๋ฅผ ์ผ์ผํฌ ์ ์๋ค.
finalizer
๋ฅผ ์ฌ์ฉํ ํด๋์ค๋ finalizer
๊ณต๊ฒฉ์ ๋
ธ์ถ๋์ด ์ฌ๊ฐํ ๋ณด์ ๋ฌธ์ ๋ฅผ ์ผ์ผํฌ ์ ์๋ค.์์ฑ์๋ ์ง๋ ฌํ ๊ณผ์ ์์ ์์ธ๊ฐ ๋ฐ์ํ๋ฉด, ์์ฑ๋๋ค ๋ง ๊ฐ์ฒด์์ ์
์์ ์ผ๋ก ํ์ ํด๋์ค์ finalizer
๊ฐ ์ํ๋ ์ ์๋ค. ์ด finalizer
๋ ์ ์ ํ๋์ ์์ ์ ์ฐธ์กฐ๋ฅผ ํ ๋นํด GC๊ฐ ์์งํ์ง ๋ชปํ๊ฒ ๋ง์ ์ ์๋ค.
๊ฐ์ฒด ์์ฑ์ ๋ง๊ธฐ์ํด ์์ฑ์์์ ์์ธ๋ฅผ ๋์ง ์ ์์ง๋ง, finalizer
๊ฐ ์๋ค๋ฉด ์ด๋ ๋ถ๊ฐ๋ฅํ๋ค.
final์ด ์๋ ํด๋์ค๋ฅผ finalizer
๊ณต๊ฒฉ์ผ๋ก ๋ฐฉ์ดํ๋ ค๋ฉด ์๋ฌด ๋ก์ง์ด ์๋ finalize
๋ฉ์๋๋ฅผ ๋ง๋ ํ final๋ก ์ ์ธํ๋ฉด ๋๋ค.
์ฌ์ฉํ๋ ๊ณณ
์์์ ์์ ์๊ฐ
close
๋ฉ์๋๋ฅผ ํธ์ถํ์ง ์๋ ๊ฒ์ ๋๋นํ ์์ ๋ง ์ญํ ๋ก ์ฌ์ฉ (์ธ์ ํ์ ๋ ์ง ๋ชจ๋ฅด์ง๋ง ๋ฆ๊ฒ๋ผ๋ ํด์ฃผ๋ ๊ฒ์ด ์ข์ ) -FileInputStream
,FileOutputStream
,ThreadPoolExecutor
์์ ์์ ๋ง ์ญํ ์finalizer
์ ๊ณต*Native Peer๋ ์๋ฐ ๊ฐ์ฒด๊ฐ ์๋๋ฏ๋ก GC๊ฐ ๊ทธ ์กด์ฌ๋ฅผ ์์ง ๋ชปํ๋ค. ์ฆ, ๋ค์ดํฐ๋ธ ํผ์ด์ ์ฐ๊ฒฐ๋ ๊ฐ์ฒด์์์ ์์ ํ์์ฉ์ผ๋ก ์ฌ์ฉํ๋ค. ๋จ, ์ฑ๋ฅ ์ ํ๋ฅผ ๊ฐ๋นํ ์ ์๊ณ ๋ค์ดํฐ๋ธ ํผ์ด๊ฐ ์ฌ๊ฐํ ์์์ ๊ฐ์ง๊ณ ์์ง ์์ ๋๋ง ํด๋นํ๋ค. ์ฑ๋ฅ์ ํ๋ฅผ ๊ฐ๋นํ ์ ์๊ฑฐ๋ ์์์ ์ฆ์ ํ์ํด์ผํ๋ค๋ฉด
close
๋ฉ์๋๋ฅผ ์ฌ์ฉํด์ผํ๋ค.
cleaner
๋ ์์ ๋ง ์ญํ ์ด๋ ์ค์ํ์ง ์์ ๋ค์ดํฐ๋ธ ์์ ํ์ ์ฉ์ผ๋ก๋ง ์ฌ์ฉํ๋ฉฐ, ์ด ๊ฒฝ์ฐ์๋ ๋ถํ์ค์ฑ๊ณผ ์ฑ๋ฅ์ ํ์ ์ ์ํด์ผํ๋ค.
\ Native Peer : ์ผ๋ฐ ์๋ฐ ๊ฐ์ฒด๊ฐ ๋ค์ดํฐ๋ธ ๋ฉ์๋๋ฅผ ํตํด ๊ธฐ๋ฅ์ ์์ํ ๋ค์ดํฐ๋ธ ๊ฐ์ฒด*
๋์
ํ์ผ์ด๋ ์ค๋ ๋ ๋ฑ ์ข
๋ฃํด์ผ ํ ์์์ ๋ด๊ณ ์๋ ๊ฐ์ฒด์ ํด๋์ค์์ finalizer
์ cleaner
๋ฅผ ๋์ ํด์ฃผ๋ ค๋ฉด AutoCloseable
์ ๊ตฌํํด์ฃผ๊ณ , close
๋ฉ์๋ค๋ฅด ํธ์ถํ๋ฉด๋๋ค.(try-with-resources(item 9))
๊ฐ ์ธ์คํด์ค๋ close
๋ฉ์๋์์ ๋ ์ด์ ์ ํจํ์ง ์์์ ๊ธฐ๋กํ๊ณ , ๋ค๋ฅธ ๋ฉ์๋๋ ํด๋น ํ๋๋ฅผ ๊ฒ์ฌํด ๊ฐ์ฒด๊ฐ ๋ซํ ํ์ ํธ์ถํ๋ค๋ฉด IllegalStateException
์ค๋ฅ๋ฅผ ๋ฐ์์ํค๋ ๊ฒ์ด๋ค.
์ฐธ๊ณ
Last updated