අපි ජාවා හි වස්තු නිර්මාණය කිරීමෙන් වැළකී සිටිය යුතුද?


253

ජාවා වස්තු නිර්මාණය කිරීම ඔබට කළ හැකි වඩාත්ම මිල අධික මෙහෙයුම බව මට සගයකු පැවසීය. එබැවින් මට නිගමනය කළ හැක්කේ හැකි තරම් වස්තූන් කිහිපයක් නිර්මාණය කිරීම පමණි.

වස්තු නැඹුරු වැඩසටහන්කරණයේ අරමුණ පරාජය කිරීමට මෙය තරමක් දුරට පෙනේ. අප වස්තූන් නිර්මාණය නොකරන්නේ නම්, අපි ප්‍රශස්තිකරණය සඳහා එක් දිගු පන්තියේ සී ශෛලියක් ලියන්නෙමු ද?


39
"ජාවා වස්තු නිර්මාණය යනු ඔබට කළ හැකි මිල අධිකම මෙහෙයුමයි" . එම ප්‍රකාශයේ මූලාශ්‍රය බෙදා ගැනීමට මනස?
සොන්ගෝ

92
හා - වඩාත්ම මිල අධික මෙහෙයුම කුමක්ද? Pi ඉලක්කම් 900 ට ගණනය කිරීමට සාපේක්ෂව හෝ int වැඩි කිරීම හා සසඳන විට?
jasonk

4
ඔවුන් නිශ්චිත වස්තු නිර්මාණයේ යම් කොටසක් ගැන කතා කර තිබේද? මම හිතන්නේ ඇපල් විසින් TableViewCells සඳහා පෝලිමක් භාවිතා කරන්නේ කෙසේද යන්නයි. සමහර විට ඔබේ සගයා යෝජනා කළේ එම නිශ්චිත වස්තූන් හා සම්බන්ධ යම් පොදු කාර්යයක් නිසා වස්තූන් කිහිපයක් නිර්මාණය කර ඒවා නැවත භාවිතා කිරීමටද? ඔවුන් එවැනි ප්‍රකාශයක් කරන්නේ මන්දැයි වටහා ගැනීමට උත්සාහ කිරීම පමණි.
ටයිලර් ඩෙවිට්

3
මෙය වැඩසටහන්කරණය පිළිබඳව මා අසා ඇති ඉතාම විනෝදජනක දෙයකි.)
මර්ට් අක්කායා

22
අංක ගණිතය ද තරමක් මිල අධික ය; අපි ගණනය කිරීම් වලින් වැළකී සිටිය යුතුය, අනේ, ජේවීඑම් එකක් ආරම්භ කිරීම ඇත්තෙන්ම මිල අධික බැවින් අපි කිසිදු ජේවීඑම් එකක් ආරම්භ නොකළ යුතුය :-).
ජේම්ස් ඇන්ඩර්සන්

Answers:


485

ඔබේ සගයාට ඔවුන් කතා කරන්නේ කුමක් දැයි අදහසක් නැත.

ඔබේ වඩාත්ම මිල අධික මෙහෙයුම ඔවුන්ට ඇහුම්කන් දීමයි . ඔවුන් ඔබේ කාලය නාස්ති කර ඇත්තේ දශකයකට වඩා පැරණි තොරතුරු වලට (මෙම පිළිතුර පළ කරන ලද මුල් දිනය වන විට) මෙන්ම ඔබ මෙහි පළ කිරීමට සහ සත්‍යය සඳහා අන්තර්ජාලය ගවේෂණය කිරීමට කාලය ගත කිරීමට සිදුවීමෙනි.

දශකයකට වැඩි කාලයකට පෙර ඔවුන් ඇසූ හෝ කියවූ දෙයක් නොදැනුවත්වම යථා තත්වයට පත් කරමින් සිටින අතර, ඊට වඩා හොඳ කිසිවක් නොදන්නා බව බලාපොරොත්තු විය හැකිය. සැකකරුවන් ලෙස ඔවුන් පවසන වෙනත් ඕනෑම දෙයක් මම ගන්නෙමි, මෙය ඕනෑම ආකාරයකින් යාවත්කාලීනව තබා ගන්නා ඕනෑම කෙනෙකුගේ ප්‍රසිද්ධ වැරැද්දක් විය යුතුය.

සෑම දෙයක්ම වස්තුවකි (හැර primitives)

ප්‍රාථමික ( int, long, doubleආදිය) හැර අනෙක් සියල්ල ජාවාහි වස්තු වේ. ජාවා හි වස්තු නිර්මාණය කිරීමෙන් වැළකී සිටීමට ක්‍රමයක් නොමැත.

ජාවා හි මතක විබෙදුම් ක්‍රමෝපායන් හේතුවෙන් වස්තු නිර්මාණය බොහෝ අවස්ථාවන්හි C ++ ට වඩා වේගවත් වන අතර JVM හි ඇති අනෙක් සියල්ල හා සසඳන විට සියලු ප්‍රායෝගික අරමුණු සඳහා "නිදහස්" ලෙස සැලකිය හැකිය .

1990 දශකයේ අග භාගයේ මුල් භාගයේ දී මෙන්, ජේවීඑම් ක්‍රියාවට නැංවීම මගින් සත්‍ය වශයෙන්ම වස්තු වෙන් කිරීමේදී යම් කාර්ය සාධනයක් පෙන්නුම් කර ඇත. අවම වශයෙන් 2005 සිට මෙය එසේ නොවේ.

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

