කසළ එකතු කිරීමට බල කිරීම හොඳ අදහසක් වන්නේ කවදාද?


138

ඒ නිසා මම C # කසළ එකතු කරන්නාට සෑම පිළිතුරක්ම පාහේ සමාන තැනක ධාවනය කිරීමට බල කිරීම පිළිබඳ ප්‍රශ්නයක් කියවමින් සිටියෙමි : ඔබට එය කළ හැකිය, නමුත් ඔබ නොකළ යුතුය - ඉතා දුර්ලභ අවස්ථා කිහිපයක් හැර . කනගාටුවට කරුණක් නම්, එවැනි කිසිවෙකු එවැනි සිදුවීම් මොනවාද යන්න විස්තර නොකරයි.

කසළ එකතු කිරීමට බල කිරීම ඇත්තෙන්ම හොඳ හෝ සාධාරණ අදහසක් වන්නේ කුමන ආකාරයේ තත්වයකදැයි මට කිව හැකිද?

මම ඉල්ලන්නේ C # විශේෂිත අවස්ථා නොව, කසළ එකතු කරන්නකු සිටින සියලුම ක්‍රමලේඛන භාෂා ය. ජාවා වැනි සෑම භාෂාවකටම ඔබට GC බල කළ නොහැකි බව මම දනිමි, නමුත් ඔබට හැකි යැයි සිතමු.


17
"නමුත්, කසළ එකතු කරන්නෙකු ඇති සියලුම ක්‍රමලේඛන භාෂා" විවිධ භාෂා (හෝ, වඩාත් නිවැරදිව, විවිධ ක්‍රියාත්මක කිරීම් ) කසළ එකතු කිරීම සඳහා විවිධ ක්‍රම භාවිතා කරයි, එබැවින් ඔබට එක් ප්‍රමාණයකට ගැළපෙන-සියලු රීතියක් සොයා ගැනීමට අපහසුය.
කර්නල් තිස් දෙක

4
OvDoval ඔබ තථ්‍ය කාල සීමාවකට යටත්ව සිටී නම් සහ GC ගැලපෙන සහතික ලබා නොදේ නම්, ඔබ පර්වතයක් හා දුෂ්කර ස්ථානයක් අතර වේ. එය එදිරිව එදිරිව එදිරිව කිසිවක් නොකර සිටිය හැකිය. නමුත් මා අසා ඇති දෙයින් සාමාන්‍ය මෙහෙයුම් කටයුතුවලදී වෙන් කිරීම වළක්වා ගැනීම පහසුය.

3
ඔබ සිතුවේ ඔබ තථ්‍ය කාලීන කාලසීමාවන් ලබා ගැනීමට අපේක්‍ෂා කරන්නේ නම්, ඔබ කිසි විටෙකත් GC භාෂාවක් භාවිතා නොකරන බවයි.
ග්‍රෙග්‍රොස්

4
VM නොවන විශේෂිත ආකාරයකින් ඔබට මෙය පිළිතුරු දිය හැක්කේ කෙසේදැයි මට නොපෙනේ. 32-බිට් ක්‍රියාවලි සඳහා අදාළ, 64-බිට් ක්‍රියාවලි සඳහා අදාළ නොවේ. .NET JVM සහ ඉහළ පෙළේ එකක් සඳහා
rwong

3
Av ඩේවිඩ්කොන්රාඩ් ඔබට එය C # වලින් බල කළ හැකිය. එබැවින් ප්රශ්නය.
ඔමේගා

Answers:


126

සියලුම GC ක්‍රියාවට නැංවීම සඳහා සුදුසු ක්‍රමයක් පිළිබඳව ඔබට සැබවින්ම හිස් ප්‍රකාශ කළ නොහැක . ඒවා වල් වෙනස් වේ. ඒ නිසා මම මුලින් සඳහන් කළ .NET එක සමඟ කතා කරන්නම්.

ඕනෑම තර්කනයකින් හෝ හේතුවක් ඇතිව මෙය සිදු කිරීම සඳහා ඔබ GC හි හැසිරීම ඉතා සමීපව දැන සිටිය යුතුය.

එකතු කිරීම පිළිබඳ මට ඇති එකම උපදෙස නම්: එය කිසි විටෙකත් නොකරන්න.

GC හි සංකීර්ණ තොරතුරු ඔබ සැබවින්ම දන්නේ නම්, ඔබට මගේ උපදෙස් අවශ්‍ය නොවන බැවින් එය වැදගත් නොවේ. ඔබ දැනටමත් 100% විශ්වාසයෙන් නොදන්නේ නම් එය උපකාරී වනු ඇති අතර, සබැඳිව බලා මෙවැනි පිළිතුරක් සොයා ගත යුතුය : ඔබ GC.Collect අමතන්න එපා , හෝ විකල්පයක් ලෙස: GC ක්‍රියා කරන ආකාරය පිළිබඳ විස්තර ඉගෙන ගැනීමට ඔබ යා යුතුය ඇතුළත සහ පිටත, එවිට පමණක් ඔබ පිළිතුර දැන ගනු ඇත .

GC . භාවිතා කිරීම අර්ථවත් කරන එක් ආරක්ෂිත ස්ථානයක් තිබේ .

GC.Collect යනු ඔබට දේවල් පැතිකඩ කිරීම සඳහා භාවිතා කළ හැකි API එකකි. ප්‍රති al ල මඟ හැරෙන විට ඔබේ දෙවන ඇල්ගොරිතමයේ ජී.සී.

මේ ආකාරයේ පැතිකඩ යනු ඕනෑම කෙනෙකුට අතින් එකතු කිරීමට මා යෝජනා කරන එකම අවස්ථාවයි.


කෙසේ වෙතත් විවාදාත්මක උදාහරණය

භාවිතා කළ හැකි එක් අවස්ථාවක් නම්, ඔබ සැබවින්ම විශාල දේ පටවනවා නම්, ඒවා විශාල වස්තු ගොඩක කෙලින්ම Gen 2 වෙතට යනු ඇත, නමුත් නැවත Gen 2 දිගුකාලීන වස්තූන් සඳහා වන අතර එය අඩුවෙන් එකතු වේ. කිසියම් හේතුවක් නිසා ඔබ කෙටිකාලීන වස්තූන් Gen 2 වෙත පටවන බව ඔබ දන්නේ නම් , ඔබේ Gen 2 කුඩා කර තබා ගැනීම සඳහා ඔබට ඒවා ඉක්මණින් ඉවත් කළ හැකි අතර එය එකතු කිරීම වේගවත් වේ.

මට ඉදිරිපත් කළ හැකි හොඳම උදාහරණය මෙය වන අතර එය හොඳ නැත - ඔබ මෙහි ගොඩනඟන LOH පීඩනය වැඩි වාර ගණනක් එකතු කිරීමට හේතු වනු ඇත, සහ එකතු කිරීම් නිතර නිතර සිදු වේ - එය LOH ඉවත් කිරීමට ඉඩ ඇති අවස්ථා ඔබ තාවකාලික වස්තූන් සමඟ එය පුපුරවා හරින විට වේගයෙන්. GC ට වඩා හොඳ එකතු කිරීමේ සංඛ්‍යාතයක් ඇතැයි මම විශ්වාස නොකරමි - මට වඩා බොහෝ දක්ෂ පුද්ගලයින් විසින් සුසර කර ඇත .


එබැවින් .NET GC හි සමහර අර්ථකථන හා යාන්ත්‍රණ ගැන කතා කරමු ... හෝ ..

.NET GC ගැන මම දන්නවා යැයි සිතන සෑම දෙයක්ම

කරුණාකර, මෙහි වැරදි සොයා ගන්නා ඕනෑම අයෙක් - මාව නිවැරදි කරන්න. ග්‍රාම නිලධාරියාගෙන් බොහෝ දෙනෙක් කළු මැජික් බව ප්‍රකට ය. මා අවිනිශ්චිත තොරතුරු පිට කිරීමට උත්සාහ කරන අතරේ, සමහර විට මට සමහර දේවල් වැරදී ඇත.

පහත දැක්වෙන්නේ මා නොදන්නා බොහෝ තොරතුරු මෙන්ම මා නොදන්නා වඩා විශාල තොරතුරු සමූහයකි. ඔබේම අවදානමකින් මෙම තොරතුරු භාවිතා කරන්න.


GC සංකල්ප

.NET GC නොගැලපෙන වේලාවන්හිදී සිදු වේ, එබැවින් එය "නිර්ණායක නොවන" ලෙස හැඳින්වේ, මෙයින් අදහස් කරන්නේ ඔබට නිශ්චිත වේලාවක එය සිදුවීමට විශ්වාසය තැබිය නොහැකි බවයි. එය පරම්පරාගත කසළ එකතු කරන්නෙකු ද වන අතර එයින් අදහස් කරන්නේ ඔබේ වස්තූන් ඔවුන් ජීවත්වූ GC පාස් ගණනට කොටස් කරන බවයි.

Gen 0 ගොඩවල ඇති වස්තු එකතු 0 ක් හරහා ජීවත් වී ඇති අතර මේවා අලුතින් සාදන ලද අතර මෑතකදී ඒවා ස්ථාපනය කිරීමෙන් පසු කිසිදු එකතුවක් සිදුවී නොමැත. ඔබේ Gen 1 සංචයේ ඇති වස්තූන් එක් එකතු කිරීමේ මුරපදයක් හරහා ජීවත් වී ඇති අතර, ඒ හා සමානව ඔබේ Gen 2 ගොඩවල ඇති වස්තු එකතු කිරීමේ පාස් 2 ක් හරහා ජීවත් වී ඇත.

