рдЖрдЬ рд╣рдо рдЕрдВрддрд┐рдо рд░реВрдк () рд╡рд┐рдзрд┐ рдФрд░ рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдирд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд╕рд╛рде рдереЛрдбрд╝рд╛ рдкреНрд░рдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдиреМрд╕рд┐рдЦрд┐рдП рдЬрд╛рд╡рд╛ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░реНрд╕ рдХреЗ рдкрд╛рд╕ рдХреБрдЫ рд╡рд┐рдЪрд╛рд░ рд╣реИрдВ рдЬреЛ рдЕрдВрддрд┐рдо рд░реВрдк рджреЗрддреЗ рд╣реИрдВ () рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм рдХрдЪрд░рд╛ рдХрд▓реЗрдХреНрдЯрд░ рдЖрдкрдХреА рд╡рд╕реНрддреБ рдХреЛ рдирд╖реНрдЯ рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдХреБрдЫ рдЪреАрдЬреЗрдВ рдЕрднреА рднреА рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рд╣реЛ рд╕рдХрддреА рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдЗрдП рд╕реНрд╡рдпрдВ рд╕реЗ рдкреВрдЫреЗрдВ: рдпрджрд┐ рдЕрдВрддрд┐рдо рд░реВрдк () рд╡рд┐рдзрд┐ рдмрд╣реБрдд рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдХрд╛рдо рдХрд░рддреА рд╣реИ рддреЛ рдЖрдкрдХреЗ рдЖрд╡реЗрджрди рдХрд╛ рдХреНрдпрд╛ рд╣реЛрдЧрд╛?
рдЕрдВрддрд┐рдо рд░реВрдк рдХреЗ рд▓рд┐рдП рдЖрдзрд┐рдХрд╛рд░рд┐рдХ
рджрд╕реНрддрд╛рд╡реЗрдЬ () рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд╣рддрд╛ рд╣реИ:
рдХрдЪрд░рд╛ рд╕рдВрдЧреНрд░рд╣рдХрд░реНрддрд╛ рджреНрд╡рд╛рд░рд╛ рдХрд┐рд╕реА рд╡рд╕реНрддреБ рдкрд░ рддрдм рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм рдХрдЪрд░рд╛ рд╕рдВрдЧреНрд░рд╣ рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рд╡рд╕реНрддреБ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рд╕рдВрджрд░реНрдн рдирд╣реАрдВ рд╣реИрдВред
рдЗрд╕рд╕реЗ, рд╣рдо рдорд╛рди рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ "рдЬрдореЗ рд╣реБрдП" рдЕрдВрддрд┐рдо рд░реВрдк () рдХрдЪрд░рд╛ рд╕рдВрдЧреНрд░рд╣рдХрд░реНрддрд╛ рдзрд╛рдЧреЗ рдХреЛ рдирд┐рд▓рдВрдмрд┐рдд рдХрд░ рджреЗрдЧрд╛ рдФрд░ рдирд┐рд░реНрдорд╛рдг рдмрдВрдж рд╣реЛ рдЬрд╛рдПрдЧрд╛ред рджрд░рдЕрд╕рд▓ (рдХрдо рд╕реЗ рдХрдо рд╣реЙрдЯрд╕реНрдкреЙрдЯ 1.6 рдореЗрдВ) рдХрдЪрд░рд╛ рд╕рдВрдЧреНрд░рд╣рдХрд░реНрддрд╛ рд╕реАрдзреЗ рдЕрдВрддрд┐рдо рд░реВрдк () рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдХреЙрд▓ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рд╕реНрдерд┐рд░ рд╡рд┐рдзрд┐ java.lang.ref.Finalizer.register (рдСрдмреНрдЬреЗрдХреНрдЯ) рдХреЛ рдХреЙрд▓ рдХрд░рдХреЗ рд╕рдВрдмрдВрдзрд┐рдд рд╕реВрдЪреА рдореЗрдВ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдЬреЛрдбрд╝рддрд╛ рд╣реИред рдлрд╝рд╛рдЗрдирд▓реАрдЬрд╝рд░ рдХреНрд▓рд╛рд╕ рдХрд╛ рдСрдмреНрдЬреЗрдХреНрдЯ рдЙрд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рд╕рдВрджрд░реНрдн рд╣реИ рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдЕрдВрддрд┐рдо рд░реВрдк рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП (), рдФрд░ рдЕрдЧрд▓реЗ рдФрд░ рдкрд┐рдЫрд▓реЗ рдлрд╝рд╛рдЗрдирд▓реАрдЬрд╝рд░ рдХреЗ рд▓рд┐рдВрдХ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдПрдХ рджреЛрдЧреБрдиреА рд▓рд┐рдВрдХ рдХреА рдЧрдИ рд╕реВрдЪреА рдмрдирд╛рддрд╛ рд╣реИред
рдЕрдВрддрд┐рдо рд░реВрдк () рдХреЙрд▓ рдХреЛ рдПрдХ рдЕрд▓рдЧ рд╕реНрдЯреНрд░реАрдо "рдлрд╛рдЗрдирд▓" (java.lang.ref.Finalizer.FinalizerThread) рдореЗрдВ рд╕реАрдзреЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рддрдм рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрди рд╢реБрд░реВ рд╣реЛрддреА рд╣реИ (рдлрд╛рдЗрдирд▓ рдХреНрд▓рд╛рд╕ рдХреЛ рд▓реЛрдб рдХрд░рддреЗ рд╕рдордп рд╕реНрдЯреИрдЯрд┐рдХ рд╕реЗрдХреНрд╢рди рдореЗрдВ рдЕрдзрд┐рдХ рд╕рдЯреАрдХ рд░реВрдк рд╕реЗ)ред рдЕрдВрддрд┐рдо рд░реВрдк () рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдХреНрд░рдорд┐рдХ рд░реВрдк рд╕реЗ рдЙрд╕ рдХреНрд░рдо рдореЗрдВ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рд╡реЗ рдХрдЪрд░рд╛ рд╕рдВрдЧреНрд░рд╣рдХрд░реНрддрд╛ рджреНрд╡рд╛рд░рд╛ рд╕реВрдЪреА рдореЗрдВ рдЬреЛрдбрд╝реЗ рдЧрдП рдереЗред рддрджрдиреБрд╕рд╛рд░, рдпрджрд┐ рдХреБрдЫ рдЕрдВрддрд┐рдо рд░реВрдк () рд╣реИрдВрдЧ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдлрд╝рд╛рдЗрдирд▓реАрдЬрд╝рд░ рдереНрд░реЗрдб рд▓рдЯрдХрд╛рдПрдЧрд╛, рд▓реЗрдХрд┐рди рдХрдЪрд░рд╛ рд╕рдВрдЧреНрд░рд╣рдХрд░реНрддрд╛ рдирд╣реАрдВред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐ рдЬрд┐рди рд╡рд╕реНрддреБрдУрдВ рдореЗрдВ рдЕрдВрддрд┐рдо рд░реВрдк () рд╡рд┐рдзрд┐ рдареАрдХ рдирд╣реАрдВ рд╣реИ, рдЙрдиреНрд╣реЗрдВ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рд▓реЗрдХрд┐рди рд╡реЗ рдЬреЛ рдХрддрд╛рд░ рдореЗрдВ рдЬреЛрдбрд╝реЗ рдЬрд╛рддреЗ рд╣реИрдВ рдЬрдм рддрдХ рдХрд┐ рдлрд╝рд╛рдЗрдирд▓реАрдЬрд╝рд░ рдереНрд░реЗрдб рд▓рдЯрдХрд╛ рдирд╣реАрдВ рдЬрд╛рддрд╛, рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рдпрд╛ рд╕реНрдореГрддрд┐ рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рддреА рд╣реИред
рд╣рдо рдЗрд╕рдХрд╛ рдЙрджрд╛рд╣рд░рдг рджреЗрддреЗ рд╣реИрдВред рдЖрдЗрдП рдПрдХ рдРрд╕рд╛ рд╡рд░реНрдЧ рдмрдирд╛рдПрдВ рдЬрд┐рд╕рдХреА рд╡рд╕реНрддреБрдПрдБ рдвреЗрд░ рдкрд░ рд╢рд╛рд▓реАрдирддрд╛ рд╕реЗ рдЦрд╛рддреА рд╣реИрдВ:
static class BigObject { char[] tmp = new char[10000]; }
рдФрд░ рдЗрд╕ рдореБрдЦреНрдп рд╡рд┐рдзрд┐ рдХреА рддрд░рд╣ рдХреБрдЫ рд▓рд┐рдЦреЗрдВ:
public static void main(String... args) { int i=0; while(true) { new BigObject(); try { Thread.sleep(10); } catch( InterruptedException e ) {} if(i++%100==0) System.out.println("Total: "+Runtime.getRuntime().totalMemory()+ "; free: "+Runtime.getRuntime().freeMemory()); } }
рд╣рдо рдкреНрд░рддреНрдпреЗрдХ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдкрд░ рдПрдХ рд╡рд╕реНрддреБ рдмрдирд╛рддреЗ рд╣реИрдВ, рдФрд░ рдПрдХ рдмрд╛рд░ рдПрдХ рд╕реМ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ рдореЗрдВ рд╣рдо рд╢реЗрд╖ рдореЗрдореЛрд░реА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддреЗ рд╣реИрдВред рд╣рдо рдЬрд╛рд╡рд╛ рдорд╢реАрди рдХреА рдореЗрдореЛрд░реА рдХреЛ рд╕реАрдорд┐рдд рдХрд░реЗрдВрдЧреЗ рддрд╛рдХрд┐ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдореЗрдВ рджреЗрд░реА рди рд╣реЛ рдФрд░ рдкрд░рд┐рдгрд╛рдо рджреЗрдЦреЗрдВ:
$ java -Xms16m -Xmx16m Test
Total: 16252928; free: 15965064
Total: 16252928; free: 14013136
Total: 16252928; free: 12011536
Total: 16252928; free: 14309664
Total: 16252928; free: 12308064
Total: 16252928; free: 14797440
Total: 16252928; free: 12795840
Total: 16252928; free: 15307784
...
рдореЗрдореЛрд░реА рдХреЛ рдареАрдХ рд╕реЗ рдЖрд╡рдВрдЯрд┐рдд рдФрд░ рдореБрдХреНрдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
рдЕрдм рдПрдХ рдРрд╕рд╛ рд╡рд░реНрдЧ рдмрдирд╛рдПрдВ рдЬрд┐рд╕рдХреА рд╡рд╕реНрддреБрдПрдБ рдмрд╣реБрдд рд╕рдордп рд╕реЗ рдЕрдВрддрд┐рдо рд░реВрдк рджреЗ рд░рд╣реА рд╣реИрдВ ():
static class LongFinalize { protected void finalize() throws Throwable { System.out.println("LongFinalize finalizer"); Thread.sleep(10000000); } }
рд▓реВрдк рд╕реЗ рдкрд╣рд▓реЗ рдирдП LongFinalize () рдХреЛ рдореБрдЦреНрдп () рдореЗрдВ рдЬреЛрдбрд╝реЗрдВред рдкрд░рд┐рдгрд╛рдо рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реЛрдЧрд╛:
$ java -Xms16m -Xmx16m Test
Total: 16252928; free: 15965064
Total: 16252928; free: 14003496
Total: 16252928; free: 12001896
LongFinalize finalizer
Total: 16252928; free: 14290408
Total: 16252928; free: 12288808
Total: 16252928; free: 14777432
Total: 16252928; free: 12775832
Total: 16252928; free: 15286960
Total: 16252928; free: 13280880
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, LongFinalize.finalize () рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд╡рдЬреВрдж, рдХрдЪрд░рд╛ рд╕рдВрдЧреНрд░рд╣рдХрд░реНрддрд╛ рдХрд╛рдо рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦрддрд╛ рд╣реИред рдЕрдм рд╣рдо BigObject рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рдЕрдкрдирд╛ рдлрд╛рдЗрдирд▓ () рд╡рд┐рдзрд┐ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рдЬреЛ рдХреБрдЫ рдорд╣рддреНрд╡рд╣реАрди рд╣реИ:
static class BigObject { char[] tmp = new char[10000]; protected void finalize() throws Throwable { tmp[0] = 1; } }
рдЗрд╕ рдмрд╛рд░ рддрд╕реНрд╡реАрд░ рдЕрд▓рдЧ рд╣реИ:
$ java -Xms16m -Xmx16m Test
Total: 16252928; free: 15965064
Total: 16252928; free: 14003496
Total: 16252928; free: 12001896
LongFinalize finalizer
Total: 16252928; free: 9996648
Total: 16252928; free: 7987144
Total: 16252928; free: 6459728
Total: 16252928; free: 4458128
Total: 16252928; free: 6357016
Total: 16252928; free: 4347352
Total: 16252928; free: 2331112
Total: 16252928; free: 329512
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at Test$BigObject.<init>(Test.java:12)
at Test.main(Test.java:31)
рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдПрдХ рдмрд╛рд░ рдореЗрдореЛрд░реА рдЕрднреА рднреА рдмрдбрд╝реА рд╣реЛ рдЧрдИ рдереА: рдЙрди BigObject рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЛ рдирд╖реНрдЯ рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдЕрдВрддрд┐рдо рд░реВрдк () LongFinalize.finalizer () рд╕реЗ рдкрд╣рд▓реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдореЗрдВ рдХрд╛рдордпрд╛рдм рд░рд╣реЗред
рдореИрдВрдиреЗ рдКрдкрд░ рд▓рд┐рдЦрд╛ рд╣реИ рдХрд┐ рдХреЗрд╡рд▓ рдЙрди рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдЕрдВрддрд┐рдо рд░реВрдк рдирд╣реАрдВ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ () рдРрд╕реА рдкрд░рд┐рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рд╣рдЯрд╛ рджреА рдЬрд╛рддреА рд╣реИрдВред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрд╣ рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ рдХрд┐ рдЕрдВрддрд┐рдо () рд╡рд┐рдзрд┐ рдЦрд╛рд▓реА рд╣реИред рдпрджрд┐ рдЕрдВрддрд┐рдо () рдирд┐рдХрд╛рдп рдореЗрдВ рдХреЛрдб рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдХрдЪрд░рд╛ рд╕рдВрдЧреНрд░рд╛рд╣рдХ рдХреЗрд╡рд▓ рдЕрдВрддрд┐рдо рдкрдВрдХреНрддрд┐ рдореЗрдВ рдПрдХ рд╡рд╕реНрддреБ рдЬреЛрдбрд╝рддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рдо рдЦрд╛рд▓реА рдлрд╛рдЗрдирд▓ рдХреЗ рд╕рд╛рде рдПрдХ рдмрдЪреНрдЪрд╛ рд╡рд░реНрдЧ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ ():
static class SubBigObject extends BigObject { protected void finalize() throws Throwable { } }
рдФрд░ рдЪрд╛рдЗрд▓реНрдб рдХреНрд▓рд╛рд╕ рдХреА рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдореБрдЦреНрдп рдореЗрдВ рдмрдирд╛рдПрдБ () (рдирдП рд╕рдмрдСрдмреНрдЬреЗрдХреНрдЯ (рдирдП рд╕рдм-рдСрдмрдЬреЗрдХреНрдЯ рдХреЗ рд╕рд╛рде) рдХреА рдЬрдЧрд╣)ред рд╣рдо рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рдХрдЪрд░рд╛ рд╕рдВрдЧреНрд░рд╣рдг рдлрд┐рд░ рд╕реЗ рд╕рдлрд▓ рд╣реИред
рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдЖрдк рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд╡рд┐рдирд╛рд╢ рдореЗрдВ рддреЗрдЬреА рд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЕрдкрдиреЗ рдЖрдк рдХреЛ рдПрдХ рдЬрдореЗ рд╣реБрдП рдлрд╝рд╛рдЗрдирд▓реАрдЬрд╝рд░ рд╕реНрдЯреНрд░реАрдо рд╕реЗ рд╕реБрд░рдХреНрд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдпрджрд┐ рдЖрдк рдЦрд╛рд▓реА рдлрд╝рд╛рдЗрдирд▓реАрдЬрд╝ () рдХреЛ рдЙрдк-рд╡рд░реНрдЧ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдХреЗрд╡рд▓ рдмрд╛рд▓ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рддреЗ рд╣реИрдВред рдмреЗрд╢рдХ, рдЖрдкрдХреЛ рдкрддрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдЖрдк рдХреНрдпрд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВ: рдпрджрд┐ рдЕрдВрддрд┐рдо рд░реВрдк () рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рдерд╛, рддреЛ рдЖрдкрдХреЛ рд╢рд╛рдпрдж рдХреБрдЫ рдХреЗ рд▓рд┐рдП рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереАред рдФрд░ рдлрд┐рд░ рднреА рдЕрдВрддрд┐рдо рд░реВрдк рд╕реЗ рди рд▓рд┐рдЦреЗрдВ () рдЬрдм рддрдХ рдХрд┐ рдмрд┐рд▓реНрдХреБрд▓ рдЖрд╡рд╢реНрдпрдХ рди рд╣реЛред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрд╣ рдкреНрд░рддреАрдд рд╣реЛрдЧрд╛ рдХрд┐ рдЕрдореВрд░реНрдд рд╡рд░реНрдЧ рдореЗрдВ рдЗрдирдкреБрдЯрд╕реНрдЯреНрд░реАрдо рдЬреЛрдбрд╝рд╛ рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП рдЕрдВрддрд┐рдо (), рдХреЙрд▓рд┐рдВрдЧ () рдХреЛ рдЕрдВрддрд┐рдо рд░реВрдк рджреЗ рд╕рдХрддрд╛ рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЕрдВрддрд┐рдо рд░реВрдк () рдХреЗрд╡рд▓ рдЙрди рдмрд╛рд▓ рд╡рд░реНрдЧреЛрдВ рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдЬреЛ рд╕рд┐рд╕реНрдЯрдо рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЗ рд╕рд╛рде рд╕реАрдзреЗ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, FileInputStream)ред рдФрд░, рдХрд╣рддреЗ рд╣реИрдВ, рдмрдлрд╝рд░рдб рдЗрдирдкреБрдЯрд╕реНрдЯреНрд░реАрдорд╕реНрдЯреНрд░реАрдо рдХреЛ рдЕрдВрддрд┐рдо рд░реВрдк () рдХреА рдЬрд░реВрд░рдд рдирд╣реАрдВ рд╣реИ, рднрд▓реЗ рд╣реА рдпрд╣ рдлрд╛рдЗрд▓рдЗрдиреНрдкреБрдЯрд╕реНрдЯреНрд░реАрдо рдХреЛ рд▓рдкреЗрдЯрддрд╛ рд╣реЛред рдпрд╣рд╛рдВ, рдЕрддреНрдпрдзрд┐рдХ рдмрд╣реБрдореБрдЦреА рдкреНрд░рддрд┐рднрд╛ рд╣рд╛рдирд┐рдХрд╛рд░рдХ рд╣реИред рдпрджрд┐ рдХрд┐рд╕реА рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рд▓реЗрдЦрдХ рдиреЗ рдПрдХ рд╕рд╛рд░рдЧрд░реНрднрд┐рдд рдХрдХреНрд╖рд╛ рдореЗрдВ рдЕрдирд╛рд╡рд╢реНрдпрдХ рд░реВрдк рд╕реЗ рдЕрдВрддрд┐рдо рд░реВрдк рджрд┐рдпрд╛ (), рдФрд░ рдЖрдк рд╕рд┐рд╕реНрдЯрдо рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЗрд╕реЗ рдЕрдкрдиреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рдПрдХ рдЦрд╛рд▓реА рдирд┐рдХрд╛рдп рдХреЗ рд╕рд╛рде рдлрд┐рд░ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рднрд▓реЗ рд╣реА рдлрд╝рд╛рдЗрдирд▓рдЬрд╝рд░ рдлреНрд░реАрдЬ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рдпрд╣ рдмрд╕ рдореБрдХреНрдд рдХрд┐рдП рдЧрдП рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЗ рдкреНрд░рд╡рд╛рд╣ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдЙрдирдХреЗ рдирд┐рд╖реНрдХрд╛рд╕рди рдФрд░ рдвреЗрд░ рдХреЗ рд╡рд┐рдХрд╛рд╕ рдореЗрдВ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдордВрджреА рдЖрдПрдЧреАред
рдЗрд╕реЗ System.runFinalization () рдЬреИрд╕реА рдХрд┐рд╕реА рдЪреАрдЬ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рднреА рдХрд╣рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрд╣ рдХреЙрд▓ рдПрдХ рджреВрд╕рд░рд╛ рдереНрд░реЗрдб рдмрдирд╛рддрд╛ рд╣реИ, "SecondaryFinalizer", рдЬреЛ рдПрдХ рд╣реА рдХрддрд╛рд░ рд╕реЗ рд╡рд╕реНрддреБрдУрдВ рдкрд░ рдЕрдВрддрд┐рдо рд░реВрдк () рднреА рдХрд╣рддрд╛ рд╣реИред рдЙрд╕реА рд╕рдордп, рдереНрд░реЗрдбред рдЬрд┐рд╕реЗ System.runFinalization () рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рд╡рд╣ рдлрд╝рд╛рдЗрдирд▓рд╛рдЗрдЬрд╝рд░ рдХрддрд╛рд░ рддрдХ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╣реИ, рд╕рдорд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИред рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рдпрд╣ рдЖрдкрдХреЛ OutOfMemory рд╕реЗ рдмрдЪрд╛ рд╕рдХрддрд╛ рд╣реИ рдпрджрд┐ рдореБрдЦреНрдп рдлрд╝рд╛рдЗрдирд▓реАрдЬрд╝рд░ рдлрд╝реНрд░реАрдЬрд╝ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рд╣рдо SubBigObject рдХреЗ рдмрд┐рдирд╛ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рд╕рдВрд╕реНрдХрд░рдг рдкрд░ рд▓реМрдЯрддреЗ рд╣реИрдВ рдФрд░ рдпрджрд┐ рдкрд░реНрдпрд╛рдкреНрдд рдореЗрдореЛрд░реА рд╢реЗрд╖ рдирд╣реАрдВ рд╣реИ, рддреЛ рдЗрд╕ рдХреЙрд▓ рдХреЛ рдЬреЛрдбрд╝реЗрдВред рддрд╛рдХрд┐ рдЖрдк рднреНрд░рдорд┐рдд рди рд╣реЛрдВ, рдореИрдВ рдкреВрд░рд╛ рдкрд╛рда рджреВрдВрдЧрд╛:
public final class Test { static class LongFinalize { protected void finalize() throws Throwable { System.out.println("LongFinalize finalizer"); Thread.sleep(10000000); } } static class BigObject { char[] tmp = new char[10000]; protected void finalize() throws Throwable { tmp[0] = 1; } } public static void main(String... args) { int i=0; new LongFinalize(); while(true) { new BigObject(); try { Thread.sleep(10); } catch( InterruptedException e ) {} if(i++%100==0) System.out.println("Total: "+Runtime.getRuntime().totalMemory()+ "; free: "+Runtime.getRuntime().freeMemory()); if(Runtime.getRuntime().freeMemory()<1e6) System.runFinalization(); } } }
рдЖрдЗрдП рдХрд╛рдо рдХрд╛ рдкрд░рд┐рдгрд╛рдо рджреЗрдЦреЗрдВ:
$ java -Xms16m -Xmx16m Test
Total: 16252928; free: 15965064
Total: 16252928; free: 14003496
Total: 16252928; free: 12001896
LongFinalize finalizer
Total: 16252928; free: 9996648
Total: 16252928; free: 7987144
Total: 16252928; free: 6459832
Total: 16252928; free: 4458232
Total: 16252928; free: 6357120
Total: 16252928; free: 4347456
Total: 16252928; free: 2331216
Total: 16252928; free: 239072
Total: 16252928; free: 11729800
Total: 16252928; free: 9717584
Total: 16252928; free: 7719416
Total: 16252928; free: 5710768
Total: 16252928; free: 3721880
Total: 16252928; free: 1710824
Total: 16252928; free: 11261488
рдЗрд╕ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЛ рдЬреАрдирд╛ рдЬрд╛рд░реА рд╣реИ, рдЗрд╕ рддрдереНрдп рдХреЗ рдмрд╛рд╡рдЬреВрдж рдХрд┐ рдореБрдЦреНрдп рдлрд╛рдЗрдирд▓рд┐рдЬрд╝рд░ () рд▓рдЯрдХрд╛ рд╣реБрдЖ рд╣реИред рдмреЗрд╢рдХ, рдпрд╣ рдЖрдкрдХреЛ рдирд╣реАрдВ рдмрдЪрд╛рдПрдЧрд╛ рдпрджрд┐ рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдЕрдВрддрд┐рдо рд░реВрдк () рдХреЗ рд╕рд╛рде рдХрддрд╛рд░ рдореЗрдВ рдмрд╣реБрдд рд╕рд╛рд░реА рд╡рд╕реНрддреБрдПрдВ рд╣реИрдВ, рдФрд░ рдЖрдорддреМрд░ рдкрд░ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдореЗрдВ System.runFinalization () рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реНрдкрд╖реНрдЯ рдХреЙрд▓ рдпрд╣ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ рдХрд┐ рдХреБрдЫ рдЧрд▓рдд рд╣реИред