එය කෙසේ හෝ රතු හුරුල්ලන් වන නිදහස් අවකාශය උපරිම කිරීමට උත්සාහ නොකරයි, එය ධාවන වේලාවේ ක්‍රියාකාරිත්වය උපරිම කරයි. එයින් අදහස් කරන්නේ ජේවීඑම් හීප් සෑම විටම 100% ක්ම වෙන් කර ඇති බවයි. නොමිලේ ජේවීඑම් ගොඩවල් මතකය ඔබට කෙසේ හෝ එහි වාඩි වී සිටීමට කිසිවක් ලබා නොදේ.

GC විසින් මතකය නැවත පද්ධතියේ සෙසු අයට ප්‍රයෝජනවත් ආකාරයකින් නිදහස් කරනු ඇතැයි යන වැරදි මතයක් ඇත, මෙය සම්පූර්ණයෙන්ම අසත්‍යයකි!

ජේවීඑම් සංචය වර්ධනය වී හැකිලෙන්නේ නැත, එවිට සෙසු පද්ධතියට ජේවීඑම් හීප් හි නිදහස් මතකය ධනාත්මක ලෙස බලපායි . -Xmsආරම්භයේ දී නිශ්චිතව දක්වා ඇති සියල්ල වෙන් කරනු ලබන අතර, ජේවීඑම් හි එම අවස්ථාව සම්පූර්ණයෙන්ම ඉවත්ව යන තෙක් එම මතකය කිසි විටෙකත් වෙනත් මෙහෙයුම් පද්ධතියක් සමඟ බෙදා ගැනීමට මෙහෙයුම් පද්ධතියට නැවත නිකුත් නොකිරීම එහි ප්‍රති ur ලයකි. -Xms=1GB -Xmx=1GBඕනෑම වේලාවක සත්‍ය වශයෙන්ම වස්තූන් කොපමණ ප්‍රමාණයක් නිර්මාණය කර තිබුණද 1GB RAM ප්‍රමාණයක් වෙන් කරයි. ගොඩවල් මතකයේ ප්‍රතිශතයක් මුදා හැරීමට ඉඩ සලසන සමහර සැකසුම් ඇත, නමුත් සියලු ප්‍රායෝගික අරමුණු සඳහා මෙය කිසිදා සිදු නොවීමට JVM හට මෙම මතකය ප්‍රමාණවත් ලෙස මුදා හැරීමට නොහැකි වේ.එබැවින් වෙනත් කිසිදු ක්‍රියාවලියකට මෙම මතකය නැවත ලබා ගත නොහැක, එබැවින් ජේවීඑම් හීප් නිදහස් වීමෙන් සෙසු පද්ධතියට ප්‍රතිලාභ නොලැබේ. මේ සඳහා RFE 29-NOV-2006 "පිළිගත්" නමුත් ඒ පිළිබඳව කිසිවක් කර නැත. මෙය හැසිරීම බලධාරීන් විසින් සලකනු නොලැබේ.

කුඩා කෙටිකාලීන වස්තූන් බොහොමයක් නිර්මාණය කිරීමෙන් ජේවීඑම් දීර් long කාලයක් තිස්සේ විරාමයක් ඇති බවට වැරදි මතයක් පවතී, මෙය දැන් ද අසත්‍යයකි

වර්තමාන GC ඇල්ගොරිතම ඇත්ත වශයෙන්ම කෙටි කාලීන බොහෝ කුඩා වස්තූන් නිර්මාණය කිරීම සඳහා ප්‍රශස්තිකරණය කර ඇත, එය මූලික වශයෙන් සෑම වැඩසටහනකම ජාවා වස්තු සඳහා 99% ක ur ෂධයකි. වස්තු සංචිතයේ උත්සාහයන් ඇත්ත වශයෙන්ම JVM බොහෝ අවස්ථාවන්හිදී වඩාත් නරක අතට හැරෙනු ඇත.

අද දින සංචලනය කිරීමට අවශ්‍ය එකම වස්තුව වන්නේ ජේවීඑම් වෙතින් බාහිර වූ සීමිත සම්පත් වෙත යොමු වන වස්තු ය ; සොකට්, ලිපිගොනු, දත්ත සමුදා සම්බන්ධතා යනාදිය නැවත භාවිතා කළ හැකිය. මතක ස්ථාන වෙත access ජුව පිවිසීමට ඔබට ඉඩ සලසන භාෂාවල මෙන් නිත්‍ය වස්තූන් සංචිත කළ නොහැක . වස්තු හැඹිලිය වෙනස් සංකල්පයක් වන අතර සමහර අය අශෝභන ලෙස සංචිත ලෙස හඳුන්වන හෝ නොවිය හැකිය , සංකල්ප දෙක එකම දෙයක් නොවන අතර ඒවා ගැටගැසිය යුතු නොවේ.

නූතන ජීසී ඇල්ගොරිතමයන්ට මෙම ගැටළුව නොමැත, මන්ද ඒවා කාලසටහනකට අනුව වෙනස් නොවන නිසා, යම් පරම්පරාවක නිදහස් මතකය අවශ්‍ය වූ විට ඒවා අවලංගු වේ. සංචය ප්‍රමාණවත් තරම් විශාල නම්, කිසිදු විරාමයක් ඇතිවීමට තරම් දිගුකාලීනව කිසිදු ගනුදෙනුවක් සිදු නොවේ.

වස්තු දිශානත ගතික භාෂා ගණනය කිරීමේ සංවේදී පරීක්ෂණ වලදී දැන් පවා C ට පහර දෙයි.


280
+1: "ඔබේ වඩාත්ම මිල අධික මෙහෙයුම ඔවුන්ට ඇහුම්කන් දීමයි ...". හොඳම දේ මම කාලයක් තිස්සේ අසා ඇත්තෙමි.
rjnilsson