දැන් එය මෙම නිශ්චිත පරම්පරාවන් සහ කොටස් ඒ අනුව සුදුසුකම් ලැබීමට හේතුව සඳහන් කිරීම වටී. .NET GC විසින් හඳුනාගනු ලබන්නේ මෙම පරම්පරා තුන පමණි, මන්ද මෙම ගොඩවල් තුන ඉක්මවා යන එකතුකිරීම් සියල්ලම තරමක් වෙනස් ය. සමහර වස්තූන් එකතු කිරීම දහස් වාරයක් නොනැසී පැවතිය හැකිය. GC හුදෙක් මේවා Gen 2 ගොඩවල් කොටසේ අනෙක් පැත්තේ තබයි, ඒවා ඇත්ත වශයෙන්ම Gen 44 වන බැවින් ඒවා තවදුරටත් කොතැනක හෝ බෙදා හැරීමේ තේරුමක් නැත; ඒවා මත එකතු කිරීමේ අවසරය Gen 2 ගොඩවල ඇති සියල්ලටම සමාන වේ.

මෙම විශේෂිත පරම්පරාවන්ට අර්ථකථන අරමුණු මෙන්ම මේවාට ගරු කරන ක්‍රියාත්මක කරන ලද යාන්ත්‍රණ ද ඇත, මම මොහොතකට ඒවා ලබා ගනිමි.


එකතුවක ඇති දේ

GC එකතු කිරීමේ මුරපදයක මූලික සංකල්පය නම්, මෙම වස්තූන් සඳහා සජීවී යොමු කිරීම් (GC මූලයන්) තවමත් තිබේදැයි බැලීමට එය එක් එක් වස්තුව ගොඩවල් අවකාශයක පරීක්ෂා කිරීමයි. වස්තුවක් සඳහා GC root සොයාගත හොත්, එයින් අදහස් කරන්නේ දැනට ක්‍රියාත්මක වන කේතය තවමත් එම වස්තුව වෙත ළඟා වී භාවිතා කළ හැකි බැවින් එය මකා දැමිය නොහැකි බවයි. කෙසේ වෙතත්, වස්තුවක් සඳහා GC මූලයක් සොයාගත නොහැකි නම්, එයින් අදහස් වන්නේ ධාවන ක්‍රියාවලියට තවදුරටත් වස්තුව අවශ්‍ය නොවන බැවින් නව වස්තු සඳහා මතකය නිදහස් කිරීම සඳහා එය ඉවත් කළ හැකි බවයි.

දැන් එය අවසන් වූ පසු වස්තු පොකුරක් පිරිසිදු කර සමහරක් තනිවම තැබීමෙන් අවාසනාවන්ත අතුරු ආබාධයක් ඇති වනු ඇත: මියගිය අය ඉවත් කරන ලද සජීවී වස්තූන් අතර නිදහස් අවකාශ පරතරයන්. මෙම මතක ඛණ්ඩනය හුදකලා වුවහොත් හුදෙක් මතකය නාස්ති වනු ඇත, එබැවින් එකතු කිරීම් සාමාන්‍යයෙන් "සම්පීඩනය" යනුවෙන් හැඳින්වෙන දේ කරනු ඇත, එහිදී ඔවුන් ඉතිරිව ඇති සියලුම සජීවී වස්තූන් ගෙන ඒවා ගොඩවල් එකට මිරිකා ගනී. 0.

දැන් මතක ගොඩවල් 3 ක් පිළිබඳ අදහස ලබා දී ඇති අතර, ඒවා සියල්ලම ඔවුන් ජීවත් වී ඇති එකතු කිරීමේ පාස් ගණන අනුව කොටස් කර ඇත, මෙම කොටස් පවතින්නේ මන්ද යන්න ගැන කතා කරමු.


Gen 0 එකතුව

Gen 0 නිරපේක්ෂ නවතම වස්තූන් වීම ඉතා කුඩා වේ - එබැවින් ඔබට එය ආරක්ෂිතව නිතර එකතු කර ගත හැකිය . සංඛ්යාතය සංචය කුඩා බව සහතික කරන අතර එකතු කිරීම් ඉතා වේගවත් බැවින් ඒවා කුඩා ගොඩකට වඩා එකතු වේ. මෙය වැඩි වැඩියෙන් හෝ අඩුවෙන් පදනම් වී ඇත්තේ: ඔබ විසින් නිර්මාණය කරන ලද තාවකාලික වස්තූන්ගෙන් බහුතරයක් ඉතා තාවකාලික ය, එබැවින් තාවකාලික ඒවා තවදුරටත් භාවිතයට ගැනෙන්නේ නැත.


Gen 1 එකතුව

එබී නැති බව ජෙනරාල් 1 ආම්පන්න ඉතා වස්තූන් තාවකාලික ප්රවර්ගය තවමත් තරමක් කෙටි ජීවත් විය හැක, ම still- විශාල කොටසක් නිර්මාණය කිරීමට සඳහා භාවිතා නොවන විරුද්ධ නිසා. එම නිසා Gen 1 නිතර නිතර එකතු කරයි, නැවතත් එය ගොඩවල් කුඩා ලෙස තබා ගනිමින් එකතු කිරීම වේගවත් වේ. කෙසේ වෙතත් උපකල්පනය අඩු එය අඩු නිතර ජෙනරාල් වඩා එකතු එය ගේ වස්තු, ජෙනරාල්, 0 ට වඩා තාවකාලික 0

ඔවුන් එකතු කරන සංඛ්‍යාතය හැර වෙනත් කිසිවක් තිබේ නම්, ජෙනරල් 0 හි එකතු කිරීමේ අවසර පත්‍රය සහ ජෙනරල් 1 අතර වෙනස් වන තාක්ෂණික යාන්ත්‍රණ මම නොදනිමි.


Gen 2 එකතුව

ජෙනරල් 2 දැන් සියලු ගොඩවල් වල මව විය යුතුයි නේද? හොඳයි, ඔව්, එය අඩු හෝ වැඩි වශයෙන් නිවැරදි ය. ඔබගේ ස්ථිර වස්තූන් සියල්ලම වාසය කරන්නේ එයයි - Main()නිදසුනක් ලෙස ඔබේ ජීවිත වස්තුව , සහ සඳහන් කරන සෑම දෙයක්ම ඔබේ ක්‍රියාවලිය අවසානයේදී නැවත පැමිණෙන Main()තෙක් මුල් බැස ඇති බැවිනි Main().

Gen 2 යනු අනෙකුත් පරම්පරාවන්ට එකතු කර ගත නොහැකි සෑම දෙයක් සඳහාම බාල්දියක් බැවින්, එහි වස්තූන් බොහෝ දුරට ස්ථීර හෝ අවම වශයෙන් දිගු කලක් ජීවත් වේ. එබැවින් Gen 2 හි ඇති දේවලින් ඉතා සුළු ප්‍රමාණයක් හඳුනා ගැනීම ඇත්ත වශයෙන්ම එකතු කළ හැකි දෙයක් වනු ඇත, එයට නිතර එකතු කිරීමට අවශ්‍ය නොවේ. මෙමඟින් එය එකතු කිරීම මන්දගාමී වීමට ඉඩ සලසයි. එබැවින් මෙය මූලික වශයෙන් ඔවුන් අමුතු අවස්ථා සඳහා වන සියලු අමතර හැසිරීම් වලට සම්බන්ධ වී ඇත, මන්ද ඒවා ක්‍රියාත්මක කිරීමට ඔවුන්ට කාලය තිබේ.


විශාල වස්තු ගොඩවල්

Gen 2 හි අමතර හැසිරීම් වලට එක් උදාහරණයක් නම්, එය විශාල වස්තු සංචය මත එකතු කිරීම සිදු කරයි. මේ වන විට මම කුඩා වස්තු සංචය ගැන මුළුමනින්ම කතා කළෙමි, නමුත් .NET ධාවන කාලය නිශ්චිත ප්‍රමාණයේ දේවල් වෙනම ගොඩකට වෙන් කරයි. කුඩා වස්තු සංචය මත එකතු කිරීම් අවසන් වූ විට සංයුතිය සඳහා වස්තූන් චලනය කිරීම අවශ්‍ය වේ. Gen 1 හි ජීවමාන 10mb වස්තුවක් තිබේ නම්, එය එකතු කිරීමෙන් පසු සම්පීඩනය සම්පූර්ණ කිරීමට බොහෝ කාලයක් ගතවනු ඇත, එමඟින් Gen 1 හි එකතුව මන්දගාමී වේ. එම නිසා 10mb වස්තුව විශාල වස්තු සංචිතයට වෙන් කර ඇති අතර එය ඉතා කලාතුරකින් ධාවනය වන Gen 2 අතරතුර එකතු කරනු ලැබේ.


අවසන් කිරීම

තවත් උදාහරණයක් වන්නේ අවසන් කරන්නන් සහිත වස්තූන් ය. .NETs GC (කළමනාකරණය නොකළ සම්පත්) විෂය පථයෙන් ඔබ්බට සම්පත් යොමු කරන වස්තුවක් සඳහා ඔබ අවසාන කාරකයක් තබයි. කළමනාකරණය නොකළ සම්පතක් එක්රැස් කිරීම සඳහා GC වෙත ලැබෙන එකම ක්‍රමය අවසාන කාරකයයි - කළමනාකරණය නොකළ සම්පත ඔබේ ක්‍රියාවලියෙන් කාන්දු නොවන බවට වග බලා ගැනීම සඳහා අතින් එකතු කිරීම / ඉවත් කිරීම / මුදා හැරීම සිදු කිරීම සඳහා ඔබ ඔබේ අවසන් යන්ත්‍රය ක්‍රියාත්මක කරයි. GC විසින් ඔබේ වස්තූන් අවසන් කිරීමේ ක්‍රියාවලිය සිදු කළ විට, ඔබේ ක්‍රියාත්මක කිරීම මඟින් කළමනාකරණය නොකළ සම්පත ඉවත් කරනු ඇති අතර, සම්පත් කාන්දු වීමකින් තොරව ඔබේ වස්තුව ඉවත් කිරීමට GC සමත් වේ.

