
рд╕рднреА рдЬрд╛рд╡рд╛ рдбреЗрд╡рд▓рдкрд░реНрд╕, рдЬрд▓реНрджреА рдпрд╛ рдмрд╛рдж рдореЗрдВ, рдХреБрдЦреНрдпрд╛рдд OutOfMemoryError рддреНрд░реБрдЯрд┐ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рддреЗ рд╣реИрдВред
рдЗрд╕ рдмреИрдардХ рдХреЗ рдмрд╛рдж, рд╣рдо рдЗрд╕реЗ рд╕рд╣реЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рдореЗрдореЛрд░реА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рд╕рд╛рд╡рдзрд╛рди рд░рд╣рдирд╛ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред рд╕рдВрд╕реНрдХрд░рдг 1.2 рдХреЗ рд╕рд╛рде рд╢реБрд░реВ, java.lang.refред * рдЬрд╛рд╡рд╛ рдореЗрдВ рдЫрдкреА рд╕реЙрдлреНрдЯрд░рдлреЗрдлрд░реЗрдВрд╕, рд╡реАрдХрд░рд░реЗрдВрд╕, рдлреИрдВрдЯрдо рд░реАрдлрд░реЗрдВрд╕ рдХрдХреНрд╖рд╛рдУрдВ рдХреЗ рд╕рд╛рде рдкреИрдХреЗрдЬред рдЗрд╕рдХреЗ рдмрд╛рдж, рдореИрдВ рдЖрдкрдХреЛ рдмрддрд╛рдКрдВрдЧрд╛ рдХрд┐ рдпреЗ рдХрдХреНрд╖рд╛рдПрдВ рдЖрдЙрдЯрдСрдлрдореЗрд░реАрдСрд░рд░ рдХреЗ рдЦрд┐рд▓рд╛рдл рд▓рдбрд╝рд╛рдИ рдореЗрдВ рдХреИрд╕реЗ рдорджрдж рдХрд░реЗрдВрдЧреАред рдФрд░ рдЕрдзрд┐рдХ рджрд┐рд▓рдЪрд╕реНрдк рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдореИрдВ рдЙрдирдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЙрджрд╛рд╣рд░рдг рджреВрдВрдЧрд╛ред рдЪрд▓рд┐рдП рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред
рд╕рд╛рдорд╛рдиреНрдп рд╡рд┐рд╡рд░рдг
рдкрд╣рд▓рд╛, рдереЛрдбрд╝рд╛ рд╕рд╛рдорд╛рдиреНрдп рд╕рд┐рджреНрдзрд╛рдВрддред рдпрд╛рдж рд░рдЦреЗрдВ, рд╕рд╛рдорд╛рдиреНрдп рд╢рдмреНрджреЛрдВ рдореЗрдВ, рдЧрд╛рд░рдмреЗрдЬ рдХрд▓реЗрдХреНрдЯрд░ (рдЗрд╕рдХреЗ рдмрд╛рдж рдЬреАрд╕реА) рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рд╡рд┐рд╡рд░рдг рдореЗрдВ рдЬрд╛рдиреЗ рдХреЗ рдмрд┐рдирд╛, рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рд╕рд░рд▓ рд╣реИ: рдЬрдм рдЖрдк рдХрд▓реЗрдХреНрдЯрд░ рдХреЛ рдЪрд▓рд╛рддреЗ рд╣реИрдВ, рддреЛ рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрди рдкреБрди: рдЦреЛрдЬрддрд╛ рд╣реИ, рд╕рднреА рдереНрд░реЗрдбреНрд╕ рдХреЗ рд▓рд┐рдП, рд╕рднреА рдЙрдкрд▓рдмреНрдз рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рд╕реНрдореГрддрд┐ рдореЗрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдХрд┐рд╕реА рддрд░рд╣ рд╕реЗ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░рддрд╛ рд╣реИред рдФрд░ рдЕрдЧрд▓реЗ рдЪрд░рдг рдореЗрдВ, рдЬреАрд╕реА рдореЗрдореЛрд░реА рд╕реЗ рд╕рднреА рдЧреИрд░-рд╕реВрдЪреАрдмрджреНрдз рд╡рд╕реНрддреБрдУрдВ рдХреЛ рд╣рдЯрд╛ рджреЗрддрд╛ рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╕рдлрд╛рдИ рдХреЗ рдмрд╛рдж, рдХреЗрд╡рд▓ рдЙрди рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдЬреЛ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рд╕реНрдореГрддрд┐ рдореЗрдВ рд╣реЛрдВрдЧреЗред рдЖрдЧреЗ рдмрдврд╝реЛред
рдЬрд╛рд╡рд╛ рдореЗрдВ рдХрдИ рддрд░рд╣ рдХреЗ рд▓рд┐рдВрдХ рд╣реИрдВред рд╕реНрдЯреНрд░рд╛рдВрдЧ рд░реЗрдлрд░реЗрдВрд╕ рд╣реИ - рдпреЗ рд╕рдмрд╕реЗ рд╕рд╛рдзрд╛рд░рдг рд▓рд┐рдВрдХ рд╣реИрдВ рдЬреЛ рд╣рдо рд╣рд░ рджрд┐рди рдмрдирд╛рддреЗ рд╣реИрдВред
StringBuilder builder = new StringBuilder();
рдмрд┐рд▓реНрдбрд░ рдпрд╣ StringBuilder рд╡рд╕реНрддреБ рдХрд╛ рдПрдХ рдордЬрдмреВрдд-рд╕рдВрджрд░реНрдн рд╣реИред
рдФрд░ рд▓рд┐рдВрдХ рдХреЗ 3 "рд╡рд┐рд╢реЗрд╖" рдкреНрд░рдХрд╛рд░ рд╣реИрдВ - рд╕реЙрдлреНрдЯрд░рдлрд░реЗрдВрд╕, рдХрдордЬреЛрд░рдкреНрд░рддрд┐рдмрдВрдз, рдлреИрдВрдЯрдо рд░реАрдлрд░реЗрдВрд╕ред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдВрдХ рдХреЗ рдмреАрдЪ рдХреЗрд╡рд▓ рдПрдХ рд╣реА рдЕрдВрддрд░ рд╣реИ - рдЬрд┐рди рд╡рд╕реНрддреБрдУрдВ рдХрд╛ рд╡реЗ рд╕рдВрджрд░реНрдн рджреЗрддреЗ рд╣реИрдВ, рдЙрдирдХреЗ рд╕рд╛рде рдЬреАрд╕реА рдХрд╛ рд╡реНрдпрд╡рд╣рд╛рд░ред рд╣рдо рдмрд╛рдж рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рдХрд╛рд░ рдХреА рд▓рд┐рдВрдХ рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдЪрд░реНрдЪрд╛ рдХрд░реЗрдВрдЧреЗ, рд▓реЗрдХрд┐рди рдЕрднреА рдХреЗ рд▓рд┐рдП, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЬреНрдЮрд╛рди рдкрд░реНрдпрд╛рдкреНрдд рд╣реЛрдЧрд╛:
- SoftReference - рдпрджрд┐ GC рдпрд╣ рджреЗрдЦрддрд╛ рд╣реИ рдХрд┐ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗрд╡рд▓ рд╕реЙрдлреНрдЯ рд▓рд┐рдВрдХ рдХреА рдПрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕реБрд▓рдн рд╣реИ, рддреЛ рдпрд╣ рдЗрд╕реЗ рдореЗрдореЛрд░реА рд╕реЗ рд╣рдЯрд╛ рджреЗрдЧрд╛ред рддрдмред рд╢рд╛рдпрджред
- WeakReference - рдпрджрд┐ GC рджреЗрдЦрддрд╛ рд╣реИ рдХрд┐ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗрд╡рд▓ рдХрдордЬреЛрд░ рд▓рд┐рдВрдХ рдХреА рдПрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕реБрд▓рдн рд╣реИ, рддреЛ рдпрд╣ рдЗрд╕реЗ рдореЗрдореЛрд░реА рд╕реЗ рд╣рдЯрд╛ рджреЗрдЧрд╛ред
- PhantomReference - рдпрджрд┐ GC рджреЗрдЦрддрд╛ рд╣реИ рдХрд┐ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗрд╡рд▓ рдлрд╝реИрдВрдЯрдо рд▓рд┐рдВрдХ рдХреА рдПрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕реБрд▓рдн рд╣реИ, рддреЛ рдпрд╣ рдЗрд╕реЗ рдореЗрдореЛрд░реА рд╕реЗ рд╣рдЯрд╛ рджреЗрдЧрд╛ред рдЬреАрд╕реА рдХреА рдХрдИ рд╢реБрд░реБрдЖрдд рдХреЗ рдмрд╛рджред
рдпрджрд┐ рдпрд╣ рдЕрднреА рддрдХ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЕрдВрддрд░ рдХреНрдпрд╛ рд╣реИ, рддреЛ рдЪрд┐рдВрддрд╛ рди рдХрд░реЗрдВ, рдЬрд▓реНрдж рд╣реА рд╕рдм рдХреБрдЫ рдареАрдХ рд╣реЛ рдЬрд╛рдПрдЧрд╛ред рдЫреЛрдЯреА рдЪреАрдЬреЗрдВ рд╡рд┐рд╡рд░рдг рдореЗрдВ рд╣реИрдВ, рдФрд░ рд╡рд┐рд╡рд░рдг рдЖрдЧреЗ рдЖрдПрдЧрд╛ред
рдпреЗ 3 рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдВрдХ рдПрдХ рдорд╛рддрд╛-рдкрд┐рддрд╛ рдХреЗ рд╕рдВрджрд░реНрдн рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓реЗ рд╣реИрдВ, рдЬрд╣рд╛рдВ рд╕реЗ рд╡реЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрдкрдиреЗ рд╕рднреА рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рддрд░реАрдХреЛрдВ рдФрд░ рдирд┐рд░реНрдорд╛рдгрдХрд░реНрддрд╛рдУрдВ рдХреЛ рд▓реЗрддреЗ рд╣реИрдВред
StringBuilder builder = new StringBuilder(); SoftReference<StringBuilder> softBuilder = new SoftReference(builder);
рдЗрди рджреЛ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ 1 рд╕реНрдЯреНрд░рд┐рдВрдЧрдмреБрд▓рд╕реНрдЯ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ 2 рдкреНрд░рдХрд╛рд░ рд╣реЛрдВрдЧреЗ:
- рдмрд┐рд▓реНрдбрд░ - рдордЬрдмреВрдд рд▓рд┐рдВрдХ
- softBuilder - рд╕реЙрдлреНрдЯ рд▓рд┐рдВрдХ (рдФрдкрдЪрд╛рд░рд┐рдХ рд░реВрдк рд╕реЗ рдпрд╣ рд╕реЙрдлреНрдЯ рд▓рд┐рдВрдХ рдХреА рдПрдХ рдордЬрдмреВрдд рдХрдбрд╝реА рд╣реИ, рд▓реЗрдХрд┐рди рд╕рд╛рджрдЧреА рдХреЗ рд▓рд┐рдП рдореИрдВ рдПрдХ рд╕реЙрдлреНрдЯ рд▓рд┐рдВрдХ рд▓рд┐рдЦреВрдВрдЧрд╛)
рдФрд░ рдЕрдЧрд░, рд░рди рдЯрд╛рдЗрдо рдкрд░, рдмрд┐рд▓реНрдбрд░ рд╡реЗрд░рд┐рдПрдмрд▓ рдЕрдиреБрдкрд▓рдмреНрдз рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╕реЙрдлреНрдЯрдмрд░реНрд╕реНрдЯ рджреНрд╡рд╛рд░рд╛ рд╕рдВрджрд░реНрднрд┐рдд рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рд▓рд┐рдВрдХ рдЕрднреА рднреА рдЙрдкрд▓рдмреНрдз рд╣реИ рдФрд░ рдЬреАрд╕реА -> рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рд╕реНрдЯреНрд░рд┐рдВрдЧрдмреНрдпреВрд▓рд░ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдХреЗрд╡рд▓ рд╕реЙрдлреНрдЯ рд▓рд┐рдВрдХ рдХреА рдПрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕реБрд▓рдн рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рдЙрдкрд▓рдмреНрдз рддрд░реАрдХреЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:
softBuilder.get () - GC рдЗрд╕ рдореЗрдореЛрд░реА рдХреЗ рд╕рд╛рде рдЗрд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдбрд┐рд▓реАрдЯ рдирд╣реАрдВ рдХрд░рдиреЗ рдХреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ StringBuilder рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП рдПрдХ рдордЬрдмреВрдд рд╕рдВрджрд░реНрдн рд▓реМрдЯрд╛рдПрдЧрд╛ред рдЕрдиреНрдпрдерд╛, рд╢реВрдиреНрдп рд╡рд╛рдкрд╕ рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
softBuilder.clear () - StringBuilder рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдВрдХ рдХреЛ рд╣рдЯрд╛ рджреЗрддрд╛ рд╣реИ (рдЕрд░реНрдерд╛рдд, рдЗрд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рдирд░рдо рд▓рд┐рдВрдХ рдирд╣реАрдВ рд╣реИрдВ)
рд╕рднреА WeakReference рдФрд░ PhantomReference рдХреЗ рд▓рд┐рдП рд╕рдорд╛рди рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИред рд╕рдЪ рд╣реИ, PhantomReference.get () рд╣рдореЗрд╢рд╛ рдЕрд╢рдХреНрдд рд▓реМрдЯреЗрдЧрд╛, рд▓реЗрдХрд┐рди рдмрд╛рдж рдореЗрдВ рдФрд░ рдЕрдзрд┐рдХред
рдЕрднреА рднреА рдРрд╕рд╛ рдПрдХ рд╡рд░реНрдЧ рд╣реИ - ReferenceQueueред рдпрд╣ рдЖрдкрдХреЛ рдЯреНрд░реИрдХ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдЬрдм рдЬреАрд╕реА рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреА рдЕрдм рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ рдФрд░ рдЗрд╕реЗ рд╣рдЯрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рд╡рд╣ рдЬрдЧрд╣ рд╣реИ рдЬрд╣рд╛рдБ рд╕рдВрджрд░реНрдн рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдЙрд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдмрд╛рдж рдорд┐рд▓рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рд╡рд╣ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рддрд╛ рд╣реИ рдореЗрдореЛрд░реА рд╕реЗ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдПрдХ рд╕рдВрджрд░реНрдн рдмрдирд╛рддреЗ рд╕рдордп, рд╣рдо ReferenceQueue рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдореЗрдВ рдкрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдореЗрдВ рд▓рд┐рдВрдХ рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреЗ рдмрд╛рдж рд░рдЦрд╛ рдЬрд╛рдПрдЧрд╛ред
рд╕реЙрдлреНрдЯрд░рдлреЗрд░ рд╡рд┐рд╡рд░рдг
рдЬреАрд╕реА рд╕реБрд╡рд┐рдзрд╛рдПрдБ
рддреЛ рдлрд┐рд░ рднреА, GC рдХреИрд╕реЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рддрд╛ рд╣реИ рдЬрдм рдпрд╣ рджреЗрдЦрддрд╛ рд╣реИ рдХрд┐ рдПрдХ рд╡рд╕реНрддреБ рдХреЗрд╡рд▓ рдирд░рдо рд▓рд┐рдВрдХ рдХреА рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕реБрд▓рдн рд╣реИ? рдЖрдЗрдП GC рдХреЛ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рджреЗрдЦреЗрдВ:
рдФрд░ рдЗрд╕рд▓рд┐рдП, рдЬреАрд╕реА рдиреЗ рдЕрдкрдирд╛ рдХрд╛рдо рд╢реБрд░реВ рдХрд┐рдпрд╛ рдФрд░ рдвреЗрд░ рдкрд░ рд╕рднреА рд╡рд╕реНрддреБрдУрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЪрд▓рд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрджрд┐ рдвреЗрд░ рдкрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рд╕рдВрджрд░реНрдн рд╣реИ, рддреЛ рдЬреАрд╕реА рдЗрд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдХрддрд╛рд░ рдореЗрдВ рд░рдЦрддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╕рднреА рд╕рдВрджрд░реНрдн рдСрдмреНрдЬреЗрдХреНрдЯ рд╕реНрдерд┐рдд рд╣реИрдВред рд╕рднреА рд╡рд╕реНрддреБрдУрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬрд╛рдиреЗ рдХреЗ рдмрд╛рдж, рдЬреАрд╕реА рд╕рдВрджрд░реНрдн рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдХрддрд╛рд░ рдореЗрдВ рд▓реЗ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЙрдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рд╕реНрдореГрддрд┐ рд╕реЗ рд╣рдЯрд╛рдиреЗ рдпрд╛ рди рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд░рддрд╛ рд╣реИред рдХрд┐рд╕реА рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рд╣рдЯрд╛рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ JVM рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рд╕рд╛рдорд╛рдиреНрдп рдЕрдиреБрдмрдВрдз рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ:
рдЬреАрд╕реА рдХреЛ рдЖрдЙрдЯрдСрдлрдореЗрдореЛрд░реА рдПрд░реНрд░ рдлреЗрдВрдХрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдХреЗрд╡рд▓ рдирд░рдо рд▓рд┐рдВрдХ рджреНрд╡рд╛рд░рд╛ рд╕реБрд▓рдн рд╕рднреА рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдвреЗрд░ рд╕реЗ рд╣рдЯрд╛рдиреЗ рдХреА рдЧрд╛рд░рдВрдЯреА рд╣реИ ред
SoftReference рдореЗрдореЛрд░реА рдореЗрдВ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЛ рдХреИрд╢рд┐рдВрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░рд╛ рддрдВрддреНрд░ рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдЬрдм рдЙрдкрд▓рдмреНрдз рдореЗрдореЛрд░реА рдмрд╛рд╣рд░ рдирд┐рдХрд▓рддреА рд╣реИ, рддреЛ GC рдореЗрдореЛрд░реА рд╕реЗ рдЕрдкреНрд░рдпреБрдХреНрдд рд╡рд╕реНрддреБрдУрдВ рдХреЛ рд╣рдЯрд╛ рджреЗрдЧрд╛ рдФрд░ рдЗрд╕ рддрд░рд╣ рдЬреЗрд╡реАрдПрдо рдХреЛ рдмрдВрдж рд╣реЛрдиреЗ рд╕реЗ рдмрдЪрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдЧрд╛ред рдХреНрдпрд╛ рдпрд╣ рдЕрджреНрднреБрдд рдирд╣реАрдВ рд╣реИ?
рдЗрд╕ рддрд░рд╣ рд╕реЗ рд╣реЙрдЯрд╕реНрдкреЙрдЯ рдиреЗ рд╕реЙрдлреНрдЯрд░реЗрдВрд╕ рдХреЛ рд╣рдЯрд╛рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ рд╣реИ: рдпрджрд┐ рдЖрдк рд╕реЙрдлреНрдЯрд░рдлреЗрд░ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдХрдХреНрд╖рд╛ рдореЗрдВ 2 рдЪрд░ рд╣реИрдВ - рдирд┐рдЬреА рд╕реНрдерд┐рд░ рд▓рдВрдмреА рдШрдбрд╝реА рдФрд░ рдирд┐рдЬреА рд▓рдВрдмреЗ рдЯрд╛рдЗрдорд╕реНрдЯреИрдореНрдкред рд╣рд░ рдмрд╛рд░ рдЬреАрд╕реА рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ, рдпрд╣ рдШрдбрд╝реА рдХреЗ рдЪрд░ рдХреЗ рд▓рд┐рдП рд╡рд░реНрддрдорд╛рди рд╕рдордп рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИред рдЬрдм рднреА рдХреЛрдИ SoftReference рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╡рд░реНрддрдорд╛рди рдШрдбрд╝реА рдХрд╛ рдореВрд▓реНрдп рдЯрд╛рдЗрдорд╕реНрдЯреИрдореНрдк рдХреЛ рд▓рд┐рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЯрд╛рдЗрдорд╕реНрдЯреИрдореНрдк рдХреЛ рд╣рд░ рдмрд╛рд░ рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ () рд╡рд┐рдзрд┐ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ (рд╣рд░ рдмрд╛рд░ рдЬрдм рд╣рдо рдПрдХ рдордЬрдмреВрдд рдСрдмреНрдЬреЗрдХреНрдЯ рд╕рдВрджрд░реНрдн рдмрдирд╛рддреЗ рд╣реИрдВ)ред рдпрд╣ рдЖрдкрдХреЛ рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдХрд┐ рдЕрдВрддрд┐рдо рдХреЙрд▓ рдХреЗ рдмрд╛рдж рдПрдХ рдирд░рдо рд▓рд┐рдВрдХ рдХрд┐рддрдиреА рджреЗрд░ рддрдХ рдореМрдЬреВрдж рд╣реИред рд╣рдо рдкрддреНрд░ I рджреНрд╡рд╛рд░рд╛ рдЗрд╕ рдЕрдВрддрд░рд╛рд▓ рдХреЛ рдирд┐рд░реВрдкрд┐рдд рдХрд░рддреЗ рд╣реИрдВред рд╣рдореЗрдВ рдЕрдХреНрд╖рд░ F рд╕реЗ MB (рдореЗрдЧрд╛рдмрд╛рдЗрдЯреНрд╕) рдореЗрдВ рдвреЗрд░ рдкрд░ рдЦрд╛рд▓реА рдЬрдЧрд╣ рдХреА рдорд╛рддреНрд░рд╛ рдХреЛ рдирд┐рд░реВрдкрд┐рдд рдХрд░рддреЗ рд╣реИрдВред рд▓рдЧрд╛рддрд╛рд░ MSPerMB рджреНрд╡рд╛рд░рд╛ рд╣рдо рдорд┐рд▓реАрд╕реЗрдХрдВрдб рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рджрд░реНрд╢рд╛рддреЗ рд╣реИрдВ рдХрд┐ рдвреЗрд░ рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдореБрдХреНрдд рдореЗрдЧрд╛рдмрд╛рдЗрдЯ рдХреЗ рд▓рд┐рдП рдХрд┐рддрдиреЗ рдирд░рдо рд▓рд┐рдВрдХ рдореМрдЬреВрдж рд╣реЛрдВрдЧреЗред
рдлрд┐рд░ рд╕рдм рдХреБрдЫ рд╕рд░рд▓ рд╣реИ, рдЕрдЧрд░ рдореИрдВ <= F * MSPerMB, рддреЛ рд╣рдо рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдирд╣реАрдВ рд╣рдЯрд╛рддреЗ рд╣реИрдВред рдЬреНрдпрд╛рджрд╛ рд╣реЛ рддреЛ рд╣рдЯрд╡рд╛рдПрдВред
MSPerMB рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП,
-XX рд╕реНрд╡рд┐рдЪ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ
: SoftRefLRUPolicyMSPerMB ред рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рди 1000 рдПрдордПрд╕ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдирд░рдо рд▓рд┐рдВрдХ рдореМрдЬреВрдж рд╣реЛрдЧрд╛ (рдордЬрдмреВрдд рд▓рд┐рдВрдХ рд╣рдЯрд╛ рджрд┐рдП рдЬрд╛рдиреЗ рдХреЗ рдмрд╛рдж) рдвреЗрд░ рдкрд░ рдореБрдлреНрдд рдореЗрдореЛрд░реА рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рдореЗрдЧрд╛рдмрд╛рдЗрдЯ рдХреЗ рд▓рд┐рдП 1 рд╕реЗрдХрдВрдбред рдореБрдЦреНрдп рдмрд╛рдд рдпрд╣ рдирд╣реАрдВ рднреВрд▓рдирд╛ рд╣реИ рдХрд┐ рдпреЗ рд╕рднреА рдЕрдиреБрдорд╛рдирд┐рдд рдЧрдгрдирд╛ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдирд░рдо рд▓рд┐рдВрдХ рдХреЗрд╡рд▓ рдЬреАрд╕реА рд▓реЙрдиреНрдЪ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдХрд┐рд╕реА рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдореБрдЭреЗ F * MSPerMB рд╕реЗ рд╕рдЦреНрддреА рд╕реЗ рдмрдбрд╝рд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрд╣ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд╣реИ рдХрд┐ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ SoftReference рдХрдо рд╕реЗ рдХрдо 1 GC рд▓реЙрдиреНрдЪ рд╕реЗ рдмрдЪреЗрдЧрд╛ред (* рдпрджрд┐ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдХреНрдпреЛрдВ, рддреЛ рдпрд╣ рдЖрдкрдХрд╛ рд╣реЛрдорд╡рд░реНрдХ рд░рд╣реЗрдЧрд╛)
рдЖрдИрдмреАрдПрдо рдХреЗ рд╡реАрдПрдо рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╕реЙрдлреНрдЯ рд▓рд┐рдВрдХ рдХреЗ рдЬреАрд╡рдирдХрд╛рд▓ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рд╕рдордп рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЬреАрд╡рд┐рдд рд░рд╣рдиреЗ рд╡рд╛рд▓реЗ рдЬреАрд╕реА рд▓реЙрдиреНрдЪ рдХреА рд╕рдВрдЦреНрдпрд╛ред
рдЖрд╡реЗрджрди
рдореБрдЦреНрдп SoftReference рдмрди рдпрд╣ рд╣реИ рдХрд┐ JVM рд╕реНрд╡рдпрдВ рдореЙрдирд┐рдЯрд░ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдХрд┐рд╕реА рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдореЗрдореЛрд░реА рд╕реЗ рд╣рдЯрд╛рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдпрд╛ рдирд╣реАрдВред рдФрд░ рдЕрдЧрд░ рдереЛрдбрд╝реА рдореЗрдореЛрд░реА рдмрдЪреА рд╣реИ, рддреЛ рдСрдмреНрдЬреЗрдХреНрдЯ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдХреИрд╢рд┐рдВрдЧ рдХрд░рддреЗ рд╕рдордп рд╣рдореЗрдВ рдареАрдХ рдпрд╣реА рдЪрд╛рд╣рд┐рдПред рд╕реЙрдлреНрдЯ рдореЗрдореЛрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдХреИрд╢рд┐рдВрдЧ рдЙрдкрд▓рдмреНрдз рдореЗрдореЛрд░реА рдХреА рдорд╛рддреНрд░рд╛ рдХреЗ рдкреНрд░рддрд┐ рд╕рдВрд╡реЗрджрдирд╢реАрд▓ рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЫрд╡рд┐ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдгред рдкрд╣рд▓рд╛ рдЖрд╡реЗрджрди рдЙрджрд╛рд╣рд░рдг рдереЛрдбрд╝рд╛ рдХрд╛рд▓реНрдкрдирд┐рдХ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рд╕рд╛рдВрдХреЗрддрд┐рдХ:
рд╣рдорд╛рд░рд╛ рд╕рд┐рд╕реНрдЯрдо рдЗрдореЗрдЬ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдореЗрдВ рд▓рдЧрд╛ рд╣реБрдЖ рд╣реИред рдорд╛рди рд▓реЗрдВ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рд╡рд┐рд╢рд╛рд▓ рдЫрд╡рд┐ рд╣реИ рдЬреЛ рдлрд╝рд╛рдЗрд▓ рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдХрд╣реАрдВ рд╕реНрдерд┐рдд рд╣реИ рдФрд░ рдпрд╣ рдЫрд╡рд┐ рд╣рдореЗрд╢рд╛ рд╕реНрдерд┐рд░ рд╣реЛрддреА рд╣реИред рдХрднреА-рдХрднреА рдХреЛрдИ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрд╕ рдЫрд╡рд┐ рдХреЛ рджреВрд╕рд░реА рдЫрд╡рд┐ рдХреЗ рд╕рд╛рде рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИред рдпрд╣рд╛рдБ рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рд╕рдореНрдореЗрд▓рди рдХрд╛ рд╣рдорд╛рд░рд╛ рдкрд╣рд▓рд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИ:
public class ImageProcessor { private static final String IMAGE_NAME = "bigImage.jpg"; public InputStream concatenateImegeWithDefaultVersion(InputStream userImageAsStream) { InputStream defaultImage = this.getClass().getResourceAsStream(IMAGE_NAME);
рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдореЗрдВ рдХрдИ рдХрдорд┐рдпрд╛рдВ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЙрдирдореЗрдВ рд╕реЗ рдПрдХ рдпрд╣ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рд╣рд░ рдмрд╛рд░ рдлрд╝рд╛рдЗрд▓ рд╕рд┐рд╕реНрдЯрдо рд╕реЗ рдПрдХ рдЫрд╡рд┐ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдиреА рдЪрд╛рд╣рд┐рдПред рдФрд░ рдпрд╣ рд╕рдмрд╕реЗ рддреЗрдЬ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдирд╣реАрдВ рд╣реИред рдЪрд▓рд┐рдП рдлрд┐рд░ рдЕрдкрд▓реЛрдб рдХреА рдЧрдИ рдЗрдореЗрдЬ рдХреЛ рдХреИрд╢ рдХрд░рддреЗ рд╣реИрдВред рдпрд╣рд╛рдБ рджреВрд╕рд░рд╛ рд╕рдВрд╕реНрдХрд░рдг рд╣реИ:
public class CachedImageProcessor { private static final String IMAGE_NAME = "bigImage.jpg"; private InputStream defaultImage; public InputStream concatenateImegeWithDefaultVersion(InputStream userImageAsStream) { if (defaultImage == null) { defaultImage = this.getClass().getResourceAsStream(IMAGE_NAME); }
рдпрд╣ рд╡рд┐рдХрд▓реНрдк рдкрд╣рд▓реЗ рд╕реЗ рдмреЗрд╣рддрд░ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрднреА рднреА рдПрдХ рд╕рдорд╕реНрдпрд╛ рд╣реИред рдЫрд╡рд┐ рдмрдбрд╝реА рд╣реИ рдФрд░ рдмрд╣реБрдд рд╕рд╛рд░реА рдореЗрдореЛрд░реА рд▓реЗрддреА рд╣реИред рд╣рдорд╛рд░рд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХрдИ рдЫрд╡рд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЕрдЧрд▓реА рдмрд╛рд░ рдЬрдм рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЫрд╡рд┐ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддрд╛ рд╣реИ, рддреЛ OutOfMemoryError рдЖрд╕рд╛рдиреА рд╕реЗ рдЧрд┐рд░ рд╕рдХрддреА рд╣реИред рдФрд░ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ? рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдЧрддрд┐ рдпрд╛ рд╕реНрдерд┐рд░рддрд╛ рдЪреБрдирдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рд╣рдо SoftReference рдХреЗ рдЕрд╕реНрддрд┐рддреНрд╡ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирддреЗ рд╣реИрдВред рдпрд╣ рд╣рдореЗрдВ рдХреИрд╢рд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЬрд╛рд░реА рд░рдЦрдиреЗ рдореЗрдВ рдорджрдж рдХрд░реЗрдЧрд╛, рд▓реЗрдХрд┐рди рдЧрдВрднреАрд░ рдкрд░рд┐рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ, рдЙрдиреНрд╣реЗрдВ рдореЗрдореЛрд░реА рд╕реЗ рдореБрдХреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреИрд╢ рд╕реЗ рдЕрдирд▓реЛрдб рдХрд░реЗрдВред рдФрд░ рдлрд┐рд░ рднреА, рд╣рдореЗрдВ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╕реНрдерд┐рддрд┐ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪрд┐рдВрддрд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдпрд╣ рд╣рдорд╛рд░рд╛ рддреАрд╕рд░рд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИ:
public class SoftCachedImageProcessor { private static final String IMAGE_NAME = "bigImage.jpg"; private SoftReference<InputStream> defaultImageRef = new SoftReference(loadImage()); public InputStream concatenateImegeWithDefaultVersion(InputStream userImageAsStream) { if (defaultImageRef.get() == null) {
рдпрд╣ рд╕рдВрд╕реНрдХрд░рдг рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рджрд┐рдЦрд╛рддрд╛ рд╣реИ рдХрд┐ рд╣рдо рдХреИрд╢ рджреНрд╡рд╛рд░рд╛ рдХрдмреНрдЬрд╛ рдХрд┐рдП рдЧрдП рдЖрдХрд╛рд░ рдХреЛ рдХрд┐рддрдиреА рдЖрд╕рд╛рдиреА рд╕реЗ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╛ рдмрд▓реНрдХрд┐, рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрди рдХреЛ рдирд┐рдпрдВрддреНрд░рдг рд╕реМрдВрдк рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдЦрддрд░рд╛ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИред рд▓рд╛рдЗрди рдирдВрдмрд░ 1 рдореЗрдВ рд╣рдо рдПрдХ рд╢реВрдиреНрдп рдЬрд╛рдВрдЪ рдХрд░рддреЗ рд╣реИрдВ, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╣рдо рдпрд╣ рдЬрд╛рдВрдЪрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдЬреАрд╕реА рдиреЗ рдореЗрдореЛрд░реА рд╕реЗ рдбреЗрдЯрд╛ рд╣рдЯрд╛ рджрд┐рдпрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВред рдорд╛рди рд▓реЗрдВ рдХрд┐ рдЙрд╕рдиреЗ рдЗрд╕реЗ рдирд╣реАрдВ рд╣рдЯрд╛рдпрд╛ рд╣реИред рд▓реЗрдХрд┐рди рд▓рд╛рдЗрди рдирдВрдмрд░ 2 рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдЬреАрд╕реА рдХрд╛рдо рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдбреЗрдЯрд╛ рдХреЛ рд╣рдЯрд╛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдкрдВрдХреНрддрд┐ рд╕рдВрдЦреНрдпрд╛ 2 рдХрд╛ рдкрд░рд┐рдгрд╛рдо defaultImage = null рд╣реЛрдЧрд╛ред рд╕реНрдореГрддрд┐ рдореЗрдВ рдХрд┐рд╕реА рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдЕрд╕реНрддрд┐рддреНрд╡ рдХреЛ рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдПрдХ рдордЬрдмреВрдд рд▓рд┐рдВрдХ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, defaultImage = defaultImageRef.get (); рдпрд╣рд╛рдВ рдЕрдВрддрд┐рдо рдХреНрд░рд┐рдпрд╛рдиреНрд╡рдпрди рдХреИрд╕рд╛ рджрд┐рдЦреЗрдЧрд╛:
public class SoftCachedImageProcessor { private static final String IMAGE_NAME = "bigImage.jpg"; private SoftReference<InputStream> defaultImageRef = new SoftReference(loadImage());; public InputStream concatenateImegeWithDefaultVersion(InputStream userImageAsStream) { defaultImage = defaultImageRef.get(); if (defaultImage == null) { defaultImage = this.getClass().getResourceAsStream(IMAGE_NAME); defaultImageRef = new SoftReference(defaultImage); }
рдФрд░ рдЖрдЧреЗ рдЪрд▓рддреЗ рд╣реИрдВред java.lang.Class рднреА рдХреИрд╢рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рд╕реЙрдлреНрдЯрд░реЗрдВрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдХреНрд▓рд╛рд╕ рдХреЗ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░реНрд╕, рдореЗрдердбреНрд╕ рдФрд░ рдлреАрд▓реНрдбреНрд╕ рдХреЗ рдбреЗрдЯрд╛ рдХреЛ рдХреИрд╢ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рджреЗрдЦрдирд╛ рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ рдХрд┐ рд╡реЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреНрдпрд╛ рдХреИрд╢ рдХрд░рддреЗ рд╣реИрдВред рдЬрдм рдЖрдк рдХреИрд╢рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рд╕реЙрдлреНрдЯрд░рд┐рдпрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓реЗрддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдпрд╣ рддрдп рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдХрд┐ рдХреИрд╢ рдХреНрдпрд╛ рдХрд░рдирд╛ рд╣реИред рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рд╣рдореЗрдВ рд╕реВрдЪреА рдХреЛ рдХреИрд╢ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд╣рдо рд╕реВрдЪреА <рд╢реАрддрд▓ рд╕рдВрджрд░реНрдн> рдФрд░ рд╢реАрддрд▓рддрд╛ <рд╕реВрдЪреА> рджреЛрдиреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рджреВрд╕рд░рд╛ рд╡рд┐рдХрд▓реНрдк рдЕрдзрд┐рдХ рд╕реНрд╡реАрдХрд╛рд░реНрдп рд╣реИред рдпрд╣ рдпрд╛рдж рд░рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рд╕рдВрджрд░реНрдн рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддреЗ рд╕рдордп рдЬреАрд╕реА рд╡рд┐рд╢рд┐рд╖реНрдЯ рддрд░реНрдХ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдореЗрдореЛрд░реА рдХреЛ рддреЗрдЬреА рд╕реЗ рдореБрдХреНрдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдпрджрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ 1 рд╕реЙрдлреНрдЯрд░рд┐рдиреЗрдВрд╕ рд╣реИ рдФрд░ рдЙрдирдХреА рд╕реВрдЪреА рдирд╣реАрдВ рд╣реИред рдпрд╣ рд╡рд╣ рд╣реИ рдЬреЛ рд╣рдо рдХрдХреНрд╖рд╛ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рджреЗрдЦрддреЗ рд╣реИрдВ - рдбреЗрд╡рд▓рдкрд░реНрд╕ рдиреЗ рдирд┐рд░реНрдорд╛рдгрдХрд░реНрддрд╛рдУрдВ, рдлрд╝реАрд▓реНрдбреНрд╕ рдФрд░ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреА рдПрдХ рд╕рд░рдгреА рдХреЗ рд▓рд┐рдП рдПрдХ рдирд░рдо рд▓рд┐рдВрдХ рдмрдирд╛рдпрд╛ред рдпрджрд┐ рд╣рдо рдкреНрд░рджрд░реНрд╢рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ рдЕрдХреНрд╕рд░, рдЧрд╝рд▓рддреА рд╕реЗ, рд▓реЛрдЧ рдХреИрд╢ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП WeakReference рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдЬрд╣рд╛рдВ рдпрд╣ SoftReference рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд╛рдпрдХ рд╣реИред рдЗрд╕рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдЦрд░рд╛рдм рдХреИрд╢ рдкреНрд░рджрд░реНрд╢рди рд╣реЛрддрд╛ рд╣реИред рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ, рдХрдордЬреЛрд░ рд▓рд┐рдВрдХ рдЬрд▓реНрджреА рд╕реЗ рдореЗрдореЛрд░реА рд╕реЗ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдЬреИрд╕реЗ рд╣реА рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрдд рд▓рд┐рдВрдХ рдЧрд╛рдпрдм рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВред рдФрд░ рдЬрдм рд╣рдореЗрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреИрд╢ рд╕реЗ рдХрд┐рд╕реА рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдЦреАрдВрдЪрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рддреЛ рд╣рдо рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рдпрд╣ рдЕрдм рдирд╣реАрдВ рд╣реИред
рдЦреИрд░, SoftReference рдкрд░ рдЖрдзрд╛рд░рд┐рдд рдХреИрд╢ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдФрд░ рдЙрджрд╛рд╣рд░рдгред Google рдЕрдорд░реВрдж рдореЗрдВ рдореИрдкрдореЗрдХрд░ рдХреНрд▓рд╛рд╕ рд╣реИред рдпрд╣ рд╣рдореЗрдВ рдПрдХ рд╕рдорд╡рд░реНрддреА рдорд╛рдирдЪрд┐рддреНрд░ рдмрдирд╛рдиреЗ рдореЗрдВ рдорджрдж рдХрд░реЗрдЧрд╛, рдЬрд┐рд╕рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реЛрдЧреА - рдорд╛рдирдЪрд┐рддреНрд░ рдХреА рдХреБрдВрдЬрд┐рдпрд╛рдБ рдФрд░ рдореВрд▓реНрдп WeakReference рдпрд╛ SoftReference рдореЗрдВ рд▓рдкреЗрдЯреЗ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рд╣рдорд╛рд░реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рд╡рд╣ рдбреЗрдЯрд╛ рд╣реИ рдЬреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЕрдиреБрд░реЛрдз рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдпрд╣ рдбреЗрдЯрд╛ рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ рдПрдХ рдмрд╣реБрдд рд╣реА рдЬрдЯрд┐рд▓ рдХреНрд╡реЗрд░реА рджреНрд╡рд╛рд░рд╛ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрд╣ рдкрд┐рдЫрд▓реЗ рд╡рд░реНрд╖ рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреА рдЦрд░реАрджрд╛рд░реА рд╕реВрдЪреА рд╣реЛрдЧреАред рд╣рдо рдПрдХ рдХреИрд╢ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ рд╕реЙрдлреНрдЯ рд▓рд┐рдВрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдореВрд▓реНрдпреЛрдВ (рдЦрд░реАрджрд╛рд░реА рдХреА рд╕реВрдЪреА) рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдФрд░ рдЕрдЧрд░ рдХреИрд╢ рдореЗрдВ рдХреЛрдИ рдореВрд▓реНрдп рдирд╣реАрдВ рд╣реИ, рддреЛ рдЖрдкрдХреЛ рдЗрд╕реЗ рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ рдЦреАрдВрдЪрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдХреБрдВрдЬреА рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЖрдИрдбреА рд╣реИред рдпрд╣рд╛рдБ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреИрд╕рд╛ рджрд┐рдЦ рд╕рдХрддрд╛ рд╣реИ:
ConcurrentMap<Long, List<Product>> oldProductsCache = new MapMaker().softValues(). .makeComputingMap(new Function<User, List<Product>>() { @Override public List<Product> apply(User user) { return loadProductsFromDb(user); } });
WeakReference
рдЬреАрд╕реА рд╕реБрд╡рд┐рдзрд╛рдПрдБ
рдЕрдм рдЖрдЗрдП рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ рдХрд┐ WeakReference рдХреНрдпрд╛ рд╣реИред рдЬрдм рдЬреАрд╕реА рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдХреЛрдИ рд╡рд╕реНрддреБ рдХреЗрд╡рд▓ рдХрдордЬреЛрд░ рд▓рд┐рдВрдХ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕реБрд▓рдн рд╣реИ, рддреЛ рдпрд╣ рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдореЛрд░реА рд╕реЗ "рддреБрд░рдВрдд" рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ ReferenceQueue рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдпрд╛рдж рд░рдЦрдиреЗ рдФрд░ рд╕реНрдореГрддрд┐ рд╕реЗ рдХрд┐рд╕реА рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд╛ рдкрд╛рд▓рди рдХрд░рдиреЗ рдХреЗ рд▓рд╛рдпрдХ рд╣реИред рдЖрдкрдХреЛ рдпрд╛рдж рджрд┐рд▓рд╛ рджреВрдВ рдХрд┐ WeakReference рдФрд░ SoftReference рдХреЗ рд▓рд┐рдП ReferenceQueue рдореЗрдВ рдЖрдиреЗ рдХреЗ рд▓рд┐рдП рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рд╕рдорд╛рди рд╣реИред рдЗрд╕рд▓рд┐рдП, рдЬреАрд╕реА рдиреЗ рд╢реБрд░реВ рдХрд┐рдпрд╛ рдФрд░ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдХрд┐ рд╡рд╕реНрддреБ рдХреЗрд╡рд▓ рдХрдордЬреЛрд░ рд▓рд┐рдВрдХ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕реБрд▓рдн рд╣реИред рдпрд╣ рдСрдмреНрдЬреЗрдХреНрдЯ рдЗрд╕ рддрд░рд╣ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛:
StrIngBuilder AAA = new StringBuilder(); ReferenceQueue queue = new ReferenceQueue(); WeakReference weakRef = new WeakReference(AAA, queue);
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЬреАрд╕реА рдХрдордЬреЛрд░ рд▓рд┐рдВрдХ рдХреЛ рд╕рд╛рдл рдХрд░ рджреЗрдЧрд╛, рдпрд╛рдиреА рдХрдордЬреЛрд░ рд░реАрдлреЗрдЯ () - рд╢реВрдиреНрдп рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рдПрдЧрд╛ред рдлрд┐рд░ рдХрдордЬреЛрд░ рд░реАрдл рдХреЛ рдХрддрд╛рд░ рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рдПрдЧрд╛ рдФрд░ рддрджрдиреБрд╕рд╛рд░ рдХрддрд╛рд░ (рдЯреЛрд▓) рдХрдордЬреЛрд░ рдХрд┐рд░рдг рдХрд╛ рд▓рд┐рдВрдХ рд▓реМрдЯрд╛рдПрдЧрд╛ред рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдореИрдВ рд╕рднреА рдЬреАрд╕реАрдЖрд░ рдХреА рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд▓рд┐рдЦрдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ред рдЕрдм рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдЖрд╡реЗрджрди
рдмреЗрд╢рдХ WeakHashMapред рдпрд╣ рдорд╛рдирдЪрд┐рддреНрд░ <K, V> рдХрд╛ рдПрдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИ рдЬреЛ рдПрдХ рдХрдордЬреЛрд░ рд▓рд┐рдВрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреБрдВрдЬреА рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИред рдФрд░ рдЬрдм GC рдореЗрдореЛрд░реА рд╕реЗ рдХреБрдВрдЬреА рдХреЛ рд╣рдЯрд╛рддрд╛ рд╣реИ, рддреЛ рдореИрдк рд╕реЗ рдкреВрд░рд╛ рд░рд┐рдХреЙрд░реНрдб рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕рдордЭрдирд╛ рдореБрд╢реНрдХрд┐рд▓ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рд╣реЛрддрд╛ рд╣реИред рдЬрдм рдПрдХ рдирдпрд╛ рдЬреЛрдбрд╝рд╛ <key, value> рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рддреЛ WeakReference рдХреБрдВрдЬреА рдХреЗ рд▓рд┐рдП рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ ReferenceQueue рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЛ рдкрд╛рд╕ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЬрдм GC рдореЗрдореЛрд░реА рд╕реЗ рдХреБрдВрдЬреА рдХреЛ рд╣рдЯрд╛рддрд╛ рд╣реИ, рддреЛ ReferenceQueue рдЙрд╕ рдХреБрдВрдЬреА рдХреЗ рд▓рд┐рдП рд╕рдВрдЧрдд WeakReference рдХреЛ рд▓реМрдЯрд╛рддрд╛ рд╣реИред рдЙрд╕рдХреЗ рдмрд╛рдж, рд╕рдВрдмрдВрдзрд┐рдд рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдХреЛ рдорд╛рдирдЪрд┐рддреНрд░ рд╕реЗ рдирд┐рдХрд╛рд▓ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╕рдм рдХреБрдЫ рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИред рд▓реЗрдХрд┐рди рдореИрдВ рдХреБрдЫ рд╡рд┐рд╡рд░рдгреЛрдВ рдкрд░ рдзреНрдпрд╛рди рджреЗрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред
- WeakHashMap рдХреЛ рдХреИрд╢ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдЗрд░рд╛рджрд╛ рдирд╣реАрдВ рд╣реИред WeakReference рдХреБрдВрдЬреА рдХреЗ рд▓рд┐рдП рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рди рдХрд┐ рдорд╛рди рдХреЗ рд▓рд┐рдПред рдФрд░ рдбреЗрдЯрд╛ рдХреЗрд╡рд▓ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЗ рдмрд╛рдж рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдЬрд┐рд╕рдореЗрдВ рдХреБрдВрдЬреА рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдордЬрдмреВрдд рд▓рд┐рдВрдХ рдирд╣реАрдВ рд╣реИ рдФрд░ рдореВрд▓реНрдп рдирд╣реАрдВ рд╣реИред рдЬреНрдпрд╛рджрд╛рддрд░ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдпрд╣ рд╡рд╣ рдирд╣реАрдВ рд╣реИ рдЬреЛ рдЖрдк рдХреИрд╢рд┐рдВрдЧ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред
- WeakHashMap рд╕реЗ рдбреЗрдЯрд╛ рдХреЛ рдЬреАрд╕реА рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рддреБрд░рдВрдд рдмрд╛рдж рд╣рдЯрд╛ рдирд╣реАрдВ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдХрд┐ рдХреБрдВрдЬреА рдХреЗрд╡рд▓ рдХрдордЬреЛрд░ рд▓рд┐рдВрдХ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕реБрд▓рдн рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЕрдЧрд▓реА рдмрд╛рд░ рдЬрдм рдЖрдк WeakHashMap рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдХреНрд▓реАрдирдЕрдк рд╣реЛрдЧрд╛ред
- рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, WeakHashMap рдЙрди рдХреБрдВрдЬрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрднрд┐рдкреНрд░реЗрдд рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╕рдорддреБрд▓реНрдп рд╡рд┐рдзрд┐ рд╡рд╕реНрддреБрдУрдВ рдХреА рдкрд╣рдЪрд╛рди (= рдСрдкрд░реЗрдЯрд░) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреА рд╣реИред рдПрдХ рдмрд╛рд░ рдХреБрдВрдЬреА рддрдХ рдкрд╣реБрдВрдЪ рдЦреЛ рдЬрд╛рдиреЗ рдХреЗ рдмрд╛рдж, рдЗрд╕реЗ рдлрд┐рд░ рд╕реЗ рдмрдирд╛рдпрд╛ рдирд╣реАрдВ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдЦреИрд░, рдлрд┐рд░ рдХрд┐рди рдорд╛рдорд▓реЛрдВ рдореЗрдВ WeakHashMap рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ? рдорд╛рди рд▓реАрдЬрд┐рдП рд╣рдореЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ XML рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХрд╛ рдбрд┐рдЬрд╝рд╛рдЗрди рдХрдИ рд╕реЗрд╡рд╛рдУрдВ рджреНрд╡рд╛рд░рд╛ рд╕рдВрднрд╛рд▓рд╛ рдЬрд╛рдПрдЧрд╛ рдЬреЛ org.w3c.Node рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВрдЧреЗ рдЬрд┐рд╕рдореЗрдВ рд╡реЗ рдЖрд╡рд╢реНрдпрдХ рддрддреНрд╡ рдЬреЛрдбрд╝ рджреЗрдВрдЧреЗред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╕реЗрд╡рд╛рдУрдВ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╣реБрдд рд╕рд╛рд░реА рдЬрд╛рдирдХрд╛рд░реА рдЪрд╛рд╣рд┐рдПред рд╣рдо рдЗрд╕ рдбреЗрдЯрд╛ рдХреЛ UserInfo рд╡рд░реНрдЧ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░реЗрдВрдЧреЗред UserInfo рд╡рд░реНрдЧ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдореЗрдореЛрд░реА рд╕реНрдкреЗрд╕ рд▓реЗрддрд╛ рд╣реИ рдФрд░ рдХреЗрд╡рд▓ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ XML рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рд╣реИред рдХреИрд╢рд┐рдВрдЧ рдпреВрдЬрд░рдЗрдиреНрдлреЛ рдХрд╛ рдХреЛрдИ рдорддрд▓рдм рдирд╣реАрдВ рд╣реИред рд╣рдореЗрдВ рдХреЗрд╡рд▓ рдЗрд╕реЗ рдПрдХ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХреЗ рд╕рд╛рде рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рдпрд╣ рдореЗрдореЛрд░реА рд╕реЗ рд╣рдЯрд╛рдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреА рдЬрд╛рддреА рд╣реИ рдЬрдм рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рджреНрд╡рд╛рд░рд╛ рдЕрдм рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╣рдореЗрдВ рдмрд╕ рдЗрддрдирд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП:
private static final NODE_TO_USER_MAP = new WeakHashMap<Node, UserInfo>();
XML рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдмрдирд╛рдирд╛ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛:
Node mainDocument = createBaseNode(); NODE_TO_USER_MAP.put(mainDocument, loadUserInfo());
рдЦреИрд░, рдпрд╣рд╛рдБ рдкрдврд╝рдиреЗ рд╣реИ:
UserInfo userInfo = NODE_TO_USER_MAP.get(mainDocument); If(userInfo != null) {
UserInfo, WeakHashMap рдореЗрдВ рддрдм рддрдХ рд░рд╣реЗрдЧрд╛ рдЬрдм рддрдХ рдХрд┐ рдХреЗрд╡рд▓ рдХрдордЬреЛрд░ рд▓рд┐рдВрдХ mainDocument рдкрд░ рдирд╣реАрдВ рд░рд╣рддреЗред
WeakHashMap рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдФрд░ рдЙрджрд╛рд╣рд░рдгред String.intern () рдкрджреНрдзрддрд┐ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╣реБрдд рд╕реЗ рд▓реЛрдЧ рдЬрд╛рдирддреЗ рд╣реИрдВред рдЗрд╕рд▓рд┐рдП WeakReference рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЖрдк рдХреБрдЫ рд╕рдорд╛рди рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред (рдЖрдЗрдП рдЗрд╕ рд▓реЗрдЦ рдХреЗ рдврд╛рдВрдЪреЗ рдХреЗ рднреАрддрд░, рдЗрд╕ рд╕рдорд╛рдзрд╛рди рдХреА рдЙрдкрдпреБрдХреНрддрддрд╛ рдкрд░ рдЪрд░реНрдЪрд╛ рди рдХрд░реЗрдВ, рдФрд░ рдЗрд╕ рддрдереНрдп рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░реЗрдВ рдХрд┐ рдЗрд╕ рд╕рдорд╛рдзрд╛рди рдореЗрдВ рдЗрдВрдЯрд░реНрди () рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдХреБрдЫ рдлрд╛рдпрджреЗ рд╣реИрдВред рдЗрд╕рд▓рд┐рдП, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХрдИ рд▓рд╛рдЗрдиреЗрдВ рд╣реИрдВред рд╣рдо рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рд▓рд╛рдЗрдиреЗрдВ рджреЛрд╣рд░рд╛рдИ рдЬрд╛рддреА рд╣реИрдВред рд╕реНрдореГрддрд┐ рдХреЛ рдмрдЪрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдЙрд╕реА рддрд░реНрдЬ рдХреЗ рд▓рд┐рдП рдирдИ рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдмрдирд╛рдиреЗ рдХреЗ рдмрдЬрд╛рдп рдореМрдЬреВрджрд╛ рд╡рд╕реНрддреБрдУрдВ рдХрд╛ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдпрд╣рд╛рдВ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ WeakHashMap рдХреИрд╕реЗ рд╣рдорд╛рд░реА рдорджрдж рдХрд░ рд╕рдХрддрд╛ рд╣реИ:
private static Map<String, WeakReference<String>> stringPool = new WeakHashMap<String, WeakReference<String>>; public String getFromPool(String value) { WeakReference<String> stringRef = stringPool.get(value); if (stringRef == null || stringRef.get() == null ) { stringRef = new WeakReference<String>(value); stringPool.put(value, stringRef); } return stringRef.get(); }
рдФрд░ рдЕрдВрдд рдореЗрдВ, рдореИрдВ рдЬреЛрдбрд╝реВрдВрдЧрд╛ рдХрд┐ WeakReference рдХреЛ рдХрдИ рд╡рд░реНрдЧреЛрдВ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ - рдереНрд░реЗрдб, рдереНрд░реЗрдбрд▓реЛрдХ, рдСрдмреНрдЬреЗрдХреНрдЯрдСрдЯрдкреНрдпреВрд╕реНрдЯреНрд░реАрдо, рдкреНрд░реЙрдХреНрд╕реА, рд▓реЙрдЧрдореИрдиред рдпрд╣ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ WeakReference рдЖрдкрдХреЛ рдХрд┐рди рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдорджрдж рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдЖрдк рдЙрдирдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред
PhantomReference
рдЬреАрд╕реА рд╕реБрд╡рд┐рдзрд╛рдПрдБ
рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдВрдХ рдХреА рджреЛ рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ рд╣реИрдВред рдкрд╣рд▓рд╛ рдпрд╣ рд╣реИ рдХрд┐ рдкреНрд░рд╛рдкреНрдд () рд╡рд┐рдзрд┐ рд╣рдореЗрд╢рд╛ рд╢реВрдиреНрдп рд░рд╣рддреА рд╣реИред рдЗрд╕рдХрд╛ рдХрд╛рд░рдг рдпрд╣ рд╣реИ рдХрд┐ PhantomReference рдХреЗрд╡рд▓ ReferenceQueue рдХреЗ рд╕рд╛рде рдПрдХ рд╕рд╛рде рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИред рджреВрд╕рд░реА рд╡рд┐рд╢реЗрд╖рддрд╛ - рд╕реЙрдлреНрдЯрд░рдлреЗрд░реЗрдВрд╕ рдФрд░ рд╡реАрдЗрдХ рд░реАрдлрд░реЗрдВрд╕ рдХреЗ рд╡рд┐рдкрд░реАрдд, рдЬреАрд╕реА рдлрд╛рдЗрдирд▓ () рдкрджреНрдзрддрд┐ рдХреЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд
рд╣реЛрдиреЗ рдХреЗ
рдмрд╛рдж рд░реЗрдлрд░реЗрдВрд╕рдХреНрдпреВ рдХреЗ рд▓рд┐рдП рдПрдХ рдлреИрдВрдЯрдо рд▓рд┐рдВрдХ рдЬреЛрдбрд╝ рджреЗрдЧрд╛ред рдпрд╣реА рд╣реИ, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, SoftReference рдФрд░ WeakReference рдХреЗ рд╡рд┐рдкрд░реАрдд, рдСрдмреНрдЬреЗрдХреНрдЯ рдЕрднреА рднреА рдореЗрдореЛрд░реА рдореЗрдВ рд╣реИред
рдЕрднреНрдпрд╛рд╕
рдкрд╣рд▓реА рдирдЬрд╝рд░ рдореЗрдВ, рдпрд╣ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдВрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рдПред рдЙрдиреНрд╣реЗрдВ рдХреИрд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдП, рдпрд╣ рд╕рдордЭрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдЗрдП рд╣рдо рдкрд╣рд▓реЗ рдЕрдВрддрд┐рдо () рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рдЖрдиреЗ рд╡рд╛рд▓реА рд╕рдорд╕реНрдпрд╛рдУрдВ рд╕реЗ рдЦреБрдж рдХреЛ рдкрд░рд┐рдЪрд┐рдд рдХрд░реЗрдВ: рдЗрд╕ рдкрджреНрдзрддрд┐ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рдиреЗ рд╕реЗ рд╣рдореЗрдВ рдСрдмреНрдЬреЗрдХреНрдЯ рд╕реЗ рдЬреБрдбрд╝реЗ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЛ рд╕рд╛рдл рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдорд┐рд▓рддреА рд╣реИред рдЬрдм рдЬреАрд╕реА рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдСрдмреНрдЬреЗрдХреНрдЯ рдЕрдм рдЙрдкрд▓рдмреНрдз рдирд╣реАрдВ рд╣реИ, рддреЛ рдЗрд╕реЗ рдореЗрдореЛрд░реА рд╕реЗ рд╣рдЯрд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдпрд╣ рдЗрд╕ рд╡рд┐рдзрд┐ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддрд╛ рд╣реИред рдЗрд╕рд╕реЗ рдЬреБрдбрд╝реА рд╕рдорд╕реНрдпрд╛рдПрдВ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИрдВ:
- рдЬреАрд╕реА рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рд░реВрдк рд╕реЗ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ, рд╣рдо рдирд╣реАрдВ рдЬрд╛рди рд╕рдХрддреЗ рдХрд┐ рдЕрдВрддрд┐рдо () рд╡рд┐рдзрд┐ рдХрдм рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХреА рдЬрд╛рдПрдЧреА
- рдЕрдВрддрд┐рдо рд░реВрдк () рд╡рд┐рдзрд┐рдпрд╛рдБ рдмрджрд▓реЗ рдореЗрдВ, рдПрдХ рд╣реА рдзрд╛рдЧреЗ рдореЗрдВ рдЪрд▓рддреА рд╣реИрдВред рдФрд░ рдЬрдм рддрдХ рдЗрд╕ рд╡рд┐рдзрд┐ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддрдм рддрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдореЗрдореЛрд░реА рд╕реЗ рд╣рдЯрд╛рдпрд╛ рдирд╣реАрдВ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ
- рдЗрд╕ рд╡рд┐рдзрд┐ рдХреЛ рдХрд╣рд╛ рдЬрд╛рдПрдЧрд╛ рдХрд┐ рдХреЛрдИ рдЧрд╛рд░рдВрдЯреА рдирд╣реАрдВ рд╣реИред рдЬреЗрд╡реАрдПрдо рдЕрдкрдирд╛ рдХрд╛рдо рдкреВрд░рд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рдСрдмреНрдЬреЗрдХреНрдЯ рджреБрд░реНрдЧрдо рдирд╣реАрдВ рд╣реЛрдЧрд╛ред
- рдЕрдВрддрд┐рдо рд░реВрдк () рд╡рд┐рдзрд┐ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рджреМрд░рд╛рди, рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рдПрдХ рдордЬрдмреВрдд рд╕рдВрджрд░реНрдн рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рд╣рдЯрд╛рдпрд╛ рдирд╣реАрдВ рдЬрд╛рдПрдЧрд╛, рд▓реЗрдХрд┐рди рдЕрдЧрд▓реА рдмрд╛рд░ рдЬрдм рдЬреАрд╕реА рджреЗрдЦрддрд╛ рд╣реИ рдХрд┐ рдСрдмреНрдЬреЗрдХреНрдЯ рдЕрдм рдЙрдкрд▓рдмреНрдз рдирд╣реАрдВ рд╣реИ, рддреЛ рдЕрдВрддрд┐рдо рд░реВрдк () рд╡рд┐рдзрд┐ рдЕрдм рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдирд╣реАрдВ рд╣реЛрдЧреАред
рд╡рд╛рдкрд╕ рдкреНрд░реЗрддрд╕рдВрд╡рд╛рдж рдХреЗ рд▓рд┐рдПред ReferenceQueue рдХреЗ рд╕рд╛рде рд╕рдВрдпреЛрдЬрди рдореЗрдВ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдВрдХ рд╣рдореЗрдВ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВ рдХрд┐ рдСрдмреНрдЬреЗрдХреНрдЯ рдЕрдм рдЙрдкрд▓рдмреНрдз рдирд╣реАрдВ рд╣реИ рдФрд░ рдЗрд╕рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдЕрдиреНрдп рд▓рд┐рдВрдХ рдирд╣реАрдВ рд╣реИрдВред рдпрд╣ рд╣рдореЗрдВ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╕реНрддрд░ рдкрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЧрдП рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЛ рд╕рд╛рдл рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдЕрдВрддрд┐рдо рд░реВрдк рджреЗрдиреЗ () рдХреЗ рд╡рд┐рдкрд░реАрдд, рд╣рдо рд╕реНрд╡рдпрдВ рд╕рдлрд╛рдИ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣рдо рдирдИ рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдмрдирд╛рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдХрд╛рд░рдЦрд╛рдирд╛ рд╣реИ рдЬреЛ рд╣рдореЗрдВ HdImage рдСрдмреНрдЬреЗрдХреНрдЯ рд▓реМрдЯрд╛рдПрдЧрд╛ред рд╣рдо рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдРрд╕реА рдХрд┐рддрдиреА рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдореЗрдореЛрд░реА рдореЗрдВ рд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛:
public HdImageFabric { public static final int IMAGE_LIMIT = 10; public static int count = 0; public static ReferenceQueue<HdImage> queue = new ReferenceQueue<HdImage>(); public HdImage loadHdImage(String imageName) { while (true) { if (count < IMAGE_LIMIT) { return wrapImage(loadImage(imageName)); } else { Reference<HdImage> ref = queue.remove(500); if (ref != null) { count--; System.out.println(тАЬremove old imageтАЭ); } } } } private HdImage wrapImage(HdImage image) { PhantomReference<HdImage> refImage = new PhantomReference(image, queue); count++; return refImage ; } }
рдпрд╣ рдЙрджрд╛рд╣рд░рдг рдереНрд░реЗрдб рд╕реБрд░рдХреНрд╖рд┐рдд рдирд╣реАрдВ рд╣реИ рдФрд░ рдЗрд╕рдореЗрдВ рдЕрдиреНрдп рдХрдорд┐рдпрд╛рдВ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рджрд░реНрд╢рд╛рддрд╛ рд╣реИ рдХрд┐ рдлреИрдВрдЯрдо рд░реЗрдлрд░реЗрдВрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдЗрд╕ рддрдереНрдп рдХреЗ рдХрд╛рд░рдг рдХрд┐ рдкреНрд░рд╛рдкреНрдд () рд╡рд┐рдзрд┐ рд╣рдореЗрд╢рд╛ рд╢реВрдиреНрдп рд╣реЛ рдЬрд╛рддреА рд╣реИ, рдпрд╣ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдХрд┐рд╕ рд╡рд╕реНрддреБ рдХреЛ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдпрд╣ рдХреИрд╕реЗ рд╕рдордЭрд╛ рдЬрд╛рдПред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЕрдкрдирд╛ рд╕реНрд╡рдпрдВ рдХрд╛ рд╡рд░реНрдЧ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬреЛ рдХрд┐ рдлреИрдВрдЯрдо рд░реАрдлрд░реЗрдВрд╕ рдХреЛ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рд╛ рд╣реЛрдЧрд╛, рдФрд░ рдЬрд┐рд╕рдореЗрдВ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╡рд┐рд╡рд░рдг рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдорд┐рд▓реЗрдЧреА рдХрд┐ рдХрд┐рди рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЛ рд╕рд╛рдл рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
PhantomReference рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп, рдХреБрдЫ рдмрд╛рддреЛрдВ рдХрд╛ рдзреНрдпрд╛рди рд░рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП:
- рдЕрдиреБрдмрдВрдз рдХреА рдЧрд╛рд░рдВрдЯреА рд╣реИ рдХрд┐ рд▓рд┐рдВрдХ рдЬреАрд╕реА рдиреЛрдЯрд┐рд╕ рдХреЗ рдмрд╛рдж рдХрддрд╛рд░ рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рд╣реИ рдХрд┐ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗрд╡рд▓ рдлреИрдВрдЯрдо рд▓рд┐рдВрдХ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕реБрд▓рдн рд╣реИ рдФрд░ рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдореЛрд░реА рд╕реЗ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЕрдиреБрдмрдВрдз рдпрд╣ рдЧрд╛рд░рдВрдЯреА рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИ рдХрд┐ рдпреЗ рдШрдЯрдирд╛рдПрдВ рдПрдХ рдХреЗ рдмрд╛рдж рдПрдХ рдШрдЯрд┐рдд рд╣реЛрдВрдЧреАред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдХреЛрдИ рднреА рд╕рдордп рдЗрди рдШрдЯрдирд╛рдУрдВ рдХреЗ рдмреАрдЪ рдмреАрдд рд╕рдХрддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЛ рд╕рд╛рдл рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП PhantomReference рдкрд░ рднрд░реЛрд╕рд╛ рди рдХрд░реЗрдВред
- рдЕрдВрддрд┐рдо рд░реВрдк () рд╡рд┐рдзрд┐ рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рдиреЗ рдФрд░ рд░реЗрдлрд░реЗрдВрд╕ рдХреНрдпреВ рдХреЗ рд▓рд┐рдП рдлреИрдВрдЯрдо рд▓рд┐рдВрдХ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЬреАрд╕реА рд▓реЙрдиреНрдЪ рдкрд░ рдкреНрд░рджрд░реНрд╢рди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдпрджрд┐ рдХрд┐рд╕реА рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рдЕрдВрддрд┐рдо () рд╡рд┐рдзрд┐ рдУрд╡рд░рд░рд╛рдЗрдб рдХреА рдЬрд╛рддреА рд╣реИ, рддреЛ рдЗрд╕реЗ рд╣рдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП 3 GC рдкреНрд░рд╛рд░рдВрдн рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдФрд░ рдпрджрд┐ рд╡рд┐рдзрд┐ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдХрдо рд╕реЗ рдХрдо 2 GC рдкреНрд░рд╛рд░рдВрдн рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ
ред
рдирд┐рд╖реНрдХрд░реНрд╖ рдХреЗ рд░реВрдк рдореЗрдВ, рдореИрдВ рдХрд╣рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ java.lang.refред * рд╣рдореЗрдВ JVM рдореЗрдореЛрд░реА рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рдЕрдЪреНрдЫреЗ рдЕрд╡рд╕рд░ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЖрдкрдХреЛ рдЗрди рд╡рд░реНрдЧреЛрдВ рдХреА рдЙрдкреЗрдХреНрд╖рд╛ рдирд╣реАрдВ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдП, рд╡реЗ рд╣рдорд╛рд░реА рдмрд╣реБрдд рдорджрдж рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рд╣реИ, рдФрд░ рд╡рд╛рдВрдЫрд┐рдд рдкрд░рд┐рдгрд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдмреЗрд╣рдж рд╕рд╛рд╡рдзрд╛рди рд░рд╣рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рдЗрди рдХрдард┐рдирд╛рдЗрдпреЛрдВ рдиреЗ рд╣рдореЗрдВ рдПрдХ рдмрд╛рд░ рд░реЛрдХ рджрд┐рдпрд╛? рд╡рд╣ рд╕рдм рд╣реИред рдЕрдВрдд рддрдХ рдкрдврд╝рдиреЗ рд╡рд╛рд▓реЗ рд╕рднреА рдХреЛ рдзрдиреНрдпрд╡рд╛рджред рдореИрдВ рдЙрди рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рдЙрди рд╕рд╡рд╛рд▓реЛрдВ рдХреЗ рдЬрд╡рд╛рдм рджреЗрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реВрдВрдЧрд╛ рдЬреЛ рдореИрдВ рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдирд╣реАрдВ рдмрддрд╛ рд╕рдХрддрд╛ред