21
EdDeadMG, සමුච්චිත GC ඉහළින් වුවද, ජාවා C ++ ට වඩා වේගවත් විය හැකිය (උදා: ගොඩවල් සම්පීඩනය හේතුවෙන්, ඇතැම් දත්ත ව්‍යුහයන් සඳහා හැඹිලි මග හැරීම අවම කිරීම).
එස්.කේ.-තර්කනය

13
K එස්.කේ.-තර්කනය: ග්‍රාම නිලධාරී විසින් නිර්ණායක නොවන බැවින් එය ඔප්පු කිරීම අතිශයින්ම දුෂ්කර ය. හැඹිලි මග හැරීම අවම කිරීම සඳහා, සෑම වස්තුවක්ම වෙනත් දිශානතියක් විය යුතු අතර, හැඹිලි අවකාශය නාස්ති කිරීම සහ ක්‍රියාත්මක කිරීමේ කාලය වැඩි කිරීම. කෙසේ වෙතත්, මම තර්ක කරන්නේ වස්තු සංචිතය හෝ මතක ක්ෂේත්‍රය වැනි C ++ හි සුදුසු විබෙදන්නෙකු භාවිතා කිරීමෙන් ඔබට කසළ එකතු කරන්නාගේ කාර්ය සාධනය පහසුවෙන් ගැලපීමට හෝ පරාජය කිරීමට හැකි බවයි. නිදසුනක් ලෙස, ඔබට _allocaක්‍රමක්ෂයට වඩා වේගයෙන් ක්‍රියා කරන මතක වේදිකා පන්තියක් ලිවිය හැකිය .
DeadMG

34
වස්තු නිර්මාණය කිරීම පෙරට වඩා දැන් ලාභදායී ය. එය නොමිලේ නොවේ. ඔබට බොරු කියන ඕනෑම අයෙක්. OO භාෂාවන් C ට පහර දීම පිළිබඳ සබැඳිය අව්‍යාජව ඉගෙන ගැනීමට උත්සාහ කරන කෙනෙකුට අතිශයෝක්තියෙන් දක්වන ප්‍රතිචාරයකි.
jasonk

17
මේ ආකාරයේ පිළිතුරු නිසා අප අවසන් වන්නේ කපටි කේතයෙනි. නිවැරදි පිළිතුර නම් ජාවා තුළ වස්තුවක් නිර්මාණය කිරීම යනු ජාවා වස්තුව නිර්මාණය කිරීම සහ එය ආරම්භ කිරීමයි. පළමු කොටස ලාභයි, දෙවන කොටස ඉතා මිල අධික විය හැකිය. newහොට්ස්පොට් ස්ථානයක මූල පදය භාවිතා කිරීමට පෙර ඉදිකිරීම්කරුවන් තුළ සිදුවන්නේ කුමක්ද යන්න ජනතාව නිතරම සොයා බැලිය යුතුය . මිනිසුන් ස්විං වස්තූන් භාවිතා new ImageIcon(Image)කරන ආකාරය මම දැක ඇත්තෙමි paint(), එය ඉතා මිල අධික වන අතර එය සමස්ත UI සුපිරි මන්දගාමී වේ. එබැවින් එය කළු සුදු පිළිතුරක් නොවේ, ඔබ newකොහේ හෝ භාවිතා කිරීමට පෙර සිතා බලන්න .
qwertzguy

98

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

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

මෙය අද්භූත සිද්ධියක් යැයි කිසිවෙකු කෝප වීමට පෙර - data 50 පේළි දත්ත සැකසීම සඳහා ප්‍රශස්තිකරණය කිරීමට පෙර 20 + MB වස්තු නිර්මාණය කළ යෙදුම් මම පැතිකඩ කර ඇත. ඔබ විනාඩියකට ඉල්ලීම් සියයක් දක්වා පරිමාණය කර හදිසියේම ඔබ විනාඩියකට 2GB දත්ත නිර්මාණය කරන තෙක් මෙය පරීක්‍ෂා කිරීමේදී කදිමයි. ඔබට තත්පර 20 ක් / තත්පරයක් කිරීමට අවශ්‍ය නම් ඔබ 400MB වස්තූන් නිර්මාණය කර එය විසි කරයි. යහපත් සේවාදායකයකු සඳහා තත්පර 20 ක් / තත්පරයක් ඉතා කුඩාය.