අවසන් කරන්නන් මෙය කරන යාන්ත්‍රණය වන්නේ අවසන් පෝලිම්වල කෙලින්ම යොමු කිරීමයි. ධාවන කාලය අවසන් වස්තුවක් සමඟ වස්තුවක් වෙන් කළ විට, එය එම වස්තුවට අවසන් පෝලිමට දර්ශකයක් එක් කරන අතර ඔබේ වස්තුව තැනින් තැන අගුලු දමයි (පින් කිරීම ලෙස හැඳින්වේ) එබැවින් සම්පීඩනය එය චලනය නොකරනු ඇත. එකතු කිරීමේ මුරපද සිදු වන විට, අවසානයේදී ඔබේ වස්තුව තවදුරටත් GC මූලයක් නොමැති බව සොයා ගනු ඇත, නමුත් එය එකතු කිරීමට පෙර අවසන් කිරීම ක්‍රියාත්මක කළ යුතුය. එබැවින් වස්තුව මිය ගිය විට, එකතුව විසින් එහි යොමු කිරීම අවසන් පෝලිමේ සිට ගෙන "ෆ්‍රීචබල්" පෝලිම් ලෙස හැඳින්වෙන දේ වෙත යොමු කිරීමක් කරනු ඇත. එකතු කිරීම දිගටම කරගෙන යයි. අනාගතයේ තවත් "නිර්ණායක නොවන" වේලාවක, ෆයිනලයිසර් නූල් ලෙස හැඳින්වෙන වෙනම නූලක් ෆ්‍රීචබල් පෝලිම් හරහා ගොස් යොමු කරන ලද එක් එක් වස්තුව සඳහා අවසාන සැකසුම් ක්‍රියාත්මක කරයි. එය අවසන් වූ පසු, නිදහස් කළ හැකි පෝලිම් හිස් වන අතර, එය අවසන් කිරීම අවශ්‍ය නොවන බව පවසන සෑම වස්තුවකම ශීර්ෂකය මත එය ටිකක් පෙරළී ඇත (මෙම බිට් එක අතින් පෙරළා දැමිය හැකියGC.SuppressFinalizeඑය Dispose()ක්‍රම වල පොදු වේ ), එය වස්තූන් ඉවත් කර ඇති බවට ද මම සැක කරමි , නමුත් ඒ ගැන මා උපුටා දක්වන්න එපා. මෙම වස්තුව ඇති ඕනෑම ගොඩක් මතට එන ඊළඟ එකතුව අවසානයේ එය එකතු කරයි. Gen 0 එකතුකිරීම් මඟින් අවසන් කිරීමට අවශ්‍ය බිට් ඔන් කර ඇති වස්තූන් කෙරෙහි පවා අවධානය යොමු නොකරයි, එය ස්වයංක්‍රීයව ඒවා ප්‍රවර්ධනය කරයි. ජෙනරල් 1 හි අවසන් කිරීම අවශ්‍ය නොවන වස්තුවක් FReachableපෝලිමේ විසි කරනු ඇත, නමුත් එකතුව ඒ සමඟ වෙනත් කිසිවක් නොකරයි, එබැවින් එය ජෙනරල් 2 වෙත ජීවත් වේ. මේ ආකාරයෙන්, අවසන්කරණයක් ඇති සියලුම වස්තූන්, සහ එසේ නොකරන්න GC.SuppressFinalizeGen 2 හි එකතු කරනු ලැබේ.


4
@FlorianMargaine ඔව් ... සියලු ක්‍රියාත්මක කිරීම් හරහා "GC" ගැන කිසිවක් පැවසීම ඇත්තෙන්ම තේරුමක් නැත ..
ජිමී හොෆා

10
tl; dr: ඒ වෙනුවට වස්තු තටාක භාවිතා කරන්න.
රොබට් හාවි

5
tl; dr: වේලාව / පැතිකඩ සඳහා එය ප්‍රයෝජනවත් වේ.
kutschkem

3
The යාන්ත්‍ර විද්‍යාව පිළිබඳ මගේ විස්තරය කියවීමෙන් පසු (මම ඒවා තේරුම් ගත් පරිදි), ඔබ දකින පරිදි එහි ඇති ප්‍රයෝජනය කුමක්ද? ඔබ වස්තූන් විශාල ප්‍රමාණයක් පිරිසිදු කරයි - SOH (හෝ LOH?) තුළ? මෙම එකතුව සඳහා ඔබ වෙනත් නූල් විරාමයක් ලබා දුන්නාද? එම එකතුව ජෙනරල් 2 ට වඩා දෙගුණයක් වස්තු ප්‍රවර්ධනය කළාද? එකතු කිරීම LOH මත සම්පිණ්ඩනය වීමට හේතු වී තිබේද (ඔබ එය සක්‍රිය කර තිබේද?)? ඔබ සතුව GC ගොඩවල් කීයක් තිබේද සහ ඔබේ GC සේවාදායකයේ හෝ ඩෙස්ක්ටොප් මාදිලියේ තිබේද? ජී.සී. යනු අයිස් බර්ග් ය, ද්‍රෝහිකම ජලයට පහළින් ය. පැහැදිලිව බලන්න. සුවපහසු ලෙස එකතු කිරීමට තරම් මම දක්ෂ නැත.
ජිමී හොෆා

4
Ob රොබට් හාර්වි වස්තු තටාක රිදී උණ්ඩයක් ද නොවේ. කසළ එකතු කරන්නාගේ පරම්පරාව 0 දැනටමත් effectively ලදායි ලෙස වස්තු සංචිතයකි - එය සාමාන්‍යයෙන් කුඩාම හැඹිලි මට්ටමට සරිලන තරමට ප්‍රමාණවත් වන අතර එමඟින් නව වස්තූන් සාමාන්‍යයෙන් හැඹිලියේ ඇති මතකයේ නිර්මාණය වේ. ඔබගේ වස්තු සංචිතය දැන් හැඹිලිය සඳහා GC හි තවානට එරෙහිව තරඟ වදින අතර, GC හි තවාන් වල එකතුව සහ ඔබේ තටාකය හැඹිලියට වඩා විශාල නම් ඔබට පැහැදිලිවම හැඹිලි මඟ හැරෙනු ඇත. ඔබ සමාන්තරකරණය භාවිතා කිරීමට අදහස් කරන්නේ නම් දැන් ඔබට සමමුහුර්තකරණය නැවත ක්‍රියාත්මක කළ යුතු අතර ව්‍යාජ බෙදාගැනීම් ගැන කරදර විය යුතුය.
ඩොවල්

68

කනගාටුවට කරුණක් නම්, එවැනි කිසිවෙකු එවැනි සිදුවීම් මොනවාද යන්න විස්තර නොකරයි.

මම උදාහරණ කිහිපයක් දෙන්නම්. GC ට බල කිරීම හොඳ අදහසක් නමුත් එය මුළුමනින්ම වටී. මෙම පිළිතුර .NET සහ GC සාහිත්‍යය පිළිබඳ මගේ අත්දැකීම් වලින්. එය වෙනත් වේදිකාවලට හොඳින් සාමාන්‍යකරණය කළ යුතුය (අවම වශයෙන් සැලකිය යුතු GC ඇති ඒවා).

  • විවිධ වර්ගවල මිණුම් සලකුණු. මිණුම් දණ්ඩක් ආරම්භ වන විට දන්නා කළමනාකරණ ගොඩවල් තත්වයක් ඔබට අවශ්‍ය වන අතර එමඟින් මිණුම් සලකුණු අතරතුර GC අහඹු ලෙස අවුලුවන්නේ නැත. ඔබ මිණුම් ලකුණක් පුනරාවර්තනය කරන විට, එක් එක් පුනරාවර්තනයේ දී එකම සංඛ්‍යා හා GC වැඩ ප්‍රමාණය ඔබට අවශ්‍ය වේ.
  • හදිසියේම සම්පත් නිදහස් කිරීම. උදාහරණයක් ලෙස සැලකිය යුතු GUI කවුළුවක් වැසීම හෝ හැඹිලියක් නැවුම් කිරීම (එමඟින් පැරණි විශාල හැඹිලි අන්තර්ගතයන් මුදා හැරීම). GC හට මෙය හඳුනාගත නොහැක, මන්ද ඔබ කරමින් සිටින්නේ ශුන්‍යයට යොමු කිරීමක් පමණි. මෙම වස්තූන් ප්‍රස්ථාරය සමස්ත වස්තු ප්‍රස්ථාරයක් පහසුවෙන් හඳුනාගත නොහැකිය.
  • කාන්දු නොවූ කළමනාකරණය නොකළ සම්පත් නිදහස් කිරීම . ඇත්ත වශයෙන්ම මෙය කිසි විටෙකත් සිදු නොවිය යුතුය, නමුත් තෙවන පාර්ශවීය පුස්තකාලයක් (COM වස්තු වැනි) දේවල් කාන්දු වූ අවස්ථා මම දැක ඇත්තෙමි. සමහර විට එකතුවක් ඇති කිරීමට සංවර්ධකයාට බල කෙරුනි.
  • ක්‍රීඩා වැනි අන්තර්ක්‍රියාකාරී යෙදුම් . ක්‍රීඩා ක්‍රීඩා වලදී එක් රාමුවකට ඉතා දැඩි කාල අයවැයක් ඇත (එක් රාමුවකට 60Hz => 16ms). හිකප් වළක්වා ගැනීම සඳහා ඔබට GC සමඟ ගනුදෙනු කිරීමට උපාය මාර්ගයක් අවශ්‍ය වේ. එවැනි එක් උපක්‍රමයක් නම් G2 GC යන් හැකිතාක් ප්‍රමාද කිරීම සහ පැටවීමේ තිරයක් හෝ කැපුම් දර්ශනයක් වැනි සුදුසු වේලාවක ඒවාට බල කිරීමයි. එවැනි හොඳම මොහොත කවදාදැයි GC හට දැනගත නොහැක.
  • සාමාන්‍යයෙන් ගුප්ත පාලනය . සමහර වෙබ් යෙදුම් GC අක්‍රීය කර වරින් වර G2 එකතුවක් ධාවනය කරන අතර බර බැලන්සර් භ්‍රමණයෙන් ඉවත් වේ. ඒ ආකාරයෙන් G2 ප්‍රමාදය කිසි විටෙකත් පරිශීලකයාට මතු නොවේ.

ඔබේ ඉලක්කය ප්‍රති put ල නම් දුර්ලභ GC වඩා හොඳය. එවැනි අවස්ථාවන්හිදී එකතුවකට බල කිරීම ධනාත්මක බලපෑමක් ඇති කළ නොහැක (සජීවී ඒවාට සම්බන්ධ වී ඇති මළ වස්තූන් ඉවත් කිරීමෙන් CPU හැඹිලි භාවිතය වැඩි කිරීම වැනි තරමක් ව්‍යාකූල ගැටළු හැර). මා දන්නා සියලුම එකතුකරන්නන් සඳහා කණ්ඩායම් එකතු කිරීම වඩාත් කාර්යක්ෂම වේ. ස්ථාවර තත්වයේ මතක පරිභෝජනයෙහි නිෂ්පාදන යෙදුම සඳහා GC එකක් ප්‍රේරණය කිරීම උදව් නොකරයි.

ඉහත දක්වා ඇති උදාහරණ ඉලක්කගත අනුකූලතාව සහ මතක භාවිතයේ සීමාව. එවැනි අවස්ථා වලදී GC වලට ප්‍රේරණය කිරීම අර්ථවත් කළ හැකිය.

GC යනු දිව්‍යමය වස්තුවක් බව පුළුල් ලෙස පැතිරී ඇති අදහසක් ඇති බව පෙනේ. මා දන්නා කිසිදු GC එකක් නවීන නොවන අතර ඇත්ත වශයෙන්ම GC සඳහා ප්‍රශස්ත වීම ඉතා අපහසුය. සංවර්ධකයාට වඩා අඩුවෙන් GC දනී. එහි විචල්‍යතාවයන් පදනම් වී ඇත්තේ මතක කවුන්ටර සහ එකතු කිරීමේ වේගය වැනි දේ මත ය. හියුරිස්ටික්ස් සාමාන්‍යයෙන් හොඳයි, නමුත් කළමනාකරණ මතකයේ විශාල ප්‍රමාණයක් මුදා හැරීම වැනි යෙදුම් හැසිරීම් වල හදිසි වෙනස්කම් ඔවුන් ග්‍රහණය නොකරයි. කළමනාකරණය නොකළ සම්පත් සහ ප්‍රමාද අවශ්‍යතා සඳහා ද එය අන්ධ ය.

සටහන, GC පිරිවැය ගොඩවල් ප්‍රමාණය හා ගොඩවල් පිළිබඳ යොමු ගණන අනුව වෙනස් වේ. කුඩා ගොඩක් මත පිරිවැය ඉතා කුඩා විය හැකිය. 1GB ගොඩවල් ප්‍රමාණයක් සහිත නිෂ්පාදන යෙදුමක තත්පර 1-2GB / .NET 4.5 සමඟ G2 එකතු කිරීමේ අනුපාත මම දැක ඇත්තෙමි.


ප්‍රමාද පාලක නඩුව සඳහා, වරින් වර මෙය කරනවා වෙනුවට, ඔබට අවශ්‍යතාවය අනුව එය කළ හැකිය (එනම් මතක භාවිතය යම් සීමාවකට වඩා වැඩෙන විට).
Paŭlo Ebermann

3
දෙවන සිට අවසාන ඡේදය සඳහා +1. සමහර පුද්ගලයින්ට සම්පාදකයින් පිළිබඳ එකම හැඟීමක් ඇති අතර ඕනෑම දෙයක් පාහේ "නොමේරූ ප්‍රශස්තකරණය" ලෙස හැඳින්වීමට ඉක්මන් වේ. මම සාමාන්‍යයෙන් ඒ හා සමාන දෙයක් ඔවුන්ට කියමි.
හොන්සා බ්‍රෙබෙක්

2
එම ඡේදය සඳහා +1 ද වේ. වෙනත් අයෙකු විසින් ලියන ලද පරිගණක වැඩසටහනක් තම වැඩසටහනේ කාර්ය සාධන ලක්ෂණ තමන්ට වඩා හොඳින් තේරුම් ගත යුතු යැයි මිනිසුන් සිතීම කම්පනයකි.
user541686

1
OnHonzaBrabec මෙම අවස්ථා දෙකෙහිම ගැටලුව එක හා සමානයි: ඔබ GC හෝ සම්පාදකයාට වඩා හොඳින් දන්නවා යැයි ඔබ සිතන්නේ නම් , එවිට ඔබටම රිදවීම ඉතා පහසුය. ඔබ සැබවින්ම වැඩි යමක් දන්නේ නම්, ඔබ ප්‍රශස්තිකරණය කරන්නේ එය නොමේරූ නොවන බව ඔබ දැනගත් විට පමණි.
svick

27

සාමාන්‍ය මූලධර්මයක් ලෙස, කසළ එකතු කරන්නෙකු එය "මතක පීඩනය" කරා දිවෙන විට එකතු කරනු ඇති අතර, ඔබේ කාර්ය සාධනය පිළිබඳ ගැටළු හෝ ඔබේ වැඩසටහන ක්‍රියාත්මක කිරීමේදී සැලකිය යුතු විරාමයන් ඇතිවිය හැකි බැවින් එය වෙනත් වේලාවක එකතු නොකිරීම හොඳ අදහසකි. ඇත්ත වශයෙන්ම, පළමු කරුණ දෙවැන්න මත රඳා පවතී: පරම්පරාගත කසළ එකතු කරන්නෙකු සඳහා, අවම වශයෙන්, එය වඩා කාර්යක්ෂමව ධාවනය වන්නේ හොඳ වස්තූන් සඳහා කසළ අනුපාතය වැඩි වන හෙයිනි, එම නිසා වැඩසටහන විරාමය ගත කරන කාලය අවම කිරීම සඳහා , එය කල් දැමිය යුතු අතර හැකි තරම් කසළ ගොඩ ගැසීමට ඉඩ දිය යුතුය.

කසළ එකතු කරන්නාට අතින් ආයාචනා කිරීමට සුදුසු කාලය නම්, ඔබ යම් දෙයක් කර අවසන් වූ පසු 1) කසළ ගොඩක් නිර්මාණය වීමට ඉඩ ඇති අතර, 2) පරිශීලකයා යම් කාලයක් ගතවනු ඇතැයි අපේක්ෂා කරන අතර පද්ධතිය ප්‍රතිචාර නොදක්වයි කෙසේ හෝ වේවා. සම්භාව්‍ය උදාහරණයක් වන්නේ විශාල දෙයක් පැටවීම අවසානයේ (ලේඛනයක්, ආකෘතියක්, නව මට්ටමක් යනාදිය)


12

කිසිවෙකු සඳහන් නොකළ එක් දෙයක් නම්, වින්ඩෝස් ජීසී විශ්මයජනක ලෙස හොඳ වුවත්, එක්ස්බොක්ස් හි ජීසී යනු කුණු කසළ (පුන් අදහස්) .

එබැවින් එක්ස්බොක්ස් මත ධාවනය කිරීමට අදහස් කරන එක්ස්එන්ඒ ක්‍රීඩාවක් කේතනය කිරීමේදී, කසළ එකතු කිරීම අවස්ථාවාදී අවස්ථාවන්ට අතිශයින්ම වැදගත් වේ, නැතහොත් ඔබට භයානක වරින් වර එෆ්පීඑස් ඉක්කාව ලැබෙනු ඇත. මීට අමතරව, එක්ස්බොක්ස් හි structකසළ එකතු කිරීමට අවශ්‍ය වස්තූන් ගණන අවම කිරීම සඳහා ඔබ සාමාන්‍යයෙන් වඩා බොහෝ විට ක්‍රම භාවිතා කිරීම සාමාන්‍ය දෙයකි .


4

කසළ එකතු කිරීම පළමු හා ප්‍රධාන වශයෙන් මතක කළමනාකරණ මෙවලමකි. එනිසා මතක පීඩනය ඇති විට කසළ එකතු කරන්නන් එකතු වේ.

නවීන කසළ එකතු කරන්නන් ඉතා හොඳයි, සහ හොඳ අතට හැරේ, එබැවින් ඔබට අතින් එකතු කිරීමෙන් ඒවා වැඩිදියුණු කළ හැකිය. ඔබට අද දින දේවල් වැඩිදියුණු කළ හැකි වුවද, ඔබ තෝරාගත් කසළ එකතු කරන්නාගේ අනාගත වැඩිදියුණු කිරීමක් මඟින් ඔබේ ප්‍රශස්තිකරණය අකාර්යක්ෂම හෝ ප්‍රති p ලදායක වනු ඇත.

කෙසේ වෙතත් , කසළ එකතු කරන්නන් සාමාන්‍යයෙන් මතකය හැර වෙනත් සම්පත් භාවිතය ප්‍රශස්ත කිරීමට උත්සාහ නොකරති. කසළ එකතු කරන ලද පරිසරයන් තුළ, බොහෝ වටිනා මතක නොවන සම්පත් වලට closeක්‍රමයක් හෝ ඊට සමාන ක්‍රමයක් ඇත, නමුත් පවතින API සමඟ අනුකූල වීම වැනි කිසියම් හේතුවක් නිසා මෙය එසේ නොවන අවස්ථා තිබේ.

මෙම අවස්ථා වලදී වටිනා මතක නොවන සම්පතක් භාවිතා කරන බව ඔබ දන්නා විට කසළ එකතු කිරීම අතින් සිදු කිරීම අර්ථවත් විය හැකිය.

ආර්එම්අයි