7
මම උදාහරණයක් එකතු කළ හැක: සමහර අවස්ථාවල දී එය ඇත්තටම කේතය පැහැදිලිතාව අනුව කිසිදු වෙනසක් නමුත් කාර්ය සාධනය අඩු වැඩි වෙනසක් කළ හැක: ධාරා සිට කියවන විට, නිදසුනක් ලෙස, එය එසේ නොවේ අළුත් දෙයක් වගේ දෙයක් භාවිතා කිරීමයි while(something) { byte[] buffer = new byte[10240]; ... readIntoBuffer(buffer); ...මැයි වන උදා: හා සසඳන විට නාස්ති වන්න byte[] buffer = new byte[10240]; while(something) { ... readIntoBuffer(buffer); ....
ජිමී බී

4
+1: අනවශ්‍ය වස්තු නිර්මාණය කිරීම (හෝ ඉවත් කිරීමෙන් පසු පිරිසිදු කිරීම) අනිවාර්යයෙන්ම සමහර විට මිල අධික විය හැකිය. ජාවා හි ත්‍රිමාණ ග්‍රැෆික්ස් / ඕපන් ජීඑල් කේතය යනු ඔබේ රාමු රාමුව සමඟ ජීසී වෙනත් ආකාරයකින් විනාශයක් ඇති කළ හැකි බැවින් නිර්මාණය කරන ලද වස්තු ගණන අවම කිරීම සඳහා ප්‍රශස්තිකරණය කර ඇති එක් ස්ථානයකි.
ලියෝ

1
වාව්! දත්ත පේළි 50 ක් සැකසීමට 20+ MB? පිස්සු වගේ. කෙසේ වෙතත්, එම වස්තූන් දිගු කල් පවතින්නේද? GC සඳහා වැදගත් වන්නේ එයයි. අනෙක් අතට ඔබ හුදෙක් මතක අවශ්‍යතා ගැන සාකච්ඡා කරන්නේ නම්, එය කසළ එකතු කිරීම හෝ වස්තු නිර්මාණය කිරීමේ කාර්යක්ෂමතාවයට සම්බන්ධ නොවේ ...
ඇන්ඩ්‍රෙස් එෆ්.

1
වස්තූන් කෙටිකාලීන ය (සාමාන්‍ය නඩුවේ තත්පර 0.5 ට අඩු). එම කසළ පරිමාව තවමත් ක්‍රියාකාරීත්වයට බලපායි.
jasonk

3
යථාර්ථය මත ස්ථිරව සිටීම ගැන ඔබට ස්තූතියි, නොසැලකිලිමත් ගෘහ නිර්මාණ ශිල්පයේ ප්‍රති with ල සමඟ ජීවත් වන ඕනෑම කෙනෙකුට බොහෝ සෙයින් සම්බන්ධ විය හැකිය.
ජේඑම් බෙකර්

60

ඇත්ත වශයෙන්ම, ජාවා භාෂාව (හෝ වෙනත් ඕනෑම කළමණාකරන භාෂාවක්) කළ හැකි මතක කළමනාකරණ උපාය මාර්ග නිසා, වස්තු නිර්මාණය කිරීම තරුණ පරම්පරාව නමින් හැඳින්වෙන මතක කොටසක දර්ශකයක් වැඩි කිරීමට වඩා ටිකක් වැඩි ය. එය C ට වඩා වේගවත් ය, එහිදී නිදහස් මතකය සෙවීමක් කළ යුතුය.

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


7
+1 කසළ එකතු කරන්නා “ක්‍රියා කරයි” වුවද, සෑම ජාවා ක්‍රමලේඛකයෙක්ම පරම්පරාවේ කසළ එකතු කරන්නා ගැන ඉගෙන ගත යුතුය.
බෙන්සාඩෝ

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

4
ක ද ඊළඟ පියවර පලා විශ්ලේෂණය සඳහා (උදාහරණයක් ලෙස තනිකරම ලේඛන කුඩා වස්තුවක් සඳහා වන මතකය "වෙන් වන්නේ" Pointවස්තුව පොදු අරමුණ ලේඛන 2 වෙනවයැ).
ජෝකිම් සෝවර්

6
O ජෝකිම් සෝවර්: හොට්ස්පොට් වීඑම් හි නවතම ක්‍රියාත්මක කිරීම් වලදී සිදු කරනුයේ එයයි. එය පරිමාණ ප්‍රතිස්ථාපනය ලෙස හැඳින්වේ.
someguy

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

38

වෙනත් පෝස්ටර් නිවැරදිව පෙන්වා දී ඇත්තේ ජාවා හි වස්තු නිර්මාණය අතිශයින් වේගවත් බවත්, සාමාන්‍ය ජාවා යෙදුමක දී ඔබ ඒ ගැන කරදර නොවිය යුතු බවත් ය.

කරනු ලබන ඉතා විශේෂ තත්ත්වයන් කීපයක් තියෙනවා වේ වස්තුව නිර්මාණය වළක්වා ගැනීමට හොඳ අදහසක්.

  • ඔබ ප්‍රමාද සංවේදී යෙදුමක් ලියන විට සහ GC විරාමයන් වළක්වා ගැනීමට කැමති විට. ඔබ වැඩි වැඩියෙන් වස්තූන් නිපදවන තරමට GC සිදු වන අතර විරාමයන් වැඩි වේ. ක්‍රීඩා, සමහර මාධ්‍ය යෙදුම්, රොබෝ පාලනය, අධි-සංඛ්‍යාත වෙළඳාම ආදිය සඳහා මෙය වලංගු සලකා බැලීමක් විය හැකිය. විසඳුම නම් ඔබට අවශ්‍ය සියලුම වස්තූන් / අරා පෙර වෙන් කර නැවත භාවිතා කිරීමයි. මේ ආකාරයේ හැකියාවන් සැපයීම සඳහා විශේෂ izes වූ පුස්තකාල තිබේ , උදා: ජාවොලියුෂන් . නමුත් අඩු ප්‍රමාදයක් ගැන ඔබ සැබවින්ම සැලකිලිමත් වන්නේ නම් ඔබ භාවිතා කළ යුත්තේ ජාවා හෝ සී # :-) වෙනුවට සී / සී ++ / එකලස් කිරීමේ ය.
  • වැළකී සිටීම ජිනීවා නුවර හතර පැත්තෙන් කොටු වී සැලකෙතත් (ද්විත්ව, පූර්ණ සංඛ්යාව ආදිය) යම් නිශ්චිත තත්වයන් තුළ ඉතා ප්රයෝජනවත් ක්ෂුද්ර ප්රශස්තිකරණය විය හැක. නොබැඳි ප්‍රාථමිකයන් (ද්විත්ව, int යනාදිය) එක් වස්තුවකට ඉහළින් මඟ හැරෙන හෙයින්, ඒවා සංඛ්‍යාත්මක සැකසුම් වැනි වේගවත් CPU තීව්‍ර වැඩකි. සාමාන්‍යයෙන්, ප්‍රාථමික අරා ජාවා හි ඉතා හොඳින් ක්‍රියා කරයි, එබැවින් මේවා ඔබේ සංඛ්‍යා හැපීම සඳහා භාවිතා කිරීමට අවශ්‍ය වේ. වෙනත් ඕනෑම වස්තුවක්.
  • දී සීමාකම් මතක තත්ත්වයන් ඔබ (ක්රියාකාරී) සංඛ්යාව අවම කර ගැනීමට අවශ්ය සෑම වස්තූන් සිට නිර්මාණය වස්තු (සාමාන්යයෙන් 8-16 JVM ක්රියාත්මක කිරීම මත පදනම්ව bytes) කුඩා පොදු කාර්ය ගෙන එයි. එවැනි තත්වයන් තුළ කුඩා වස්තූන් විශාල සංඛ්‍යාවක් වෙනුවට ඔබේ දත්ත ගබඩා කිරීම සඳහා විශාල වස්තූන් හෝ අරා කුඩා සංඛ්‍යාවක් කැමති විය යුතුය.

3
ගැලවීමේ විශ්ලේෂණය මඟින් කෙටි කාලීන (සීමිත ජීවිත) වස්තූන් තොගයේ ගබඩා කර තැබීමට ඉඩ ඇති බව සඳහන් කිරීම වටී, මෙම වස්තූන් නොමිලේ ibm.com/developerworks/java/library/j-jtp09275/index.html
රිචඩ්

1
Ic රිචඩ්: නියමයි - ගැලවීමේ විශ්ලේෂණය ඉතා හොඳ ප්‍රශස්තිකරණ කිහිපයක් සපයයි. කෙසේ වෙතත් එය මත විශ්වාසය තැබීම ගැන ඔබ සැලකිලිමත් විය යුතුය: එය සියලු ජාවා ක්‍රියාත්මක කිරීමේදී සහ සෑම තත්වයකදීම සිදුවනු ඇතැයි සහතික නොවේ. එබැවින් ඔබ බොහෝ විට සහතික වීමට මිණුම් ලකුණක් තිබිය යුතුය.
මිකෙරා

2
එසේම, 100% නිවැරදි ගැලවීමේ විශ්ලේෂණය නතර කිරීමේ ගැටලුවට සමාන වේ. අවම වශයෙන් යම් වේලාවක් වැරදි පිළිතුරක් ලබා දිය හැකි බැවින්, සංකීර්ණ අවස්ථාවන්හිදී පැන යාම විශ්ලේෂණය මත රඳා නොසිටින්න.
ජූල්ස්

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

17

ඔබේ සගයා පවසන දෙයෙහි සත්‍යයේ කර්නලයක් තිබේ. වස්තු නිර්මාණය කිරීමේ ගැටලුව ඇත්ත වශයෙන්ම කුණු එකතු කිරීම බව මම ගෞරවයෙන් යෝජනා කරමි . C ++ හි ක්‍රමලේඛකයාට මතකය අවලංගු වන ආකාරය හරියටම පාලනය කළ හැකිය. වැඩසටහනට කැමති තරම් දිගු හෝ කෙටි කාලයක් සඳහා ගොරෝසු එකතු කර ගත හැකිය. තවද, C ++ වැඩසටහනට එය සෑදූ නූල් වලට වඩා වෙනස් නූල් භාවිතයෙන් බොරතෙල් බැහැර කළ හැකිය. මේ අනුව දැනට ක්‍රියාත්මක වන නූල් පිරිසිදු කිරීම නතර කළ යුතු නැත.

ඊට වෙනස්ව, භාවිතයට නොගත් මතකය නැවත ලබා ගැනීම සඳහා ජාවා අතථ්‍ය යන්ත්‍රය (ජේවීඑම්) වරින් වර ඔබේ කේතය නතර කරයි. බොහෝ ජාවා සංවර්ධකයින් මෙම විරාමය කිසි විටෙකත් නොදක්වයි, මන්ද එය සාමාන්‍යයෙන් කලාතුරකින් හා ඉතා කෙටි වේ. ඔබ වැඩි වැඩියෙන් ගොරෝසු වී ඇති විට හෝ ඔබේ ජේවීඑම් අවහිර වන තරමට, මෙම විරාමයන් නිතර නිතර සිදුවේ. මෙම ක්‍රියාවලිය දෘශ්‍යමාන කිරීමට ඔබට VisualVM වැනි මෙවලම් භාවිතා කළ හැකිය .

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

මෙය වැදගත් වන්නේ කවදාද? ස්ථාවර මිලි තත්පර ප්‍රතිචාර අනුපාත ගැන ඔබ සැලකිලිමත් වන ඕනෑම වේලාවක ඔබ GC ගැන සැලකිලිමත් වනු ඇත. ජාවා හි ලියා ඇති ස්වයංක්‍රීය වෙළඳ පද්ධති විරාමයන් අවම කිරීම සඳහා ජේවීඑම් දැඩි ලෙස සුසර කරයි. වෙනත් ආකාරයකින් පද්ධති ඉහළ ප්‍රතිචාරයක් දැක්විය යුතු අවස්ථාවන්හිදී ජාවා ලියන සමාගම් C ++ වෙත හැරේ.

වාර්තාව සඳහා මට කරන්න නොවේ පොදුවේ බලා සිටියේ ඇස් කන් පියාගෙනද වස්තුව වැළැක්වීමේ! වස්තු-නැඹුරු වැඩසටහන්කරණයට පෙරනිමිය. මෙම ප්‍රවේශය සකසන්න GC ඔබේ මාර්ගයට පිවිසෙන්නේ නම් පමණක්, පසුව අඩු කාලයක් සඳහා විරාමයක් ලබා ගැනීම සඳහා JVM සුසර කිරීමට උත්සාහ කිරීමෙන් පසුව පමණි. ජාවා කාර්ය සාධන සුසර පිළිබඳ හොඳ පොතක් ජාවා කාර්ය සාධන චාලි හන්ට් සහ Binu, ජොහන් විසින්.


10
බොහෝ නූතන ජේවීඑම් හි සහාය "ලෝකය නවත්වන්න" වඩා හොඳ කසළ එකතු කිරීමේ ඇල්ගොරිතම. කසළ එකතු කිරීම සඳහා වැය කරන ක්‍රමක්ෂය කාලය පැහැදිලිවම malloc / free ලෙස හැඳින්වීමට වැය කරන මුදලට වඩා අඩුය. C ++ මතක කළමනාකරණය වෙනම ත්‍රෙඩ් එකකින් ක්‍රියාත්මක වේද?

10
ඔරකල් වෙතින් නවතම ජාවා අනුවාදයන්ට ගැලවීමේ විශ්ලේෂණය කළ හැකිය, එයින් අදහස් කරන්නේ ක්‍රමයකින් ගැලවී නොයන වස්තූන් තොගයේ වෙන් කර ඇති අතර එමඟින් ඒවා පිරිසිදු කිරීම නොමිලේ සිදු කරයි - ක්‍රමය නැවත පැමිණෙන විට ඒවා ස්වයංක්‍රීයව අවලංගු වේ.
ජෙස්පර්

2
Or ThorbjørnRavnAndersen: ඇත්තද? ඔබ ඇත්තටම අදහස් කරන්නේ විරාමය අඩු GC ද, නැතහොත් ඔබ අදහස් කරන්නේ "සාමාන්‍යයෙන් සමාන්තර-නමුත්-සමහර විට-ඉතා කුඩා-විරාමයක්" GC ද? GC හට කිසි විටෙකත් වැඩසටහනකට විරාමයක් ලබා දිය නොහැකි බවත්, එකවර වස්තූන් එහා මෙහා ගෙන යා හැකි බවත් මට තේරෙන්නේ නැත ... එය වචනාර්ථයෙන් මට කළ නොහැකි දෙයක් ලෙස පෙනේ ...
user541686

2
Or ThorbjørnRavnAndersen: එය “ලෝකය නවත්වන්නේ” නමුත් “JVM විරාමයක් නොදෙන්නේ” කෙසේද?
ඒකෙන්

2
Or ThorbjørnRavnAndersen: නෑ මම ඇත්තටම නැහැ; මට තේරෙන්නේ නැහැ ඔයා කියන දේ. එක්කෝ GC සමහර විට වැඩසටහන විරාමයක් තබයි, එය එසේ නම් - අර්ථ දැක්වීම අනුව - "විරාමයක්" නොවේ, නැතහොත් එය කිසි විටෙකත් වැඩසටහන විරාමයක් නොදක්වයි (එබැවින් එය "විරාමයක්" වේ), එවැනි අවස්ථාවකදී මට එය තේරෙන්නේ නැත ඔබගේ "එය පවත්වා ගැනීමට නොහැකි වූ විට එය ලෝකය නවත්වයි" යන ප්‍රකාශයට අනුරූප වේ, මන්ද එයින් ඇඟවෙන්නේ GC ක්‍රියාත්මක වන විට වැඩසටහන විරාමයක් ඇති බවයි. කුමන අවස්ථාවද (එය විරාමයක්ද නැද්ද?) සහ එය කළ හැක්කේ කෙසේද යන්න පැහැදිලි කිරීමට ඔබ කැමතිද?
user541686

11

ඉහළින් ඇති නිසා ජාවා හි වැඩිපුර වස්තූන් නිර්මාණය කිරීමෙන් ඔබ අධෛර්යමත් විය හැකි එක් අවස්ථාවක් තිබේ - ඇන්ඩ්‍රොයිඩ් වේදිකාවේ ක්‍රියාකාරිත්වය සඳහා සැලසුම් කිරීම

ඒ හැර, ඉහත පිළිතුරු සත්‍ය වේ.


2
ප්‍රශ්නය නැවත කියවන්න. ටැග් ඇතුළු ඕනෑම තැනක එය ජේවීඑම් නියම නොකරයි. එහි සඳහන් වන්නේ ජාවා පමණි.
පීටර් කෙලී

9

GC බොහෝ කෙටි කාලීන වස්තු සඳහා සුසර කර ඇත

එයින් කියැවෙන්නේ ඔබට කළ යුතු වස්තු වෙන් කිරීම සුළු වශයෙන් අඩු කළ හැකි නම්

එක් නිදසුනක් නම්, ලූපයක් තුළ නූලක් තැනීම, බොළඳ ක්‍රමය වනු ඇත

String str = "";
while(someCondition){
    //...
    str+= appendingString;
}

එය Stringඑක් එක් +=මෙහෙයුමේ නව වස්තුවක් නිර්මාණය කරයි (ප්ලස් a StringBuilderසහ නව යටින් පවතින වර්‍ග අරාව)

ඔබට මෙය පහසුවෙන් නැවත ලිවිය හැකිය:

StringBuilder strB = new StringBuilder();
while(someCondition){
    //...
    strB.append(appendingString);
}
String str = strB.toString();

මෙම රටාව (වෙනස් කළ නොහැකි ප්‍රති result ලය සහ දේශීය විකෘති අතරමැදි අගයක්) වෙනත් දේ සඳහා ද යොදා ගත හැකිය

නමුත් ඒ හැරෙන්නට ඔබ අවතාර පසුපස හඹා යාම වෙනුවට සැබෑ බාධකය සොයා ගැනීමට පැතිකඩක් ඇද ගත යුතුය


මෙම StringBuilderප්‍රවේශයේ ඇති ලොකුම වාසිය වන්නේ පූර්ව ප්‍රමාණයයි , StringBuilderඑමඟින් කිසි විටෙකත් යටින් පවතින අරාව ඉදිකිරීම්කරු සමඟ නැවත වෙන් කිරීම අවශ්‍ය නොවේ StringBuilder(int). මෙය වෙන් කිරීමකට වඩා තනි වෙන් 1+Nකිරීමක් කරයි.

2
Ar ජැරොඩ් රොබර්සන් ස්ට්‍රිංබිල්ඩර් අවම වශයෙන් වත්මන් ධාරිතාව මෙන් දෙගුණයක් හෝ වෙනත් වචන වලින් කිවහොත් ලොග් (එන්) ප්‍රතිපාදන සඳහා පමණක් ධාරිතාව on ාතීය ලෙස වර්ධනය වේ
රැට්චෙට් ෆ්‍රීක්

7

ජෝෂුවා බ්ලොච් (ජාවා වේදිකා නිර්මාණකරුවෙකු) 2001 දී සිය බලපෑමෙන් යුත් ජාවා නම් පොතේ මෙසේ ලිවීය .

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


1
ජාල සම්බන්ධතාවය වැනි දේ තිබියදීත්, වැදගත් වන්නේ සම්බන්ධතා හා සම්බන්ධ GC වෙන් කරන ලද වස්තූන් නඩත්තු කිරීම නොව, GC විසින් කළමනාකරණය කරන ලද ලෝකයෙන් පිටත පවතින සම්බන්ධතා සමූහය පවත්වා ගැනීමයි. වස්තූන් එක්රැස් කිරීම ප්‍රයෝජනවත් විය හැකි අවස්ථා තිබේ; ඒවායින් බොහොමයක් එකම වස්තුවකට යොමු යුගලයක් සමාන-නමුත් වෙනස් වස්තූන් සඳහා යොමු යුගලයකට අර්ථ නිරූපණයට සමාන විය හැකි නමුත් ඒ කෙසේ වෙතත් යම් වාසි ඇත. උදාහරණයක් ලෙස, අක්ෂර පනස් දහසක එකම
නූලට

2
... එම දිගෙහි එකිනෙකට වෙනස් නමුත් සමාන නූල් දෙකක් ගැන සඳහන් කිරීමට වඩා වේගවත්.
සුපර් කැට්

5

මෙය සැබවින්ම නිශ්චිත යෙදුම මත රඳා පවතී, එබැවින් පොදුවේ පැවසීම දුෂ්කර ය. කෙසේ වෙතත්, වස්තුව නිර්මාණය කිරීම ඇත්ත වශයෙන්ම යෙදුමක කාර්ය සාධන බාධකයක් නම් මම පුදුම වෙමි. ඒවා මන්දගාමී වුවද, කේත-ශෛලියේ ප්‍රතිලාභ බොහෝ විට කාර්ය සාධනය ඉක්මවා යනු ඇත (එය ඇත්ත වශයෙන්ම පරිශීලකයාට නොපෙනේ නම්)

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


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

3

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

JVM මතක අවශ්‍යතා සම්බන්ධයෙන් ගත් කල, ජාවා 8 සඳහා රැඳී සිටින්න, ඔබට -Xmx නියම කිරීමට පවා අවශ්‍ය නැත, මෙටා අවකාශ සැකසීම් මගින් JVM මතක අවශ්‍යතාවය සපුරාලනු ඇති අතර එය ස්වයංක්‍රීයව වර්ධනය වේ.


කිසියම් පිළිතුරක් ඡන්දය දීමේදී ජනතාව අදහස් දැක්වීමක් කළහොත් එය ඉතා ruc ලදායී වනු ඇත. සියල්ලට පසු අප සියල්ලන්ම දැනුම බෙදාහදා ගැනීම සඳහා වන අතර නිසි හේතුවක් නොමැතිව විනිශ්චය කිරීම කිසිදු අරමුණක් ඉටු නොකරනු ඇත.
AKS

1
කිසියම් පිළිතුරක් ඡන්දය දෙන පරිශීලකයින්ට එම පිළිතුර පිළිබඳව අදහස් දැක්වීමේදී දැනුම් දීමට තොග හුවමාරුවට යම් යාන්ත්‍රණයක් තිබිය යුතුය.
AKS

1

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

එබැවින් එය නොමිලේද නැද්ද යන්න සොයා ගැනීමට පෙර පන්ති සාදන්නා කරන්නේ කුමක්දැයි සලකා බලන්න.


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

2
අමතර පිරිවැය 'if (firstTime)' වෙත ගෙන යන්නේ නම්, ලූපයක පන්තිය ප්‍රතිනිර්මාණය කිරීමට වඩා පන්තිය නැවත භාවිතා කිරීමට වඩා මිල අධිකය.
ඇලෙක්ස්

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

1

ජාවා හි GC ඇත්ත වශයෙන්ම "පුපුරා ගිය" ආකාරයකින් වස්තූන් විශාල ප්‍රමාණයක් නිර්මාණය කිරීම සම්බන්ධයෙන් ඉතා ප්‍රශස්ත කර ඇත. මට තේරුම් ගත හැකි දෙයින් ඔවුන් “ඊඩ්න් අවකාශය” ලෙස හඳුන්වන මතක අවකාශයක් තුළට “පුපුරා යාමේ චක්‍රය” සඳහා අනුක්‍රමික විබෙදන්නෙකු (විචල්ය ප්‍රමාණයේ ඉල්ලීම් සඳහා වේගවත්ම හා සරලම ඕ (1) විබෙදන්නෙකු) භාවිතා කරයි. GC චක්‍රයකට පසු ඔවුන් එකින් එක එකතු කර ගත හැකි ස්ථානයකට ගෙන යනු ලැබේ.

ඒ සමඟම, ඔබේ කාර්ය සාධන අවශ්‍යතා ප්‍රමාණවත් තරම් තීරණාත්මක නම් (සැබෑ පරිශීලක අවශ්‍යතා අනුව මනිනු ලැබේ), එවිට වස්තූන් පොදු කාර්යයක් සිදු කරයි, නමුත් නිර්මාණය / වෙන් කිරීම අනුව මම එය එතරම් සිතන්නේ නැත. එය පිළිබිඹු සහ ගතික සරයක වැනි සහයෝගය සංකල්ප අවශ්ය ලෙස සඳහනක් දේශීය සමාජය ජාවා සියලු වස්තු අතිරේක ප්රමාණය සමඟ කරන්න වැඩි කර ඇත ( Floatමීට වඩා විශාල floatඑහි කඳවුරු ගතවීම අවශ්යතා සමග 64-bit 4 ගුණයක් විශාල වගේ දෙයක් බොහෝ විට, සහ Floatමා තේරුම් ගත් දෙයට අනුකූලව ගබඩා කිරීම සඳහා අරාව අනිවාර්යයෙන්ම සහතික නොවේ).

ජාවා හි මා දුටු වඩාත්ම සිත් ඇදගන්නා සුළු කරුණක් නම්, එය මගේ ක්ෂේත්‍රයේ බර පංතියේ තරඟකරුවෙකු ලෙස සැලකීමයි (VFX) අන්තර්ක්‍රියාකාරී, බහු-ත්‍රෙඩ් සම්මත මාර්ග ට්‍රේසරයක් (අක්‍රමවත් හැඹිලි හෝ BDPT හෝ MLS හෝ වෙනත් කිසිවක් භාවිතා නොකිරීම) CPU මඟින් ශබ්දය රහිත රූපයකට වඩා ඉක්මණින් අභිසාරී වන තත්‍ය කාලීන පෙරදසුන් සපයයි. මම C ++ හි වෘත්තිකයන් සමඟ වැඩ කර ඇති අතර, ඔවුන්ගේ වෘත්තීන් එවැනි දේ සඳහා කැප කරමි.

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

ජාවා වස්තු නිර්මාණය කිරීම ඔබට කළ හැකි වඩාත්ම මිල අධික මෙහෙයුම බව මට සගයකු පැවසීය. එබැවින් මට නිගමනය කළ හැක්කේ හැකි තරම් වස්තූන් කිහිපයක් නිර්මාණය කිරීම පමණි.

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


1
ඔබගේ පළමු ඡේදය නිවැරදි මාර්ගයේ ඇත. ඊඩන් සහ තරුණ අවකාශයන් දළ වශයෙන් පිටපත් එකතු කරන්නන් භාවිතා කරයි. මියගිය වස්තූන් සඳහා 0 පිරිවැය. මෙම ඉදිරිපත් කිරීම මම බෙහෙවින් නිර්දේශ කරමි . පැත්තක සටහනක, මෙම ප්‍රශ්නය 2012 සිට බව ඔබට වැටහේවි නේද?
ජිමී ජේම්ස්

Im ජිමී ජේම්ස් මම කම්මැලියි, පැරණි ප්‍රශ්න ඇතුළුව ප්‍රශ්න ඇසීමට කැමතියි. මම හිතන්නේ මිනිස්සු මගේ අනියම් සම්බන්ධයට කමක් නැහැ! :-D
ඩ්‍රැගන් බලශක්ති

Im ජිමී ජේම්ස් කොටු කළ වර්ග වලට අමතර මතක අවශ්‍යතා ඇති අතර අරාව තුළ පරස්පර විරෝධී බවට සහතික නොවීම තවදුරටත් නොවේද? ජාවා හි වස්තූන් අපිරිසිදු යැයි මම සිතමි. නමුත් ඒවා සාපේක්ෂව මිල අධික විය හැකි එක් අවස්ථාවකි. float[]එදිරිව Float[]. මීට පෙර මිලියනයක අනුපිළිවෙලින් සැකසීම තත්පරයට වඩා වේගවත් විය හැකිය.
ඩ්‍රැගන් බලශක්ති

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

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

0

මිනිසුන් පවසා ඇති පරිදි, ජාවා හි වස්තු නිර්මාණය කිරීම විශාල පිරිවැයක් නොවේ (නමුත් එකතු කිරීම වැනි බොහෝ සරල මෙහෙයුම් වලට වඩා මම ඔට්ටු අල්ලමි) ඔබ එය ඕනෑවට වඩා වළක්වා නොගත යුතුය.

එය තවමත් පිරිවැයක් යැයි පැවසූ අතර සමහර විට ඔබ හැකි තරම් වස්තුවක් සීරීමට උත්සාහ කරන බවක් පෙනෙන්නට තිබේ. නමුත් මෙය ගැටලුවක් බව පැතිකඩෙන් පෙන්නුම් කිරීමෙන් පසුව පමණි.

මාතෘකාව පිළිබඳ විශිෂ්ට ඉදිරිපත් කිරීමක් මෙන්න: https://www.cs.virginia.edu/kim/publicity/pldi09tutorials/memory-effic-java-tutorial.pdf


0

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


පෙර පිළිතුරු 15 කින් පැහැදිලි කර ඇති කරුණු වලට වඩා සැලකිය යුතු කිසිවක් මෙය ඉදිරිපත් කරන බවක් නොපෙනේ. මීට වසර 2 කට පෙර අසන ලද සහ ඉතා ගැඹුරු පිළිතුරක්
gnat
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.