මේ සඳහා එක් ස්ථිර උදාහරණයක් වන්නේ ජාවාහි දුරස්ථ ක්‍රම ආයාචනයයි. RMI යනු දුරස්ථ ක්‍රියා පටිපාටි ඇමතුම් පුස්තකාලයකි. ඔබට සාමාන්‍යයෙන් සේවාදායකයක් ඇත, එමඟින් සේවාදායකයින්ට විවිධ වස්තූන් ලබා ගත හැකිය. කිසියම් සේවාදායකයකු විසින් වස්තුවක් භාවිතා නොකරන බව සේවාදායකයෙක් දන්නේ නම්, එම වස්තුව කසළ එකතු කිරීම සඳහා සුදුසුකම් ලබයි.

කෙසේ වෙතත්, සේවාදායකයා මෙය දන්නා එකම ක්‍රමය වන්නේ සේවාදායකයා එය පැවසුවහොත් පමණක් වන අතර සේවාදායකයා සේවාදායකයාට පවසන්නේ වස්තුවක් අවශ්‍ය නොවන බවයි.

මෙය ගැටළුවක් ඉදිරිපත් කරයි, සේවාදායකයාට නිදහස් මතකයක් ඇති බැවින් කසළ එකතු කිරීම නිතර ක්‍රියාත්මක නොවනු ඇත. මේ අතර, සේවාදායකයාට මතකයේ භාවිතයට නොගත් වස්තු රාශියක් තිබිය හැක, එය එකතු කළ නොහැකි වන්නේ සේවාදායකයා ඒවා භාවිතා නොකරන බව නොදන්නා බැවිනි.

RMI හි ඇති විසඳුම වන්නේ සේවාදායකයාට කසළ එකතු කිරීම වරින් වර ක්‍රියාත්මක කිරීම, එය මතකය රහිතව තිබියදීත්, සේවාදායකයේ වස්තු ක්ෂණිකව එකතු වන බව සහතික කිරීමයි.


"මෙම අවස්ථා වලදී වටිනා මතක නොවන සම්පතක් භාවිතා කරන බව ඔබ දැනගත් විට කසළ එකතු කිරීම අතින් සිදු කිරීම අර්ථවත් විය හැකිය" - මතක නොවන සම්පතක් භාවිතා කරන්නේ නම් ඔබ usingබ්ලොක් එකක් භාවිතා කළ යුතුය Close. හැකි ඉක්මනින් සම්පත් ඉවතලන බවට සහතික වන්න. මතක නොවන සම්පත් පිරිසිදු කිරීම සඳහා GC මත යැපීම විශ්වාස කළ නොහැකි අතර, සියලු ආකාරයේ ගැටළු ඇති කරයි (විශේෂයෙන් ප්‍රවේශය සඳහා අගුළු දැමිය යුතු ලිපිගොනු සමඟ විවෘත කළ හැක්කේ එක් වරක් පමණි).
ජූල්ස්

පිළිතුරෙහි සඳහන් කර ඇති පරිදි, closeක්‍රමවේදයක් ඇති විට (හෝ සම්පත usingබ්ලොක් එකක් සමඟ භාවිතා කළ හැකිය ), මේවා නිවැරදි ප්‍රවේශයයි. පිළිතුර විශේෂයෙන් මෙම යාන්ත්‍රණයන් නොමැති දුර්ලභ අවස්ථාවන් සමඟ කටයුතු කරයි.
ජේම්ස්_පික්

මගේ පුද්ගලික මතය නම්, මතකය නොවන සම්පතක් කළමනාකරණය කරන නමුත් සමීප ක්‍රමයක් ලබා නොදෙන ඕනෑම අතුරු මුහුණතක් භාවිතා නොකළ යුතු අතුරු මුහුණතක් වන බැවින් එය විශ්වාසදායක ලෙස භාවිතා කිරීමට ක්‍රමයක් නොමැති බැවිනි.
ජූල්ස්

ජූල්ස් මම එකඟයි, නමුත් සමහර විට එය වැළැක්විය නොහැකිය. සමහර විට වියුක්ත කිරීම් කාන්දු වන අතර, සාරාංශයක් භාවිතා නොකිරීමට වඩා කාන්දු වියුක්තයක් භාවිතා කිරීම වඩා හොඳය. සමහර විට ඔබට තබා ගත නොහැකි බව ඔබ දන්නා පොරොන්දු ලබා දෙන ලෙස ඉල්ලා සිටින උරුම කේතය සමඟ වැඩ කිරීමට ඔබට අවශ්‍ය වේ. ඔව්, එය දුර්ලභ වන අතර, හැකි නම් එය වළක්වා ගත යුතු අතර, කසළ එකතු කිරීමට බල කිරීම සම්බන්ධයෙන් මේ සියලු අනතුරු ඇඟවීම් ඇති බවට හේතුවක් තිබේ, නමුත් මෙම තත්වයන් මතු වන අතර, OP විසින් මෙම තත්වයන් කෙබඳුදැයි විමසීය - මම පිළිතුරු දුන් .
ජේම්ස්_පික්

2

හොඳම ක්‍රමය වන්නේ බොහෝ අවස්ථාවල කසළ එකතු කිරීමට බල නොකිරීමයි. .

එහි වේ අවස්ථා කිහිපයක විට ඔබ මතක භාවිතය ගැන තවත් දැනගන්න පසුව කුණු එකතු කරන්නේ නැහැ. බහු පරිශීලක යෙදුමක හෝ වරකට එක් ඉල්ලීමකට වඩා ප්‍රතිචාර දක්වන සේවාවක මෙය සත්‍යයක් විය නොහැක.

කෙසේ වෙතත් සමහර කණ්ඩායම් වර්ග සැකසුම් වලදී ඔබ GC ගැන වැඩි යමක් දනී. උදා: යෙදුමක් සලකා බලන්න.

  • විධාන රේඛාවේ ගොනු නාම ලැයිස්තුවක් ලබා දී ඇත
  • තනි ගොනුවක් සකසා ප්‍රති result ල ගොනුවකට ලියන්න.
  • ගොනුව සැකසීමේදී, ගොනුවේ සැකසුම් සම්පුර්ණ වන තෙක් එකතු කළ නොහැකි අන්තර් සම්බන්ධිත වස්තු රාශියක් නිර්මාණය කරයි (උදා: විග්‍රහ ගසක්)
  • එය සැකසූ ලිපිගොනු අතර ගැලපෙන තත්වය තබා නොගනී .

ඔබ විය හැක ඔබ එක් එක් ගොනුව සැකසීමට පසු ඔබ සම්පූර්ණ කැළි කසළ බල කළ යුතු බව පරීක්ෂා (ප්රවේශම් පසු) නඩු කිරීමට හැකි වනු.

තවත් අවස්ථා වන්නේ සමහර අයිතම සැකසීමට සෑම මිනිත්තු කිහිපයකට වරක් අවදි වන සේවාවක් වන අතර එය නිදා සිටියදී කිසිදු රාජ්‍යයක් තබා නොගනී . එවිට පමණක් නින්ද යාමට පෙර සම්පූර්ණ එකතුව බල හැක වටනේය.

එකතුවක් බල කිරීම සඳහා මා සලකා බැලිය යුතු එකම අවස්ථාව වන්නේ මෑතකදී විශාල වස්තුවක් නිර්මාණය වී ඇති බවත්, දැනට සඳහන් කර ඇත්තේ ඉතා සුළු වස්තූන් ප්‍රමාණයක් බවත් ය.

GC එකකට මගේම බල කිරීමකින් තොරව මේ ආකාරයේ දේවල් ගැන ඉඟි ලබා දිය හැකි විට මට කුණු එකතු කිරීමේ API එකක් තිබේ.

ද බලන්න " රිකෝ Mariani ගේ කාර්ය සාධන Tidbits "


2

ඔබට gc () ඔබම ඇමතීමට අවශ්‍ය අවස්ථා කිහිපයක් තිබේ.

  • [ සමහර අය පවසන්නේ මෙය හොඳ නොවන බැවින් එය පරණ පරම්පරාවේ අවකාශයට වස්තූන් ප්‍රවර්ධනය කළ හැකි නිසා එය හොඳ දෙයක් නොවන බවයි. කෙසේ වෙතත්, සෑම විටම ප්‍රවර්ධනය කළ හැකි වස්තූන් ඇති බව සැමවිටම සත්‍ය නොවේ . මෙම gc()ඇමතුමෙන් පසුවද , පරණ පරම්පරාවේ අවකාශයට ගෙනයාමට ඉඩ නොදී ඉතා සුළු වස්තූන් ඉතිරිව ඇති බව නිසැකය. ] ඔබ විශාල වස්තු එකතුවක් නිර්මාණය කිරීමට සහ මතකය විශාල ප්‍රමාණයක් භාවිතා කිරීමට යන විට. ඔබට අවශ්‍ය වන්නේ හැකි තරම් සූදානම් වීමේ ඉඩ ප්‍රමාණය ඉවත් කිරීමට ය. මෙය සාමාන්‍ය බුද්ධියකි. gc()අතින් ඇමතීමෙන් , ඔබ මතකයට පටවන විශාල වස්තු එකතුවක අතිරික්ත යොමු ප්‍රස්ථාර පරීක්ෂාවක් සිදු නොවේ. කෙටියෙන් කිවහොත්, ඔබ gc()මතකයට ගොඩක් පැටවීමට පෙර ධාවනය කරන්නේ නම් ,gc() පැටවීමේදී ප්‍රේරණය වන විට අවම වශයෙන් එක් වරක්වත් මතක පීඩනය නිර්මාණය වේ.
  • ඔබ විශාල එකතුවක් පැටවීම අවසන් කළ විටමහාවස්තූන් සහ ඔබ බොහෝ වස්තු මතකයට පටවනු ඇත. කෙටියෙන් කිවහොත්, ඔබ අදියර නිර්මාණය කිරීමේ සිට අදියර භාවිතා කිරීම දක්වා ගමන් කරයි. gc()ක්‍රියාත්මක කිරීම මත පදනම්ව ඇමතීමෙන්, භාවිතා කරන මතකය සංයුක්ත වන අතර එමඟින් හැඹිලි ප්‍රදේශය විශාල වශයෙන් වැඩි දියුණු වේ. මෙය පැතිකඩෙන් ඔබට නොලැබෙන කාර්ය සාධනයෙහි විශාල දියුණුවක් ඇති කරයි.
  • පළමු එකට සමාන ය, නමුත් ඔබ එසේ කරන්නේ නම් gc()සහ මතක කළමනාකරණ ක්‍රියාත්මක කිරීම සහාය දක්වන්නේ නම්, ඔබේ භෞතික මතකය සඳහා වඩා හොඳ අඛණ්ඩතාවයක් ඔබ නිර්මාණය කරනු ඇත. මෙය නැවතත් නව විශාල වස්තු එකතුවක් අඛණ්ඩව හා සංයුක්ත කරවන අතර එමඟින් කාර්ය සාධනය වැඩි කරයි

1
පහත වැටීමට හේතුව යමෙකුට පෙන්වා දිය හැකිද? පිළිතුර විනිශ්චය කිරීමට තරම් මා දන්නේ නැත (බැලූ බැල්මට එය මට තේරුමක් ඇත).
ඔමේගා

1
මම හිතන්නේ ඔබට තුන්වෙනි කාරණය සඳහා අඩු අගයක් ලැබුණා. "මෙය සාමාන්‍ය බුද්ධියක්" යැයි පැවසීමටද ඉඩ ඇත.
user253751

2
ඔබ විශාල වස්තු එකතුවක් නිර්මාණය කරන විට, එකතුවක් අවශ්‍ය බව දැන ගැනීමට GC දක්ෂ විය යුතුය. මතකය සංයුක්ත කිරීමට අවශ්‍ය වූ විටත් එසේමය. ආශ්‍රිත වස්තූන්ගේ මතක ප්‍රදේශය ප්‍රශස්ත කිරීම සඳහා GC මත යැපීම සැබෑවක් නොවේ. මම හිතන්නේ ඔබට වෙනත් විසඳුම් සොයාගත හැකිය (struct, අනාරක්ෂිත, ...). (මම පහත් තැනැත්තා නොවේ).
ගුයිලූම්

3
නියම වේලාවක් පිළිබඳ ඔබේ පළමු අදහස මගේ මතය අනුව නරක උපදෙස් පමණි. මෑතකදී එකතුවක් තිබීමට ඇති ඉඩකඩ වැඩිය, එබැවින් නැවත එකතු කිරීමට ඔබ දරන උත්සාහය හුදෙක් පසු පරම්පරාවන්ට අත්තනෝමතික ලෙස වස්තූන් ප්‍රවර්ධනය කිරීමට යන අතර එය සෑම විටම පාහේ නරක ය. පසු පරම්පරාවන්ට එකතු කිරීමට ඇති අතර ඒවා ආරම්භ කිරීමට වැඩි කාලයක් ගත වන අතර ඒවායේ ගොඩවල් ප්‍රමාණය වැඩි කිරීමෙන් “හැකි තරම් ඉඩ ප්‍රමාණයක් ඉවත් කිරීම” වැඩි කිරීමෙන් මෙය වඩාත් ගැටලු සහගත වේ. ප්ලස් ඔබ බරක් සමඟ මතක පීඩනය වැඩි කිරීමට සූදානම් නම්, ඔබ කෙසේ හෝ එකතු කිරීම ආරම්භ කිරීමට ඉඩ ඇත, එය මන්දගාමීව ක්‍රියාත්මක වනු ඇත Gen1 / 2 වැඩි වීම නිසා
ජිමී හොෆා

2
By calling gc() depending on implementation, the memory in used will be compacted which massively improves cache locality. This will result in massive improve in performance that you will not get from profiling.ඔබ වස්තූන් ටොන් ගණනක් පේළියකට වෙන් කළහොත් ඒවා දැනටමත් සංයුක්ත වී ඇත. ඕනෑම දෙයක් නම්, කසළ එකතු කිරීම ඒවා තරමක් දුරට මාරු කළ හැකිය. කෙසේ වෙතත්, data න සහ අහඹු ලෙස මතකයේ පැන නොයන දත්ත ව්‍යුහයන් භාවිතා කිරීම විශාල බලපෑමක් ඇති කරයි. ඔබ එක්-මූලද්‍රව්‍ය-එක්-නෝඩ් සම්බන්ධිත ලැයිස්තුවක් භාවිතා කරන්නේ නම්, ඒ සඳහා අතින් GC උපක්‍රම ප්‍රමාණවත් නොවේ.
ඩොවල්

2

සැබෑ ලෝක උදාහරණයක්:

කලාතුරකින් වෙනස් වූ සහ ඉතා ඉක්මණින් ප්‍රවේශ විය යුතු ඉතා විශාල දත්ත සමූහයක් භාවිතා කළ වෙබ් යෙදුමක් මා සතුව තිබුණි (AJAX හරහා එක් යතුරු එබීමේ ප්‍රතිචාරයක් සඳහා ඉක්මන්).

මෙහි කළ යුතු පැහැදිලි දෙය නම් අදාළ ප්‍රස්ථාරය මතකයට පටවා දත්ත ගබඩාවට වඩා එතැනින් ප්‍රවේශ වීම, ඩීබී වෙනස් වන විට ප්‍රස්ථාරය යාවත්කාලීන කිරීමයි.

නමුත් ඉතා විශාල නම්, අනාගතයේ දී වර්ධනය වීමට නියමිත දත්ත සමඟ අවම බරක් අවම වශයෙන් 6GB මතකයක් ගතවනු ඇත. (මට නිශ්චිත සංඛ්‍යා නොමැත, වරක් මගේ 2GB යන්ත්‍රය අවම වශයෙන් 6GB සමඟ සාර්ථකව කටයුතු කිරීමට උත්සාහ කරන බව පැහැදිලි වූ විට එය ක්‍රියාත්මක නොවන බව දැන ගැනීමට අවශ්‍ය සියලු මිනුම් මා සතුව තිබුණි).

වාසනාවකට මෙන්, මෙම දත්ත කට්ටලය තුළ පොප්සිකල්-වෙනස් කළ නොහැකි වස්තූන් විශාල ප්‍රමාණයක් එකිනෙකට සමාන විය; එක්තරා කණ්ඩායමක් තවත් කණ්ඩායමකට සමාන බව මා විසින් සොයා බැලූ පසු, එක් දත්තයක් අනෙකාට අන්වර්ථයක් ලෙස දත්ත විශාල ප්‍රමාණයක් රැස් කිරීමට ඉඩ සලසයි.

සියල්ල හොඳයි සහ හොඳයි, නමුත් මේ සඳහා මිනිත්තු භාගයක පමණ කාලයක් තුළ 6GB වස්තූන් හරහා මෙම තත්වයට පත්වේ. තමන්ගේම වමට හැරී ගියත්, GC එයට මුහුණ දුන්නේ නැත. යෙදුමේ සුපුරුදු රටාවට වඩා ක්‍රියාකාරිත්වයේ වැඩි වීම (තත්පරයට ගනුදෙනු කිරීම සඳහා වඩා අඩු බරක්) ඉතා තියුණු විය.

එබැවින් GC.Collect()මෙම ගොඩනැඟීමේ ක්‍රියාවලිය අතරතුර වරින් වර ඇමතීමෙන් අදහස් කළේ සියල්ලම සුමටව ක්‍රියාත්මක වන බවයි. ඇත්ත වශයෙන්ම, GC.Collect()යෙදුම ක්‍රියාත්මක වන ඉතිරි කාලය මම අතින් ඇමතුවේ නැත .

මෙම තාත්වික සිද්ධිය අප භාවිතා කළ යුත්තේ කවදාද යන්න පිළිබඳ මාර්ගෝපදේශ සඳහා හොඳ උදාහරණයකි GC.Collect():

  1. එකතු කිරීම සඳහා ලබා දී ඇති වස්තූන් විශාල ප්‍රමාණයක් සාපේක්ෂව දුර්ලභ අවස්ථාවක් සමඟ භාවිතා කරන්න (මෙගාබයිට් වටිනාකමක් ලබා දී ඇති අතර, මෙම ප්‍රස්ථාර ගොඩනැගිල්ල යෙදුමේ ජීවිත කාලය පුරාම ඉතා දුර්ලභ අවස්ථාවකි (සතියකට මිනිත්තුවක් පමණ).
  2. කාර්ය සාධනයේ අලාභයක් සාපේක්ෂව දරාගත හැකි විට එය කරන්න; මෙය සිදු වූයේ යෙදුම් ආරම්භයේදී පමණි. (මෙම රීතියට තවත් හොඳ උදාහරණයක් වන්නේ ක්‍රීඩාවක් තුළ ඇති මට්ටම් අතර හෝ ක්‍රීඩාවක සුළු ලකුණු විරාමයකින් ක්‍රීඩකයන් කලබල නොවන වෙනත් ලකුණු අතර වේ).
  3. සැබවින්ම දියුණුවක් ඇති බවට වග බලා ගැනීමට පැතිකඩ. (ඉතා පහසු ය; "එය ක්‍රියා කරයි" සෑම විටම පාහේ "එය ක්‍රියා නොකරයි" යනුවෙන් පහර දෙයි).

බොහෝ විට මා GC.Collect()ඇමතීමට වටින නඩුවක් තිබිය හැකි යැයි මා සිතූ විට , ලක්ෂ්‍යය 1 සහ 2 යෙදී ඇති හෙයින්, 3 වන කරුණ යෝජනා කළේ එය තත්වය වඩාත් නරක අතට හැරවීමට හෝ අවම වශයෙන් දේවල් වඩා හොඳ කිරීමට (සහ සුළු හෝ වැඩි දියුණු කිරීම් නොමැතිව) යෙදුමක ජීවිත කාලය පුරාවටම වඩා හොඳ බව ඔප්පු කිරීමට ප්‍රවේශය ලෙස ඇමතුමට නොපැමිණීමට නැඹුරු වන්න).


0

කසළ බැහැර කිරීම සඳහා මට භාවිතයක් ඇත, එය තරමක් සාම්ප්‍රදායික නොවේ.

අවාසනාවකට මෙන් C # ලෝකයේ බහුලව දක්නට ලැබෙන මෙම නොමඟ ගිය පුරුද්දක් තිබේ, අවිනිශ්චිත, අපැහැදිලි, අශෝභන සහ දෝෂ සහිත මෝඩයන් භාවිතා කරමින් වස්තු බැහැර කිරීම ක්‍රියාවට නැංවීම . එම්එස්ඩීඑන් එය දීර් length ලෙස විස්තර කරන අතර බොහෝ දෙනෙක් ඒ ගැන දිවුරති , ආගමික වශයෙන් එය අනුගමනය කරති, පැය ගණනක් පැය ගණන් එය හරියටම කළ යුතු ආකාරය සාකච්ඡා කරති .

(මා මෙහි කැත ලෙස හඳුන්වන්නේ වස්තු බැහැර කිරීමේ රටාව නොවන බව කරුණාවෙන් සලකන්න . මම කැත ලෙස හඳුන්වන්නේ විශේෂිත IDisposable.Dispose( bool disposing )මෝඩකමයි.)

මෙම මෝඩකම නිර්මාණය කරන ලද්දේ සම්පත් පිරිසිදු කිරීම සඳහා ඔබේ වස්තූන් විනාශ කරන්නා සෑම විටම කසළ එකතු කරන්නා විසින් ආයාචනා කරනු ඇති බවට සහතික කළ නොහැකි යැයි සිතිය හැකි බැවිනි, එබැවින් මිනිසුන් තුළ සම්පත් පිරිසිදු කිරීම සිදු කරයි IDisposable.Dispose(), ඔවුන් අමතක වුවහොත් ඔවුන් තවත් උත්සාහයක් දරයි විනාශ කරන්නා තුළ. ඔයා දන්නවනේ.

නමුත් එවිට ඔබට IDisposable.Dispose()කළමණාකරනය කළ නොහැකි හා කළමනාකරණය නොකළ වස්තූන් පිරිසිදු කිරීමට හැකියාවක් ඇත, නමුත් විනාශ කළ IDisposable.Dispose()තැනැත්තා තුළ සිට ආයාචනා කරන විට කළමනාකරණය කළ ඒවා පිරිසිදු කළ නොහැක , මන්ද එම අවස්ථාවේ දී කුණු එකතු කරන්නා විසින් ඒවා දැනටමත් රැක බලා ගෙන ඇති හෙයිනි. කළමනාකරණ සහ කළමනාකරණය නොකළ වස්තූන් පිරිසිදු කළ යුතුද, නැතිනම් කළමනාකරණය නොකළ ඒවාද යන්න දැන Dispose()ගැනීමට bool disposingධජයක් පිළිගන්නා වෙනම ක්‍රමවේදයක අවශ්‍යතාවය මෙයද ?

මට සමාවෙන්න, නමුත් මෙය උමතුවකි.

මම අයින්ස්ටයින්ගේ ප්‍රත්‍යක්‍ෂය අනුව යමි, එයින් කියැවෙන්නේ දේවල් හැකි තරම් සරල විය යුතු නමුත් සරල නොවන බවයි. පැහැදිලිවම, සම්පත් පිරිසිදු කිරීම අපට අතහැර දැමිය නොහැක, එබැවින් හැකි සරලම විසඳුමට අවම වශයෙන් එය ඇතුළත් කළ යුතුය. මීළඟ සරලම විසඳුම වන්නේ සෑම දෙයක්ම බැහැර කළ යුතු නිශ්චිත වේලාවට බැහැර කිරීමයි. විකල්පයක් ලෙස ආපසු හැරවීමක් ලෙස විනාශ කරන්නා මත යැපීමෙන් දේවල් සංකීර්ණ නොකර.

දැන්, තදින්ම කිවහොත්, කිසිදු ක්‍රමලේඛකයෙකු කිසි විටෙකත් ආයාචනා කිරීම අමතක කිරීමේ වැරැද්ද සිදු නොකරන බවට සහතික විය නොහැක IDisposable.Dispose(), නමුත් අපට කළ හැක්කේ මෙම වැරැද්ද හසු කර ගැනීම සඳහා ඩිස්ට්‍රැක්ටර් භාවිතා කිරීමයි. එය ඉතා සරල ය, සැබවින්ම: disposedඉවත දැමිය හැකි වස්තුවේ ධජය කිසි විටෙකත් සකසා නොමැති බව අනාවරණය වුවහොත්, විනාශ කරන්නා විසින් කළ යුතුව ඇත්තේ ලොග් සටහනක් ජනනය කිරීමයි true. එබැවින්, ඩිස්ට්‍රැක්ටරය භාවිතා කිරීම අපගේ බැහැර කිරීමේ උපායමාර්ගයේ අනිවාර්ය අංගයක් නොවේ, නමුත් එය අපගේ තත්ත්ව සහතික කිරීමේ යාන්ත්‍රණයයි. මෙය දෝශ නිරාකරණ මාදිලියක් පමණක් වන බැවින්, අපට අපගේ මුළු විනාශකරුවාම #if DEBUGබ්ලොක් එකක් තුළ තැබිය හැකිය , එබැවින් නිෂ්පාදන පරිසරයක් තුළ කිසි විටෙකත් විනාශකාරී ද penalty ුවමක් අපට නොලැබේ. ( IDisposable.Dispose( bool disposing )මෝඩකම එය නියම කරයිGC.SuppressFinalize() අවසන් කිරීමේ පොදු කාර්යය අඩු කිරීම සඳහා නිශ්චිතවම ආයාචනා කළ යුතුය, නමුත් මගේ යාන්ත්‍රණය මඟින් නිෂ්පාදන පරිසරය මත එම පොදු කාර්යය සම්පූර්ණයෙන්ම වළක්වා ගත හැකිය.)

එය තම්බා ඇත්තේ සදාකාලික දෘඩ දෝෂයට එදිරිව මෘදු දෝෂ තර්කයයි: IDisposable.Dispose( bool disposing )මෝඩය මෘදු දෝෂ ප්‍රවේශයක් වන අතර, එය නිරූපණය Dispose()කරන්නේ හැකි නම් පද්ධතිය අසමත් නොවී ආයාචනා කිරීමට ක්‍රමලේඛකයාට අමතක කිරීමට උත්සාහ කිරීමකි . දෘ error දෝෂ ප්‍රවේශය පවසන්නේ ක්‍රමලේඛකයා සෑම විටම එය ක්‍රියාත්මක වන බවට වග බලා Dispose()ගත යුතු බවයි. බොහෝ විට දෘඩ දෝෂ ප්‍රවේශය මඟින් නියම කරනු ලබන ද penalty ුවම ප්‍රකාශ කිරීමේ අසාර්ථකත්වයයි, නමුත් මෙම විශේෂිත අවස්ථාව සඳහා අපි ව්‍යතිරේකයක් කර දෝෂ ලොග් සටහනක් සරල ලෙස නිකුත් කිරීම දක්වා අඩු කරන්නෙමු.

එබැවින්, මෙම යාන්ත්‍රණය ක්‍රියාත්මක වීමට නම්, අපගේ යෙදුමේ DEBUG අනුවාදය ඉවත්වීමට පෙර සම්පූර්ණ කසළ බැහැර කිරීමක් සිදු කළ යුතුය, එවිට සියලු විනාශ කරන්නන් ආරාධනා කරනු ඇති බවට සහතික වන අතර එමඟින් IDisposableඅප බැහැර කිරීමට අමතක වූ ඕනෑම වස්තුවක් අල්ලා ගන්න .


Now, strictly speaking, it is of course impossible to guarantee that no programmer will ever make the mistake of forgetting to invoke IDisposable.Dispose()ඇත්ත වශයෙන්ම, සී # එයට හැකියාවක් ඇතැයි මම නොසිතුවත් එය එසේ නොවේ. සම්පත හෙළි නොකරන්න; ඒ වෙනුවට ඔබ එය සමඟ කරන සෑම දෙයක්ම විස්තර කිරීම සඳහා ඩීඑස්එල් එකක් ලබා දෙන්න (මූලික වශයෙන්, මොනාඩ්), සම්පත අත්පත් කර ගැනීම, දේවල් කිරීම, නිදහස් කිරීම සහ ප්‍රති .ලය ලබා දෙන ශ්‍රිතයක්. උපක්‍රමය නම් යමෙකු සම්පත පිළිබඳ සඳහනක් හොර රහසේ ගෙන යන්නේ නම්, එය වෙනත් ඇමතුමක ධාවන ශ්‍රිතයට භාවිතා කළ නොහැකි බවට සහතික කිරීම සඳහා වර්ග ක්‍රමය භාවිතා කිරීමයි.
ඩොවල්

2
ගැටළුව Dispose(bool disposing)(එය නිර්වචනය කර IDisposableනොමැති අතර එය වැරදි ගැටළුව විසඳන ක්ෂේත්‍රයක් ලෙස (හෝ වෙනත් ආකාරයකින් වගකිව යුතු) වස්තුවක් ඇති කළමනාකරණ සහ කළමනාකරණය නොකළ වස්තු පිරිසිදු කිරීම සමඟ කටයුතු කිරීමට භාවිතා කරයි. ඔබ සියල්ල ඔතා තැබුවහොත් කළමනාකරණය කළ නොහැකි වස්තූන් තුළ වෙනත් ඉවත දැමිය හැකි වස්තූන් නොමැති නම්, ඒ සඳහා කරදර විය හැකි සියලු Dispose()ක්‍රම එක් එකක් වනු ඇත (අවශ්‍ය නම් අවසන් කරන්නා එකම පිරිසිදු කිරීමක් කළ යුතුය) හෝ බැහැර කිරීමට කළමණාකරන වස්තූන් පමණක් ඇත (අවසන් කරන්නෙකු නැත කොහෙත්ම), සහ අවශ්‍යතාවය bool disposingඅතුරුදහන් වේ.
ජෝන් හන්නා

-1 අවසාන උපදෙස් ඇත්ත වශයෙන්ම ක්‍රියාත්මක වන ආකාරය නිසා නරක උපදෙස්. dispose(disposing)මෝඩකම ටෙරිබාඩ් වීම පිළිබඳ ඔබේ අදහස සමඟ මම සම්පුර්ණයෙන්ම එකඟ වෙමි , නමුත් මම එසේ කියන්නේ මිනිසුන් බොහෝ විට එම තාක්‍ෂණය සහ අවසාන යන්ත්‍ර භාවිතා කරන්නේ ඔවුන් සම්පත් කළමනාකරණය කළ විට පමණි ( DbConnectionනිදසුනක් ලෙස වස්තුව කළමනාකරණය කරනු ලැබේ , එය පින්වොක් කර හෝ කොම් මාෂල් කර නැත), සහ ඔබ පමණක් විය යුතුය කළමනාකරණය නොකළ, පින් කළ, කොම් මාෂල් කළ, හෝ අනාරක්ෂිත කේතයක් සමඟ අවසන් කරන්න . මම, මිළ අධික, finalizers කොච්චර ඛේදජනක ලෙස මගේ පිළිතුර ඉහත විස්තර නැහැ ඔබට ආහ ඒවා භාවිතා කළමනාකරණය නොකළ ඔබගේ පන්තියේ සම්පත්.
ජිමී හොෆා

2
මට බොහෝ දුරට ඔබට +1 ලබා දීමට අවශ්‍ය වන්නේ ඔබ බොහෝ දේ dispose(dispoing)මෝඩකමේ වැදගත් දෙයක් ලෙස සලකන නිසා ය , නමුත් සත්‍යය එය එතරම් ප්‍රචලිත වී ඇත්තේ මිනිසුන් GC දේවල් වලට එතරම් බිය නිසා ය. ( disposeGC සමඟ සම්බන්ධ වීමට සිල්ච් තිබිය යුතුය) නියමිත medicine ෂධය පවා විමර්ශනය නොකර ගැනීම සුදුසුය. එය පරීක්ෂා කිරීම ඔබට සතුටක්, නමුත් ඔබට විශාලතම සමස්තය මඟ හැරුණි (එය අවසන් තරඟකරුවන්ට වඩා බොහෝ විට ඔවුන් දිරිමත් කරයි)
ජිමී හොෆා

1
Im ජිමීහෝෆා ඔබගේ ආදානයට ස්තූතියි. මම finalizer යුතු බවට එකඟ සාමාන්යයෙන් පමණක් කළමනාකරණය නොකළ සම්පත් නිදහස් සඳහා භාවිතා කල යුතු, නමුත් ඔබ ඩිබග් සාදා මෙම නීතිය අනවශ වන අතර, ඩිබග් සාදා අපි උඩ දෝෂ කිරීමට finalizers භාවිතා කිරීමට නිදහස තිබිය යුතු බව කියා ඔබට සිතෙන්නේ නැද්ද? මම මෙහි යෝජනා කරන්නේ එපමණයි, එබැවින් ඔබ එය සමඟ ගැටළුවක් ගන්නේ මන්දැයි මම නොදනිමි. ලෝකයේ ජාවා පැත්තේ මෙම ප්‍රවේශය පිළිබඳ දීර් description පැහැදිලි කිරීමක් සඳහා programmer.stackexchange.com/questions/288715/… ද බලන්න .
මයික් නකිස්

0

කසළ එකතු කිරීමට බල කිරීම ඇත්තෙන්ම හොඳ හෝ සාධාරණ අදහසක් වන්නේ කුමන ආකාරයේ තත්වයකදැයි මට කිව හැකිද? මම ඉල්ලන්නේ C # විශේෂිත අවස්ථා නොව, කසළ එකතු කරන්නකු සිටින සියලුම ක්‍රමලේඛන භාෂා ය. ජාවා වැනි සෑම භාෂාවකටම ඔබට GC බල කළ නොහැකි බව මම දනිමි, නමුත් ඔබට හැකි යැයි සිතමු.

ඉතා න්‍යායාත්මකව කථා කිරීම සහ සමහර GC ක්‍රියාත්මක කිරීම් ඒවායේ එකතු කිරීමේ චක්‍රය තුළ මන්දගාමී වීම වැනි කාරණා නොසලකා හැරීම, කසළ එකතු කිරීමට බල කිරීම ගැන මට සිතිය හැකි ලොකුම අවස්ථාව වන්නේ මෙහෙවර-විවේචනාත්මක මෘදුකාංගයකි, තාර්කික කාන්දුවීම් දර්ශක බිඳවැටීම් වලට වඩා යෝග්‍ය වේ, උදා. අනපේක්ෂිත වේලාවන්හිදී මිනිස් ජීවිත හෝ මේ ආකාරයේ යමක් අහිමි විය හැකිය.

ෆ්ලෑෂ් ක්‍රීඩා වැනි ජීසී භාෂා භාවිතා කර ලියන ලද ෂෝඩියර් ඉන්ඩි ක්‍රීඩා දෙස බැලුවහොත් ඒවා පිස්සු මෙන් කාන්දු වන නමුත් ඒවා බිඳ වැටෙන්නේ නැත. ක්‍රීඩාවට මිනිත්තු 20 ක කාලයක් මතකය මෙන් දස ගුණයක් ගතවනු ඇත, මන්ද ක්‍රීඩාවේ කේතපදයේ යම් කොටසක් අහෝසි කිරීමට හෝ ලැයිස්තුවෙන් ඉවත් කිරීමට යොමු කිරීමක් අමතක කර ඇති අතර රාමු අනුපාත දුක් විඳීමට පටන් ගත හැකි නමුත් ක්‍රීඩාව තවමත් ක්‍රියාත්මක වේ. එකම ආකාරයේ සම්පත් කළමණාකරණ අත්වැරැද්දක ප්‍රති ang ලයක් ලෙස අන්තරාදායක දර්ශකයන්ට ප්‍රවේශ වීමේ ප්‍රති sh ලයක් ලෙස මෝඩ C හෝ C ++ කේතීකරණය භාවිතා කර ලියන ලද සමාන ක්‍රීඩාවක් බිඳ වැටෙනු ඇත, නමුත් එය එතරම් කාන්දු නොවනු ඇත.

ක්‍රීඩා සඳහා කඩාවැටීම වඩාත් ඉක්මණින් හඳුනාගෙන නිවැරදි කළ හැකිය යන අර්ථයෙන් වඩාත් සුදුසු විය හැකි නමුත් මෙහෙවර-විවේචනාත්මක වැඩසටහනක් සඳහා, මුළුමනින්ම අනපේක්ෂිත වේලාවන්හිදී කඩා වැටීම යමෙකු මරා දැමිය හැකිය. එබැවින් මා සිතන ප්‍රධාන අවස්ථා වනුයේ බිඳවැටීම හෝ වෙනත් ආකාරවල ආරක්ෂාව යනු අතිශයින්ම තීරණාත්මක වන අතර තාර්කික කාන්දුවක් සාපේක්ෂව සාපේක්ෂව සුළු දෙයකි.

GC බල කිරීම නරක යැයි මා සිතන ප්‍රධාන අවස්ථාව වන්නේ තාර්කික කාන්දුව ඇත්ත වශයෙන්ම බිඳවැටීමට වඩා අඩු කැමැත්තක් දක්වන දේවල් සඳහා ය. නිදසුනක් ලෙස, ක්‍රීඩා සමඟ, බිඳවැටීම අනිවාර්යයෙන්ම කිසිවෙකු මරා නොදමන අතර අභ්‍යන්තර පරීක්ෂණයේදී එය පහසුවෙන් හසු කර ගත හැකි අතර, නිෂ්පාදන නැව්වලින් පසුව පවා තාර්කික කාන්දුවක් නොදැනෙන අතර එය මිනිත්තු කිහිපයකින් ක්‍රීඩාව ක්‍රීඩා කළ නොහැකි තරමට . සමහර වසම්වල පහසුවෙන් ප්‍රතිනිෂ්පාදනය කළ හැකි බිඳවැටීමක් සමහර විට කිසිවෙකු වහාම නොදකින කාන්දුවකට වඩා යෝග්‍ය වේ.

කණ්ඩායමක් මත GC බල කිරීම වඩාත් සුදුසු වන්නේ කොතැනදැයි මට සිතිය හැකි තවත් අවස්ථාවක් වන්නේ ඉතා කෙටි කාලීන වැඩසටහනක් සඳහා වන අතර එය විධාන රේඛාවෙන් ක්‍රියාත්මක කර යම් කාර්යයක් කර පසුව වසා දමයි. එවැනි අවස්ථාවකදී වැඩසටහනේ ආයු කාලය ඉතා කෙටි වන අතර ඕනෑම ආකාරයක තාර්කික කාන්දුවක් සුළුපටු නොවේ. තාර්කික කාන්දුවීම්, විශාල සම්පත් සඳහා වුවද, සාමාන්‍යයෙන් මෘදුකාංගය ධාවනය කිරීමෙන් පැය කිහිපයක් හෝ මිනිත්තු කිහිපයක් පමණක් බවට පත්වේ, එබැවින් තත්පර 3 ක් පමණක් ක්‍රියාත්මක කිරීමට අදහස් කරන මෘදුකාංගයක් තාර්කික කාන්දුවීම් සමඟ කිසි විටෙකත් ගැටලු ඇති නොවිය හැකි අතර, එමඟින් බොහෝ දේ සිදුවිය හැකිය කණ්ඩායම විසින් GC භාවිතා කළේ නම් එවැනි කෙටි කාලීන වැඩසටහන් ලිවීමට වඩා සරල ය.

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.