୍⯡♫ᅋἲே 㟁Ꮚ᝟ሗ㏻ಙᏛ఍                      ಙᏛᢏሗ‫ٻ‬‫ٻڇڮڞڤکڪڭگڞڠڧڠٻڡڪٻڠگڰگڤگڮکڤٻڠڣگ‬                     ‫ٻۏۍۊۋۀڭٻۇڼھۄۉۃھۀگٻڠڞڤڠڤ‬ࣾஂ๏ਓ ిࢠ৘ใ௨৴ֶձ৴ֶٕใ‫ٻڮڭڠڠکڤڢکڠٻکڪڤگڜڞڤکڰڨڨڪڞٻڟکڜٻکڪڤگڜڨڭڪڡکڤ‬                ‫ٻڄڎڋڈڔڌڋڍڃٻڒڐڈړڌڋڍڮڮ‬THE INSTITUTE OF ELECTRONICS,TECHNICAL REPORT OF IEICE.
INFORMATION AND COMMUNICATION ENGINEERS‫ٻ‬

GitHub ͷ Java ϦϙδτϦΛ༻͍ͨऑࢀরͷར༻࣮ଶͷௐࠪΩϜɹςϤϯ†ං‫ޙ‬๕थ†㤟ຊਅ༎†ೇຊ ਅೋ†† େࡕେֶେֶӃ৘ใՊֶ‫ڀݚ‬Պ
˟565–0871 େࡕ෎ਧాࢢࢁాٰ 1–5
E-mail: †{kim-tyng,higo,shinsuke,kusumoto}@ist.osaka-u.ac.jp͋Β·͠ଟ͘ͷϓϩάϥϛϯά‫Ͱޠݴ‬͸ΨϕʔδίϨΫγϣϯΛར༻ͯ͠ϝϞϦ؅ཧΛࣗಈԽ͍ͯ͠Δɽ͔͠͠ϝϞϦ؅ཧͷࣗಈԽʹΑͬͯ༧‫͵ͤظ‬ϝϞϦϦʔΫͳͲͷ໰୊͕ൃੜ͢Δ৔߹͕͋Γɼղܾࡦͱͯ͠ऑࢀর (Weakreference) ͕ఏҊ͞Ε͍ͯΔɽ͔͠͠ͳ͕ΒɼϝϞϦ؅ཧ͕ࣗಈԽ͞Ε͍ͯΔγεςϜͰͷऑࢀরͷར༻ʹ͸ɼϝϞϦղ์ͷλΠϛϯάͳͲߟྀ͢΂͖͜ͱ͕ଟ͋͘Γɼ։ൃऀʹͱͬͯ೉͠͞Λ൐͏ɽ͕ͨͬͯ͠ຊ‫Ͱڀݚ‬͸Φʔϓϯιʔειϑτ΢ΣΞͷϗεςΟϯάαʔϏεͰ͋Δ GitHub Λ༻͍ɼऑࢀরͷར༻࣮ଶΛௐࠪͨ͠ɽຊ‫Ͱڀݚ‬͸ Java‫ޠݴ‬Λର৅ͱͯ͠ɼऑࢀর͕ಋೖ͞Ε͍ͯΔϦϙδτϦͷυϝΠϯ‫ͼٴ‬ऑࢀরͷಋೖ࣌‫ظ‬ɼར༻ํ๏ɼςετͷ༗ແɼಋೖࣦഊͷέʔεΛௐࠪͨ͠ɽௐࠪʹΑΓɼશମ 202 ϦϙδτϦͷ໿ 3 ෼ͷ 1 Ͱ͋Δ 73 ‫ݸ‬ͷϦϙδτϦͰऑࢀর͕ར༻͞Ε͓ͯΓɼ·ͨऑࢀরͷ࢖͍ํͱͯ͠ςετίʔυͰͷར༻͕࠷΋ଟ͍͜ͱ͕ࣔ͞Εͨɽ͞ΒʹɼऑࢀরΛར༻͍ͯ͠ΔΦʔϓϯιʔειϑτ΢ΣΞʹରͯ͠ɼऑࢀর͕࣮ࡍʹ༗ޮ͔ͷ࣮‫ݧ‬Λߦͬͨɽ࣮‫ʹݧ‬ΑΓɼऑࢀরͷར༻ͰϝϞϦϦʔΫΛ๷ࢭͰ͖Δ͜ͱ͕ূ໌͞ΕͨɽΩʔϫʔυ ऑࢀরɼΨϕʔδίϨΫγϣϯɼJavaɼGitHub

1. · ͑ ͕ ͖΢ΣΞ։ൃऀ͕ճऩͤ͞ΔΦϒδΣΫτΛࢦఆ͢Δํ๏ͱͯ͠ɼऑࢀর (Weak reference) ͱ‫ݺ‬͹ΕΔࢀর͕ఏҊ͞Ε͍ͯΨϕʔδίϨΫγϣϯ (Garbage Collection) ͸ Java ͳͲͷΔ [3]ɽऑࢀর͸ऑ͍ࢀরͱ͍͏ҙຯΛ࣋ͪɼΨϕʔδίϨΫଟ͘ͷϓϩάϥϛϯά‫Ͱޠݴ‬ར༻͞Ε͍ͯΔɼࣗಈϝϞϦ؅ཧγϣϯͷ࢓૊Έ্Ͱ௨ৗͷࢀরͱҧ͏ѻ͍Λ͞ΕΔɽ௨ৗͷࢀΛߦ͏ͨΊͷγεςϜͰ͋Δ [1]ɽΨϕʔδίϨΫγϣϯΛར༻র͸ɼऑࢀরͱͷରൺͰ ‫ࢀڧ‬র (Strong reference) ͱ΋‫ݺ‬͹Ε͢Δ͜ͱʹΑͬͯɼιϑτ΢ΣΞ։ൃऀ͸ϝϞϦ؅ཧʹ͍ͭͯΔɽऑࢀরͷΈͰࢀর͞Ε͍ͯΔΦϒδΣΫτ͸౸ୡՄೳͰͳ

ߟ͑Δඞཁ͕ͳ͘ͳΔɽ͔͠͠ɼΨϕʔδίϨΫγϣϯʹΑΔ

͍΋ͷͱͯ͠ѻΘΕɼΨϕʔδίϨΫγϣϯͷճऩର৅ͱ൑அϝϞϦ؅ཧͷࣗಈԽʹ͸໰୊఺΋ଘࡏ͢Δɽ͞ΕΔɽΑͬͯɼऑࢀরΛ࢖ͬͯΦϒδΣΫτΛࢀর͢Δ͜ͱΨϕʔδίϨΫγϣϯͱ͸ɼෆཁʹͳͬͨΦϒδΣΫτΛࣗͰɼΨϕʔδίϨΫγϣϯͷର৅ͱͯ͠ࢦఆ͢Δ͜ͱ͕Ͱ͖Δɽಈతʹճऩ͢Δ࢓૊ΈͰ͋ΔɽΦϒδΣΫτ͕ෆཁͰ͋Δ͔൱ऑࢀরΛ༗ޮʹ࢖͏ͨΊʹ͸͍͔ͭ͘ߟྀ͢΂͖఺͕ଘࡏ͔͢͸‫ج‬ຊతʹଞͷΦϒδΣΫτ͔Βͷ౸ୡՄೳੑͰ൑அ͢Δɽ

Δɽ·ͣɼऑࢀর͓͍ͯͨ͠ΦϒδΣΫτ͕ճऩͷର৅ʹͳΔଞͷΦϒδΣΫτ͔Βࢀর͞Ε͍ͯΔΦϒδΣΫτ͸౸ୡՄೳλΠϛϯάΛߟ͑ͳ͚Ε͹ͳΒͳ͍ɽଞͷΦϒδΣΫτ͔ΒͷͰ͋ΓɼෆཁͰ͸ͳ͍ΦϒδΣΫτͱ൑அ͞Εͯճऩ͞Εͳ͍ɽ‫ࢀڧ‬র͕ 1 ͭͰ΋͋ΔΦϒδΣΫτ͸ճऩͷର৅ʹͳΒͣɼऑଞͷΦϒδΣΫτ͔Βͷࢀর͕ଘࡏ͠ͳ͍ΦϒδΣΫτ͸౸ୡࢀরͷΈ͔Βࢀর͞ΕΔΦϒδΣΫτ͕࣮ࡍʹΨϕʔδίϨΫෆೳͰ͋Γɼ͜ͷΑ͏ͳΦϒδΣΫτ͸ෆཁͳΦϒδΣΫτͱγϣϯʹΑΔճऩͷର৅ͱͳΔɽ͕ͨͬͯ͠ɼΦϒδΣΫτ͕ͯ͠ΨϕʔδίϨΫγϣϯʹΑΔճऩͷର৅ͱͳΔɽΨϕʔδऑࢀরͷΈ͔Βࢀর͞ΕΔɼ͋Δ͍͸ΦϒδΣΫτ΁ͷ‫ࢀڧ‬রίϨΫγϣϯͰ͸͜ͷΑ͏ͳ࢓૊ΈͰෆཁͳΦϒδΣΫτΛ͕ࣗશ෦ͳ͘ͳΔλΠϛϯάΛ༧ଌ͠ɼΦϒδΣΫτ͕ෆཁʹಈ‫ݕ‬ग़͠ɼΦϒδΣΫτͷճऩͱϝϞϦ؅ཧΛߦ͍ͬͯΔɽ͠ͳͬͨ࣌ʹճऩͷର৅ͱͳΔΑ͏ʹιϑτ΢ΣΞΛઃ‫͢ܭ‬Δඞ͔͠ɼࠓ‫࢖ޙ‬ΘΕͳ͍ΦϒδΣΫτ͕ଞͷΦϒδΣΫτ͔Β౸ཁ͕͋Δɽ࣍ʹɼऑࢀরΛ༻͍ͯճऩͷର৅ͱͳͬͨΦϒδΣୡՄೳͰ͋Δ৔߹ɼ͢ͳΘͪଞͷΦϒδΣΫτ͔Βͷࢀর͕ 1Ϋτ͕ΨϕʔδίϨΫγϣϯʹΑ࣮ͬͯࡍʹճऩ͞ΕΔλΠϛͭͰ΋͋Δ৔߹͕ଘࡏ͢Δɽ͜ͷΑ͏ͳ৔߹ɼ࣮ࡍʹ͸ෆཁͳϯά΋ߟ͑ͳ͚Ε͹ͳΒͳ͍ɽΦϒδΣΫτ͕ճऩର৅ʹͳͬΦϒδΣΫτͰ͋ͬͯ΋ΨϕʔδίϨΫγϣϯ͔Β͸ෆཁͰ͋ͨΒ͙͢ʹճऩ͞ΕΔͷͰ͸ͳ͘ɼҰఆͷ࣌ؒ͝ͱΨϕʔδίΔͱ൑அ͠ͳ͍ͷͰɼΦϒδΣΫτ͸ճऩ͞Εͳ͘ͳΔɽͦͷϨΫγϣϯ͕ಈ࣌͘ʹճऩ͕ߦΘΕΔɽΨϕʔδίϨΫγϣϯ

ͨΊɼ࢖ΘΕͳ͍ΦϒδΣΫτ͕ϝϞϦ্ʹ࢒Δঢ়ଶʹͳΓɼʹΑΔΦϒδΣΫτͷճऩ࣌ɼऑࢀরʹ͸ψϧϙΠϯλ (NullϝϞϦϦʔΫ (Memory leak) ͱͳΔ [2]ɽPointer) ͕ೖΔͷͰɼ͜ͷΑ͏ͳλΠϛϯάΛߟ͑ͣʹऑࢀরΨϕʔδίϨΫγϣϯͰ͸ɼιϑτ΢ΣΞ։ൃऀ͕ಛఆͷΦΛ࢖͏ͱɼ༧‫͵ͤظ‬Τϥʔ͕‫͖ى‬Δ͜ͱʹͳΔɽϒδΣΫτΛࢦఆͯ͠‫੍ڧ‬తͳճऩΛࢦࣔͰ͖ͳ͍ɽιϑτ

- 31 -—1—This article is a technical report without peer review, and its polished and/or extended version may be published elsewhere.

Copyright ©201 by IEICE

(java.util.HashMap)ʢ஫ 1ʣ ͱ‫ػ‬ೳ͸΄΅ಉ͡Ͱ͋Δɽҧ͍͸ɼ

1 WeakReference<Socket> ref= new WeakReference<Socket>(new Socket());...
90 Socket s = ref.get();91 if (s == null) {92//ड़ঈ४ख़ॡॺऋ৚ઽऔोञৃ় (ৢਦીവभ૾ଙ)93 }94 else {95//ৢଞभৃ় (ৢਦୄठभ૾ଙ)96 }ऑࢀর͞Ε͍ͯΔ Key ΦϒδΣΫτ͕ճऩ͞ΕΔͱɼϖΞͷValue ΦϒδΣΫτ΁ͷࢀর͕ͳ͘ͳΓɼValue ΦϒδΣΫτ΁ͷ‫ࢀڧ‬র͕ͳ͚Ε͹ Key ΦϒδΣΫτͱҰॹʹճऩ͞ΕΔ͜ͱͰ͋Δɽ·ͨɼෆཁʹͳͬͨ Key ΦϒδΣΫτͷ Key-ValueϖΞ͸ɼWeakHashMap ͔Βࣗಈతʹআ‫͞ڈ‬ΕΔͷͰɼ։ൃऀ͕ෆཁͳϖΞͷ࡟আʹ͍ͭͯߟ͑ͳͯ͘΋ྑ͍ͱ͍͏ར఺͕͋Δɽ2. 2 ௐࠪର৅ͷϦϙδτϦ

ਤ 1: WeakReference ͷίʔυྫௐࠪର৅͸ GitHubʢ஫ 2ʣ ্ʹެ։͞Ε͍ͯΔ Java ͷϦϙδΨϕʔδίϨΫγϣϯΛ࠾༻͍ͯ͠Δϓϩάϥϛϯά‫Ͱޠݴ‬ιϑτ΢ΣΞ։ൃΛߦ͏৔߹ɼࣗಈϝϞϦ؅ཧͱ͍͏ར఺ͷͨΊɼҰൠతͳ։ൃऀ͸ࢀর΍ΦϒδΣΫτͷճऩͳͲɼϝϞϦ؅ཧʹؔͯ͠͸͋·Γߟ͑ͳ͍ɽΑͬͯɼࢀর͕ͳ͘ͳΔλΠϛϯάͱΦϒδΣΫτ͕ճऩ͞ΕΔλΠϛϯάΛ༧ଌ͠ɼෆཁʹͳͬͨΦϒδΣΫτΛద੾ͳ࣌఺ͰճऩͰ͖ΔΑ͏ʹऑࢀরΛ࢖͏͜ͱ͸ɼҰൠతͳ։ൃऀʹͱͬͯ૬౰ͳ೉͠͞Λ൐͏ͱஶऀΒ͸ߟ͑Δɽιϑτ΢ΣΞ։ൃऀ͕ऑࢀরΛಋೖ͠Α͏ͱ
͢Δ৔߹ɼऑࢀরʹର͢Δཧղ΋ඞཁͰ͋Δ͕ɼऑࢀর͕࣮ࡍʹͲ͏࢖ΘΕ͍ͯΔ͔ͷ࣮ྫ΋ॏཁͰ͋Δɽ͔͠͠ɼऑࢀরͷτϦͰ͋Δɽຊ‫Ͱڀݚ‬͸ɼऑࢀর͕ར༻͞Ε͍ͯΔϦϙδτϦͷυϝΠϯΛ٬‫؍‬తʹௐࠪ͢ΔͨΊʹɼBorges ΒʹΑΔௐࠪσʔλʢ஫ 3ʣͷϦϙδτϦͷ͏ͪɼ202 ‫ݸ‬ͷ Java ϦϙδτϦΛௐࠪର৅ͱͯ͠ఆΊͨ [4]ɽͦͷ͏ͪऑࢀর͕ར༻͞Ε͍ͯΔϦϙδτϦ͸ 73 ‫ͨͬ͋Ͱݸ‬ɽҰ෦ͷௐࠪͰ͸ίʔυ΍ߋ৽ཤྺΛ௚઀‫͕ͳݟ‬Βௐ΂Δඞཁ͕͋ͬͨͷͰɼऑࢀর͕ར༻͞Ε͍ͯΔ 73 ‫ݸ‬ͷϦϙδτϦͷ͏ͪɼStars ਺্Ґ 10 ‫ݸ‬ͷϦϙδτϦͷΈΛର৅ͱͯ͠ௐࠪ
Λߦͬͨɽද 1 ʹௐࠪର৅ͷϦϙδτϦ໊ͱ Stars ਺Λࣔ͢ɽStars ਺͸ 2018 ೥຤࣌఺ͷ஋Ͱ͋Δɽ

3. Research Questionsར༻࣮ଶʹ͍ͭͯͷௐࠪ͸ஶऀΒ͕஌Δ‫ݶ‬Γͳ͍ɽ

GitHub ͷϦϙδτϦʹରͯ͠σʔλϚΠχϯάΛߦͬͨௐࠪ‫ʹڀݚ‬͸༷ʑͳ΋ͷ͕͋Δ [4], [5]ɽ·ͨɼJava ͷϝϞϦϦʔΫͷ໰୊Λղܾ͠Α͏ͱͯ͠ߦͬͨ‫ڀݚ‬΋͍͔ͭ͘ଘࡏ͍ͯ͠
Δ [2], [6]ɽ͔͠͠ GitHub ͷϦϙδτϦΛର৅ʹɼϝϞϦϦʔΫͷղܾࡦͱͯ͠ఏҊ͞Ε͍ͯΔऑࢀরͷར༻࣮ଶΛௐ΂ͨ‫ݚ‬‫ڀ‬͸ଘࡏ͍ͯ͠ͳ͍ɽͦ͜Ͱɼऑࢀরͷར༻࣮ଶʹؔ͢Δௐࠪ
ͷඞཁੑ͕͋Δͱߟ͑ɼຊ‫ڀݚ‬Λ࢝Ίͨɽຊ‫Ͱڀݚ‬͸ɼΨϕʔδίϨΫγϣϯΛ࠾༻͍ͯ͠Δ Java Ͱ࡞੒͞ΕͨΦʔϓϯιʔειϑτ΢ΣΞʹ͓͚Δऑࢀরͷར༻࣮ଶΛௐࠪͨ͠ɽௐࠪͰ͸ɼऑࢀর͕࢖ΘΕ͍ͯΔϦϙδτϦͷυϝΠϯͱऑࢀরͷಋೖ࣌‫ظ‬ɼར༻ํ๏ɼςετͷ༗ແɼಋೖࣦഊͷέʔεΛௐ΂ͨɽ͞Βʹ 1 ͭͷΦʔϓϯιʔειϑτ΢ΣΞʹର࣮ͯ͠‫ݧ‬Λߦ͍ɼऑࢀরͷར༻͕༗ޮ͔Λௐ΂ͨɽ

2. ४ௐࠪʹ͋ͨΓɼ6 ͭͷ Research Question (RQ) Λઃఆͨ͠ɽຊ‫ڀݚ‬ͷௐࠪΑΓ͜ΕΒͷ RQ ʹର͢Δ౴͑Λ໌Β͔ʹ͢Δ͜ͱͰɼऑࢀরͷར༻࣮ଶΛਂ͘ཧղͰ͖Δͱߟ͑Δɽ

RQ1: ͲͷΑ͏ͳυϝΠϯͷϦϙδτϦͰΑ͘ऑࢀরΛར༻͍ͯ͠Δ͔ ऑࢀর͕ͲͷΑ͏ͳυϝΠϯͷϦϙδτϦͰΑ͘ར༻͞Ε͍ͯΔ͔Λ஌Γɼ·ͨͦͷϦϙδτϦͰ։ൃ͞Ε͍ͯΔιϑτ΢ΣΞ͕ͲͷΑ͏ͳಛ௃Λ͍࣋ͬͯΔ͔Λཧղ͢Δɽ

RQ2: ऑࢀর͕ಋೖ͞ΕΔ࣌‫ظ‬͸͍͔ͭ ֤ʑͷϦϙδτϦͰऑࢀরͷಋೖ࣌‫ظ‬Λௐ΂ɼऑࢀর͕ओʹͲͷΑ͏ͳ໨తͰಋೖ͞ΕΔ͔Λཧղ͢Δɽಋೖ࣌‫ظ‬͸ 2 ͭʹ෼ྨ͠ɼऑࢀরͷಋೖ໨త͕ιϑτ΢ΣΞͷ‫ػ‬ೳͷ࣮‫ݱ‬ͷͨΊͰ͋Δ͔ɼ΋͘͠͸ιϑτ΢ΣΞͷ‫ػ‬ೳͷվળɾอकͷͨΊͰ͋Δ͔Λௐ΂Δɽ

RQ3: ऑࢀরΛͲͷΑ͏ʹ࢖͍ͬͯΔ͔ ऑࢀর͕ͲͷΑ͏උ

2. 1 Java ʹ͓͚Δऑࢀরද 1: ௐࠪର৅ͷϦϙδτϦ

Java Ͱ͸ҎԼͷ 2 ͭͷΫϥεΛఏ‫͠ڙ‬ɼJava ͷ։ൃऀ͕ऑ

ϦϙδτϦ໊ࢀরΛར༻Ͱ͖ΔΑ͏ʹ͍ͯ͠Δ [7], [8]ɽ•WeakReference<T>•

WeakHashMap<K,V>

WeakReference<T> ͸ɼT ‫ܕ‬ΦϒδΣΫτͷऑࢀরΛද͢ΫϥεͰ͋ΔɽWeakReference<T> Λ࢖ͬͨίʔυྫΛਤ 1Stars

ReactiveX/RxJava

36,206elastic/elasticsearch

35,955spring-projects/spring-boot30,868square/okhttp

29,609google/guava

27,988PhilJay/MPAndroidChart

24,799ʹࣔ͢ɽऑࢀর͓͍ͯͨ͠ΦϒδΣΫτ (ਤ 1 ͷ 1 ߦ໨ͷ

spring-projects/spring-framework 24,612

new Socket()) ͕ΨϕʔδίϨΫγϣϯʹΑͬͯճऩ͞Εͨ৔

bumptech/glide

23,869߹ɼऑࢀরʹψϧϙΠϯλ͕ೖΔɽ͕ͨͬͯ͠ɼਤ 1 ͷ 91 ߦ

square/leakcanary

21,061໨ͷΑ͏ʹɼऑࢀরͷࢀরઌ͕ψϧϙΠϯλͰ͋Δ͔֬ೝΛߦ

zxing/zxing

20,623͍ɼ࢖͓͏ͱ͢ΔΦϒδΣΫτ͕ճऩ͞Εͨ৔߹ͱճऩ͞Εͳʢ஫ 1ʣɿhttps://docs.oracle.com/javase/8/docs/api/java/util/HashMap.html

͔ͬͨ৔߹Ͱ৚݅෼‫͢ذ‬Δ͜ͱ͕๬·͍͠ɽ

WeakHashMap ͸ Java Ͱఏ‫͞ڙ‬Ε͍ͯΔϋογϡϚοϓʢ஫ 2ʣɿhttps://github.com/ʢ஫ 3ʣɿhttps://goo.gl/73Sbvz- 32 -—2—ʹ࢖ΘΕ͍ͯΔ͔Λௐ΂Δɽ࣮৔໘ͰऑࢀরΛͲͷΑ͏ʹ࢖ͬͷߋ৽ཤྺͰΩʔϫʔυ͕‫·ؚ‬Ε͍ͯΕ͹ɼϑΝΠϧͷߋ৽͍࣌ͯΔ͔͕Θ͔Δͱɼऑࢀরͷओͳར༻ํ๏ΛཧղͰ͖ɼऑࢀʹऑࢀর͕ಋೖ͞Εͨ΋ͷͱ͢Δɽ

4. 3 RQ3: ࢖͍ํরΛར༻͢Δయ‫ܕ‬తͳίʔυͷύλʔϯΛ஌Δ͜ͱ͕Ͱ͖Δɽ

RQ4: ऑࢀর͸ςετ͞Ε͍ͯΔ͔ ඼࣭ΛߴΊΔͳͲͷཧ༝Ͱɼςετίʔυͷ࡞੒͸ιϑτ΢ΣΞͷ։ൃʹ͓͍ͯඞਢௐࠪର৅͸ද 1 ͷ 10 ‫ݸ‬ͷϦϙδτϦͰɼऑࢀর͕ར༻͞Ε
͍ͯΔ߹‫ ܭ‬95 ‫ݸ‬ͷιʔεϑΝΠϧͰ͋Δɽ

Ͱ͋Ζ͏ɽ͕ͨͬͯ͠ɼຊ‫Ͱڀݚ‬͸ऑࢀর͕࢖ΘΕ͍ͯΔίʔυยΛςετ͢Δɼςετίʔυ͕ଘࡏ͢Δ͔Λௐ΂Δɽऑࢀর͕࢖ΘΕ͍ͯΔίʔυΛ௚઀ಡΈɼऑࢀর͕Ͳ͏࢖ΘΕ͍ͯΔ͔ௐ΂ͨɽऑࢀরͷ࢖͍ํΛҎԼͷ 6 ͭʹ෼ྨͨ͠ɽ

RQ5: ऑࢀরͷಋೖʹࣦഊͨ͠έʔε͸͋Δ͔ ऑࢀরͷར•ςετ༻͕࣮ࡍʹ೉͍͔͠Λ֬ೝ͢ΔͨΊʹɼऑࢀরΛಋೖͨ͠‫ޙ‬ɼ•ϝϞϦϦʔΫͷ๷ࢭιϑτ΢ΣΞ։ൃऀ͕༧‫͔ͨͬͳ͖Ͱظ‬໰୊ͰऑࢀরͷಋೖΛ•Ωϟογϡ΍Ίͨέʔε͕͋Δ͔ௐ΂Δɽ•API ࣮૷•ίϝϯτෆཁͳॲཧͷআ‫ڈ‬

RQ6: ऑࢀরͷར༻͸࣮ࡍʹ༗ޮ͔ ऑࢀরͷར༻͕༗ޮ͔Λௐ΂ΔͨΊʹɼ1 ͭͷΦʔϓϯιʔειϑτ΢ΣΞΛର৅ʹ•ύϑΥʔϚϯεςετΛߦ͏ɽऑࢀরΛར༻ͨ͠‫ط‬ଘͷίʔυ“ςετ” ͸ऑࢀর͕ςετίʔυʹར༻͞Ε͍ͯΔ৔߹Ͱ͋ͱऑࢀরΛར༻͠ͳ͍Α͏ʹվมͨ͠ίʔυͷؒͰɼԿΒ͔ͷΔɽ“ϝϞϦϦʔΫͷ๷ࢭ” ͸ෆཁͳΦϒδΣΫτΛऑࢀরͷҧ͍͕͋Δ͔֬ೝ͢Δɽར༻ʹΑͬͯճऩͤ͞Δ৔߹Ͱ͋Δɽ“Ωϟογϡ” ͸ऑࢀরΛ࢖ͬͯɼ‫݁ࢉܭ‬ՌͳͲΛҰ࣌తʹอଘ͢Δ৔߹Ͱ͋Δɽ“API4. ௐ ࠪ ํ ๏࣮૷” ͸ऑࢀরͷ‫ػ‬ೳΛͦͷ·· API ͱͯ͠ఏ‫͠ڙ‬Α͏ͱ͢

4. 1 RQ1: ϦϙδτϦͷυϝΠϯΔ৔߹Ͱ͋Γɼྫ͑ WeakReference Λ‫ܧ‬ঝͨ͠Ϋϥε͕୅දௐࠪର৅͸ 2. 2 અͰड़΂ͨ 202 ‫ݸ‬ͷ Java ϦϙδτϦͰ͋Δɽ

తͳྫͰ͋Δɽ“ίϝϯτ” ͸ίʔυͰ͸ͳ͘ɼίϝϯτʹऑࢀϦϙδτϦͷυϝΠϯʹؔͯ͠͸ Borges ΒʹΑΔௐࠪσʔরͷΩʔϫʔυ (“WeakReference” ͱ “WeakHashMap”) ͕λΛ༻͍ͨ [4]ɽυϝΠϯ͸ҎԼͷ 6 ͭʹ෼ྨ͞Ε͍ͯΔɽ‫ׅ‬‫ݱ‬Ε͍ͯΔ৔߹Ͱ͋Δɽ“ෆཁͳॲཧͷআ‫ ”ڈ‬͸ɼऑࢀর͞Εͯ‫಺ހ‬͸ུ‫͋Ͱه‬Δɽ͍ΔΦϒδΣΫτ͕ճऩ͞ΕͨΒɼͦͷΦϒδΣΫτʹؔ͢ΔॲཧΛෆཁͰ͋ΔͱΈͳͯ͠ߦΘͳ͍৔߹Ͱ͋Δɽ

•Application software (Application)•

System software (System)

4. 4 RQ4: ςετίʔυͷଘࡏ•Web libraries and frameworks (Web)ௐࠪର৅͸ද 1 ͷ 10 ‫ݸ‬ͷϦϙδτϦͰɼऑࢀর͕ར༻͞Ε•

Non-web libraries and frameworks (Non-web)

͍ͯΔશମ 95 ‫ݸ‬ͷιʔεϑΝΠϧͷ͏ͪɼऑࢀর͕ςετͱ•

Software tools (Tools)ͯ͠࢖ΘΕ͍ͯͳ͍ 58 ‫ݸ‬ͷιʔεϑΝΠϧͰ͋Δɽ

•Documentation (Doc.)֤ιʔεϑΝΠϧͰ࣮૷͞Ε͍ͯΔΫϥε͕ςετ͞Ε͍֤ͯϦϙδτϦͰऑࢀর͕ར༻͞Ε͍ͯΔ͔൱͔͸ GitHubΔ͔Λ֬ೝ͢ΔͨΊʹɼΫϥε໊ͱ “Test” ͱ͍͏Ωʔϫʔυͷίʔυ‫ ࡧݕ‬APIʢ஫ 4ʣ Λ࢖ͬͯௐ΂ͨɽϦϙδτϦ͝ͱʹͰίʔυͷ‫ࡧݕ‬Λߦͬͨɽ·ͨɼऑࢀর͕ςετίʔυʹΑͬ

“WeakReference” ͱ “WeakHashMap” ͷΩʔϫʔυͰίʔυͯςετ͞Ε͍ͯΔ͔Λௐ΂ΔͨΊʹɼςετίʔυΛ௚઀ಡͷ‫ࡧݕ‬Λߦ͍ɼ‫݁ࡧݕ‬Ռʹ Java ͷιʔεϑΝΠϧͷ਺͕ 1 ‫ݸ‬ΜͰௐࠪΛߦͬͨɽ

4. 5 RQ5: ಋೖࣦഊͷέʔεҎ্͋Ε͹ɼऑࢀর͕࢖ΘΕ͍ͯΔ΋ͷͱͯ͠ѻͬͨɽ

4. 2 RQ2: ಋೖ࣌‫ظ‬ௐࠪର৅͸ද 1 ͷ 10 ‫ݸ‬ͷϦϙδτϦͰ͋Δɽௐࠪର৅͸ 2. 2 અͰड़΂ͨ 202 ‫ݸ‬ͷ Java ϦϙδτϦͷ͏ϦϙδτϦ͝ͱʹऑࢀরͷΩʔϫʔυ (“WeakReference” ͱͪɼऑࢀর͕ར༻͞Ε͍ͯΔ 73 ‫ݸ‬ͷϦϙδτϦͰ͋Δɽ

“WeakHashMap”) ͕‫·ؚ‬Ε͍ͯΔߋ৽ཤྺΛ໨ࢹͰௐࠪ͢Δऑࢀর͕ར༻͞Ε͍ͯΔϦϙδτϦͰͷιʔεϑΝΠϧͷߋ͜ͱͰɼऑࢀরͷಋೖΛ΍Ίͨέʔε͕͋Δ͔ௐ΂ͨɽ

4. 6 RQ6: ࣮‫ݧ‬ௐࠪ৽ཤྺΛղੳ͠ɼιʔεϑΝΠϧʹऑࢀর͕ॳΊͯಋೖ͞Εͨ࣌‫ظ‬Λௐ΂ͨɽಋೖ࣌‫ظ‬͸ιʔεϑΝΠϧͷੜ੒࣌ͱߋ৽࣌ͷ࣮‫ݧ‬ͷର৅ͱͯ͠ϦϙδτϦ bumptech/glide ͷίʔυΛ2 ͭʹ෼ྨ͠ɼҎԼͷ໨తͰऑࢀর͕ಋೖ͞ΕͨͱԾఆͨ͠ɽ

ར༻ͨ͠ɽGlideʢ஫ 5ʣ ͸ Android ༻ͷը૾ϩʔμͷϥΠϒϥϦ•ϑΝΠϧͷੜ੒࣌: ιϑτ΢ΣΞ΁ͷ‫ػ‬ೳͷ௥ՃͰ͋Δɽ͜ͷϥΠϒϥϦͰ͸ɼऑࢀরΛར༻ͯ͠ը૾σʔλ΁•ϑΝΠϧͷߋ৽࣌: ‫ʹط‬ଘࡏ͢Δ‫ػ‬ೳͷվྑɾอक

ͷΩϟογϡΛ಺෦Ͱ࣋ͭɽGlide ͷ‫ط‬ଘͷίʔυͱɼ‫ط‬ଘͷಋೖ࣌‫ظ‬͸ιʔεϑΝΠϧͷߋ৽ཤྺͰ “WeakReference”

Glide ͔ΒऑࢀরΛ࢖Θͳ͍Α͏ʹվมͨ͠ίʔυΛ༻͍ͯɼ͔ “WeakHashMap” ͷΩʔϫʔυ͕ొ৔͢Δ࣌‫ͱظ‬ఆΊͨɽ྆ऀͷ࣮‫ݧ‬Λߦͬͨɽ྆ऀͷύϑΥʔϚϯεΛൺֱ͢Δ͜ͱͰɼιʔεϑΝΠϧ͕ॳΊͯ࡞੒͞Εͨ࣌ͷߋ৽ཤྺͰΩʔϫʔυऑࢀর͕࣮ࡍʹ༗ޮ͔Λௐ΂ΔɽύϑΥʔϚϯεςετͰ͸ Glide Λར༻͢Δ࣍ͷ 2 छྨͷ͕‫·ؚ‬Ε͍ͯΕ͹ɼϑΝΠϧͷੜ੒࣌ʹऑࢀর͕ಋೖ͞Εͨ΋ͷͱ͢Δɽͦ͏Ͱ͸ͳ͘ɼιʔεϑΝΠϧͷੜ੒‫ޙ‬ͷ͍ͣΕ͔Android ΞϓϦΛ࣮ߦͤͨ͞ɽ

ʢ஫ 4ʣɿhttps://developer.github.com/v3/search/ʢ஫ 5ʣɿhttps://github.com/bumptech/glide- 33 -—3—९‫ش‬५ই॓ॖঝਯজএ४ॺজਯ



6\VWHP:HE
$SSOLFDWLRQ $//1RQZHE

7RROV



'RF

ॸ५ॺ

:($.

ওঔজজ‫ش‬ॡय़কॵ३গ$3,ৰಎଆૃ

ਤ 2: RQ1: ϦϙδτϦͷυϝΠϯ॥ওথॺਂਏऩ૪৶भ

-DYD'RF௾ுਤ 3: RQ3: ऑࢀরͷ࢖͍ํ•ը૾σʔλ΁ͷࢀর͋ΓΔɽද 3 ͷ݁ՌΛ‫ݟ‬ΔͱɼWeakReference ͱ WeakHashMap•ը૾σʔλ΁ͷࢀরͳ͠ͱ΋ʹϑΝΠϧͷੜ੒࣌ͷ৔߹͕ϑΝΠϧͷߋ৽࣌ͷ৔߹ΑΓ“ը૾σʔλ΁ͷࢀর͋Γ” ͷΞϓϦ͸ɼը૾શମͷϩʔυʹ3 ഒఔ౓ଟ͍ɽ͢ͳΘͪɼऑࢀর͸ओʹϑΝΠϧͷੜ੒࣌ʹಋ͓͍ͯશͯͷը૾σʔλ΁ͷ‫ࢀڧ‬রΛ࣋ͭ΋ͷͰ͋Δɽ“ը૾ೖ͕ߦΘΕΔ͜ͱΛௐࠪ݁Ռ͔Β֬ೝͰ͖ΔɽԾఆ͔Βߟ͑ͯσʔλ΁ͷࢀরͳ͠” ͷΞϓϦ͸ɼը૾͕ϩʔυ͞ΕͨΒ͙͢ΈΔͱɼऑࢀর͸ιϑτ΢ΣΞ΁ͷ‫ػ‬ೳͷ௥ՃͷͨΊʹಋೖ͞ʹͦͷը૾΁ͷࢀরΛফ͢΋ͷͰ͋Δɽ͢ͳΘͪɼΞϓϦଆͰΕΔ৔߹͕ଟͯ͘ɼ‫ط‬ଘ‫ػ‬ೳͷվྑ΍ιϑτ΢ΣΞͷอकͷͨ͸ը૾σʔλ΁ͷࢀরΛ࣋ͨͳ͍ɽΊʹऑࢀর͕ಋೖ͞ΕΔ৔߹͸গͳ͍ͱ͍͏͜ͱ͕‫͑ݴ‬Δɽ

5. 3 RQ3: ࢖͍ํϩʔυͤ͞Δը૾͸ฏ‫ ۉ‬4MB ͷ 400 ‫ݸ‬ͷ JPEG ը૾Ͱ͋Γɼશମͷ༰ྔ͸ 1.6GB ఔ౓Ͱ͋ͬͨɽը૾ͷϩʔυ͸ HTTPʢ஫ 6ʣΛհͯ͠ߦ͍ɼHFSͱ͍͏ιϑτ΢ΣΞΛ༻͍ͯը૾σʔλΛ഑৴͢ΔαʔόΛཱͯͨɽ࢖͍ํͷௐࠪ݁ՌΛਤ 3 ʹࣔ͢ɽ୯Ґ͸ϑΝΠϧ਺Ͱ͋Δɽ

1 ͭͷϑΝΠϧͰෳ਺ͷ࢖͍ํΛ͍ͯ͠Δ৔߹ɼॏෳ͕͋Δ΋ͷͱͯ͠ɼͦΕͧΕ͕Χ΢ϯτ͞ΕΔΑ͏ʹͨ͠ɽਤ 3 Λ‫ݟ‬ΔΞϓϦͷ࣮ߦʹ༻͍ͨΤϛϡϨʔλͷ‫ڥ؀‬͸ɼOS ͸ Androidͱɼऑࢀর͸ςετίʔυͰ࠷΋Α͘ར༻͞ΕΔ͜ͱ͕Θ͔Δɽ֤࢖͍ํʹ͓͚Δయ‫ܕ‬తͳίʔυͷྫΛ͍͔ͭࣔ͘͢ɽ·8.1 (Oreo) Ͱ͋ΓɼRAM ͸ 1.5GB Ͱ͋Δɽͣɼςετͱͯ͠ऑࢀরΛ࢖͏৔߹ͷྫΛਤ 4 ͷ (a) ʹࣔ͢ɽ5. ௐ ࠪ ݁ Ռਤ 4 ͷ (a) ͸ɼςετର৅ͷΦϒδΣΫτ (TestObserver to)

5. 1 RQ1: ϦϙδτϦͷυϝΠϯ

͕ɼೖྗ (Disposable d) Λ༩͑ͯॲཧΛߦͬͨ‫ޙ‬ɼೖྗͷΦυϝΠϯͷௐࠪ݁ՌΛਤ 2 ʹࣔ͢ɽਤ 2 Ͱ ALL ͸ 202 ‫ݸ‬ͷϒδΣΫτʹର͠ϝϞϦϦʔΫΛ‫ͱ͍͜ͳ͜͞ى‬Λςετ͢ΔJava ϦϙδτϦͷυϝΠϯͷ෼෍Ͱ͋ΓɼWEAK ͸ͦͷ͏ͪίʔυͰ͋Δɽऑࢀরʹ͸ࢀরΦϒδΣΫτͷճऩ‫ޙ‬ψϧϙΠऑࢀর͕ར༻͞Ε͍ͯΔ 73 ‫ݸ‬ͷϦϙδτϦͷυϝΠϯͷ෼෍ϯλ͕ೖΔͷͰɼJava ͷ API Λ࢖ͬͯΨϕʔδίϨΫγϣϯ

Ͱ͋ΔɽυϝΠϯผͷϦϙδτϦͷ਺Λ‫ݟ‬ΔͱɼNon-web ͷυΛ‫੍ڧ‬ಈ࡞ͤ͞ɼऑࢀরͷ஋ (10 ߦ໨ͷ wr.get()) ͕ψϧϙϝΠϯͰ͸ 44 ‫ݸ‬ͷϦϙδτϦͰऑࢀর͕ར༻͞Ε͓ͯΓɼ࠷ΠϯλͰ͋Δ͔֬ೝ͢Δ͜ͱͰɼϝϞϦϦʔΫͷଘࡏΛςετ΋ଟ͍݁Ռͱͳ͍ͬͯΔɽશମ͔Βͷׂ߹ (WEAK/ALL) ͰͰ͖Δɽ‫ݟ‬ΔͱɼSystem ͱ Tools ͷυϝΠϯͰɼ൒਺Ҏ্ͷϦϙδτਤ 4 ͷ (b) ͸ϝϞϦϦʔΫͷ๷ࢭͷͨΊɼதؒੜ੒෺ͱͯ͠ϦͰऑࢀর͕ར༻͞Ε͍ͯΔɽυϝΠϯผͷऑࢀর͕ར༻͞ΕͷΦϒδΣΫτ (Bitmap bitmap) Λऑࢀর͓͖ͯ͠ɼΨϕʔ͍ͯΔϦϙδτϦͷྫΛද 2 ʹࣔ͢ɽδίϨΫγϣϯʹΑͬͯճऩ͞ΕΔΑ͏ʹ͍ͯ͠ΔίʔυͰ͋

5. 2 RQ2: ಋೖ࣌‫ظ‬Δɽதؒੜ੒෺ͷΦϒδΣΫτ͕ճऩ͞Εͯऑࢀর͕ψϧϙΠಋೖ࣌‫ظ‬ͷௐࠪ݁ՌΛද 3 ʹࣔ͢ɽ୯Ґ͸ϑΝΠϧ਺Ͱ͋ϯλʹͳ͍ͬͯΔ৔߹͸ɼॲཧΛ։࢝͢ΔલʹΦϒδΣΫτΛ࠶ੜ੒͠ɼ·ͨͦͷΦϒδΣΫτ΁ͷऑࢀর΋࡞Γ௚͢ɽ͜͏

ද 2: RQ1: υϝΠϯผͷϦϙδτϦͷྫυϝΠϯϦϙδτϦ໊

Application HannahMitt/HomeMirror, k9mail/k-9System

͢Δ͜ͱʹΑͬͯɼதؒੜ੒෺ͷΦϒδΣΫτ͕ճऩͷର৅ͱͳΓɼϝϞϦϦʔΫΛ๷ࢭ͢Δ͜ͱ͕Ͱ͖Δɽ·ͨɼதؒੜ੒෺ͷΦϒδΣΫτ͕ճऩ͞ΕΔલʹಉ͡ॲཧΛߦ͏৔߹ʹ͸ɼ

ReactiveX/RxJava, apache/kafka

Websquare/okhttp, spring-projects/spring-framework

Non-webgoogle/guava, PhilJay/MPAndroidChart

Tools

elastic/elasticsearch, square/leakcanaryDoc.

aporter/coursera-android

ද 3: RQ2: ऑࢀরͷಋೖ࣌‫ظ‬ϑΝΠϧੜ੒࣌ ϑΝΠϧߋ৽࣌

WeakReference

247

81

WeakHashMap

7529߹‫ܭ‬322110ʢ஫ 6ʣɿhttp://www.rejetto.com/hfs/- 34 -—4—‫݁ࢉܭ‬ՌΛ࣋ͭΦϒδΣΫτͰϝϞϦϦʔΫ͕ൃੜ͢Δ͜ͱΛ

1 @Test public void successDetaches() {2Disposable d = Disposables.empty();3
WeakReference<Disposable> wr= new WeakReference<Disposable>(d);4
5
TestObserver to = new TestObserver(d);6to.test();7
8d = null;
9System.gc();
10assertNull(wr.get());
11 }๷ࢭͰ͖Δɽਤ 4 ͷ (c) ͸ෆཁͳॲཧΛճආ͍ͯ͠ΔίʔυͰ͋Δɽೖྗͱͯ͠༩͑ΒΕͨΦϒδΣΫτ (SizeDeterminer sd) Λऑࢀর͓͖ͯ͠ɼΦϒδΣΫτ͕ճऩ͞Ε͍ͯͨΒɼͦͷΦϒδΣΫτ΁ͷॲཧ (ਤ 4 ͷ (c) ͷ 9 ߦ໨) ΛෆཁͰ͋Δͱ൑அ͠ߦ
Θͳ͍ɽ

5. 4 RQ4: ςετίʔυͷଘࡏ֤ιʔεϑΝΠϧ΁ͷςετίʔυͷ༗ແʹؔ͢Δௐࠪ݁Ռ(a) ςετΛද 4 ʹࣔ͢ɽશମ 58 ‫ݸ‬ͷιʔεϑΝΠϧͷ͏ͪɼ38 ‫ݸ‬ͷϑΝΠϧʹରͯ͠ςετίʔυ͕ଘࡏͨ͠ɽ

1 class LineChartRenderer {2WeakReference<Bitmap> mDrawBitmap;
3void drawData() {4Bitmap bitmap = mDrawBitmap == null ?
null : mDrawBitmap.get();5if (bitmap == null) {6bitmap = Bitmap.createBitmap();
7
mDrawBitmap = new WeakReference<>(bitmap);
8}9drawBitmap(bitmap);
10}
11 }

ςετίʔυ͕ଘࡏ͢Δ 38 ‫ݸ‬ͷιʔεϑΝΠϧʹରͯ͠ɼऑࢀর͕ςετ͞Ε͍ͯΔ͔ௐ΂ͨ݁ՌΛද 5 ʹࣔ͢ɽऑࢀর
ͷςετ͸ 10 ‫ݸ‬ͷιʔεϑΝΠϧʹରͯ͠ଘࡏ͓ͯ͠Γɼऑࢀর͕࢖ΘΕ͍ͯΔશମ 58 ‫ݸ‬ͷιʔεϑΝΠϧͷதɼ໿ 6 ෼
ͷ 1 ఔ౓͔͠ऑࢀরͷςετΛߦ͍ͬͯͳ͍͜ͱ͕Θ͔ͬͨɽ

5. 5 RQ5: ಋೖࣦഊͷέʔεऑࢀরͷಋೖʹࣦഊͨ͠έʔε͕ଘࡏ͢ΔϦϙδτϦ໊ͱɼ֤ϦϙδτϦʹಋೖࣦഊͷέʔε͕Կ͔݅͋ͬͨΛද 6 ʹࣔ(b) ϝϞϦϦʔΫͷ๷ࢭ

͢ɽ10 ‫ݸ‬ͷϦϙδτϦͷதɼऑࢀরͷಋೖʹࣦഊͨ͠έʔε͕
1 class SizeDeterminerLayoutListener {2WeakReference<SizeDeterminer> sizeDeterminerRef;
34
SizeDeterminerLayoutListener(SizeDeterminer sd){5sizeDeterminerRef = new WeakReference<>(sd);6}7boolean onPreDraw() {8SizeDeterminer sd = sizeDeterminerRef.get();9if (sd != null) sd.check();
10return true;11}12 }͋ΔϦϙδτϦ͸ 3 ‫͋Ͱݸ‬Δɽ·ͨɼ3 ‫ݸ‬ͷϦϙδτϦͰऑࢀরͷಋೖʹࣦഊͨ͠έʔε͸߹‫ ܭ‬5 ݅͋ͬͨɽ

RxJava ͱ glide Ͱ͸ɼWeakReference ͷಋೖʹࣦഊ͍ͯͨ͠ɽࣦഊͷཧ༝͸ɼऑࢀর͓͍ͯͨ͠ΦϒδΣΫτ͕༧૝ΑΓ͸΍͘ճऩ͞ΕɼߦΘΕΔ΂͖ॲཧ͕Ͱ͖ͳ͘ͳ͔ͬͨΒͰ͋Δɽ͢ͳΘͪɼιϑτ΢ΣΞ։ൃऀ͕ऑࢀরʹΑͬͯࢀর͞ΕͨΦϒδΣΫτͷճऩͷλΠϛϯάΛΑ͘ߟ͑ͣɼऑࢀরΛར༻ͨ͠ͷͰ໰୊͕ൃੜͨ͠έʔεͰ͋Δɽspring-framework Ͱ͸ WeakHashMap ͷಋೖʹࣦഊ͍ͯ͠(c) ෆཁͳॲཧͷআ‫ڈ‬ͨɽWeakHashMap ͷಋೖ໨త͸‫݁ࢉܭ‬ՌΛΩϟογϡ͠ɼ࣮ਤ 4: RQ3: ऑࢀরͷ࢖͍ํͷྫߦ଎౓Λ଎͘͢Δ͜ͱͰ͋ͬͨɽ͔͠͠ɼWeakHashMap ͸ෳ਺ͷεϨουͰಉ࣌ʹར༻Ͱ͖ͳ͍໰୊͕͋ΓɼϚϧνίΞΦϒδΣΫτͷ࠶ੜ੒͕͍Βͳ͘ͳΔͷͰ‫ྔࢉܭ‬Λ‫ݮ‬গͰ͖ΔɽΩϟογϡͷ৔߹Ͱ΋ϝϞϦϦʔΫͷ๷ࢭͷ৔߹ͱίʔυͷύλʔϯ͸ಉ༷Ͱ͋Δ͕ɼϝϞϦϦʔΫͷ๷ࢭͰ͸தؒੜ੒෺ͷΦϒδΣΫτ͕ऑࢀর͞Ε͍ͯΔͱ͢Ε͹ɼΩϟογϡͰ͸ϓϩηοαͷγεςϜͰ͸Ή͠Ζ࣮ߦ଎౓͕஗͘ͳͬͨͷͰɼऑࢀরͷಋೖΛ΍ΊͨέʔεͰ͋Δɽ͜ͷέʔε͸։ൃऀ͕

WeakHashMap ͷಛ௃Λਂ͘ཧղͰ͖ͳ͔͍ͬͨͤͰ໰୊͕ൃੜͨ͠έʔεͰɼऑࢀরͷར༻͕೉͍͜͠ͱ͕ཧ༝Ͱ͸ͳ͔ͬͨɽ‫݁ࢉܭ‬ՌͷΦϒδΣΫτ͕ऑࢀর͞Ε͍ͯΔɽ‫݁ࢉܭ‬ՌͷΦϒ

5. 6 RQ6: ࣮‫ݧ‬ௐࠪδΣΫτΛऑࢀর͓ͯ͘͜͠ͱͰɼಉ͡‫ࢉܭ‬Λߦͬͨ৔߹ʹΩϟογϡ͞Ε͍ͯΔ݁Ռ͕͋Ε͹‫ྔࢉܭ‬Λ‫ݮ‬গͰ͖Δɽ·ͨɼ࣮‫ݧ‬ͷ݁ՌΛද 7 ʹࣔ͢ɽද 7 ͷ݁ՌͰ “ҟৗऴྃ” ͱͳ͍ͬͯΔ 3 ͭ͸શͯಉ݁͡Ռͱͳ͍ͬͯͨɽ200 ‫ݸ‬ͷը૾Λϩʔυͨ͠‫ޙ‬ɼϝϞϦ͕ 1 GB Λ௒͑ͨ௚‫ʹޙ‬ΞϓϦ͕‫੍ڧ‬తʹද 4: RQ4: ςετίʔυͷଘࡏ༗ແςετͷଘࡏ༗ແ

૾σʔλͷΦϒδΣΫτ͕ద੾ͳ࣌఺Ͱճऩ͞ΕͣɼϝϞϦͷϑΝΠϧ਺༗Γ

38

ແ͠

20

ऴྃ͞Εͨɽҟৗऴྃͷ‫ݪ‬Ҽ͸ɼΞϓϦ͔Βࢀর͞Ε͍ͯΔըද 6: RQ5: ऑࢀরͷಋೖࣦഊͷέʔεϦϙδτϦ໊ද 5: RQ4: ऑࢀরͷςετίʔυͷଘࡏ༗ແऑࢀরͷςετͷଘࡏ༗ແ

ϑΝΠϧ਺

έʔε਺

ReactiveX/RxJava

1

spring-projects/spring-framework2ऑࢀরͷςετ༗Γ

10bumptech/glide2

ऑࢀরͷςετແ͠

28

߹‫ܭ‬

5- 35 -—5—Φʔόʔϑϩʔͱͳ͔ͬͨΒͰ͋Δͱߟ͑Δɽ͸ҰൠతͰͳ͍ɽϞόΠϧ‫ܥ‬ͷΞϓϦͰ͸਺‫ݸ‬ఔ౓ͷը૾ʹର

ද 7 ͷ݁ՌͰ “ਖ਼ৗಈ࡞” ͸ɼऑࢀরΛར༻͢Δ‫ط‬ଘͷ Glideͯ͠ϩʔυɾΞϯϩʔυΛ‫܁‬Γฦ͢͜ͱ͕ΑΓҰൠతͰ͋Ζ͏ɽͱɼը૾σʔλ΁ͷࢀরΛ࣋ͨͳ͍ΞϓϦͷ૊߹Ͱग़ͨ݁ՌͰͦͷΑ͏ͳ৔߹ͰऑࢀরΛ࢖͏‫ط‬ଘͷίʔυ͕ਖ਼ৗಈ࡞͠ɼऑ͋Δɽ͜͜Ͱਖ਼ৗಈ࡞͸ɼશͯͷը૾σʔλͷϩʔυʹ੒ޭ͠ࢀরΛ࢖Θͳ͘վมͨ͠ίʔυ͕ҟৗऴྃͱͳͬͨɽ͜ͷ݁Ռ͍ͯΔ͜ͱΛ‫͏ݴ‬ɽਖ਼ৗಈ࡞͕Մೳͩͬͨཧ༝ͱͯ͠͸ɼը૾ΑΓɼऑࢀর͕ෆཁͳΦϒδΣΫτΛࣗಈతʹճऩͤ͞ɼϝϞσʔλ΁ͷࢀর͕ Glide ͔Βͷऑࢀর͔͠ͳ͔ͬͨͨΊɼը૾ϦϦʔΫΛ๷ࢭ͢Δ༗ޮͳखஈͰ͋Δ͜ͱ͕ࣔ͞Εͨͱߟ͑ΔɽσʔλͷΦϒδΣΫτ͕ద੾ʹճऩ͞ΕɼϝϞϦϦʔΫͱͳΒ

7. ଥ౰ੑ΁ͷ‫ڴ‬Җͳ͔͔ͬͨΒͰ͋Δͱߟ͑Δɽຊ‫Ͱڀݚ‬͸ίʔυ΍ߋ৽ཤྺΛ໨ࢹͰௐࠪͨ͠ɽௐࠪ݁Ռʹ

6. · ͱ Ίରͯ͠ఆྔతͳղऍ͸͋·Γߦͬͯ͸͍ͳ͍͕ɼऑࢀরͷ࢖͍ຊষͰ͸֤ RQ ʹର͢Δ౴͑ͱͯ͠ɼऑࢀরͷར༻࣮ଶʹؔํͷछྨ΍ɼऑࢀরͷಋೖʹࣦഊͨ͠έʔεͳͲɼ‫ڀݚ‬ͷ໨తͱͯ͠౴͑Δ΂͖΋ͷ͸ఆੑతͰ͋Δɽ͕ͨͬͯ͠ɼίʔυ΍͢Δௐࠪͷ݁Ռͱ݁Ռ΁ͷߟ࡯Λ·ͱΊΔɽ

RQ1: ͲͷΑ͏ͳυϝΠϯͷϦϙδτϦͰΑ͘ऑࢀরΛར༻͍ͯ͠Δ͔ ௐࠪର৅ͷ 202 ‫ݸ‬ͷϦϙδτϦͷɼ໿ 3 ෼ͷߋ৽ཤྺΛ໨ࢹͰௐࠪͨ͜͠ͱ͸ຊ‫े͍͓ͯʹڀݚ‬෼Ͱ͋Δͱߟ͑Δɽ

1 Ͱ͋Δ 73 ‫ݸ‬ͷϦϙδτϦͰऑࢀর͕࢖ΘΕ͍ͯΔ͜ͱ͸ɼ

8. ͋ ͱ ͕ ͖༧૝֎ʹଟ͍݁ՌͰ͋ͬͨɽͦͷதͰ΋ System software ͱSoftware tools ͷυϝΠϯͰऑࢀর͕Α͘࢖ΘΕ͍ͯΔ͜ͱ͸ɼຊ‫Ͱڀݚ‬͸ GitHub ͷ Java ϦϙδτϦΛର৅ʹɼऑࢀরͷιϑτ΢ΣΞ΁ͷվળͷཁ‫͜ͱ͍ڧ͕ٻ‬ΖͰऑࢀর͕Α͘ಋೖར༻࣮ଶʹؔ͢ΔௐࠪΛߦͬͨɽௐࠪͰ͸ 6 ͭͷ RQ Λઃఆ͞Ε͍ͯΔ͔ΒͰ͋Δͱߟ͑ͨɽ͠ɼऑࢀর͕࢖ΘΕ͍ͯΔϦϙδτϦͷυϝΠϯͱऑࢀরͷ࢖

RQ2: ऑࢀর͕ಋೖ͞ΕΔ࣌‫ظ‬͸͍͔ͭ ऑࢀরͷಋೖ͸͍ํɼಋೖ࣌‫ظ‬ɼςετͷ༗ແɼಋೖࣦഊͷέʔεʹؔͯ͠ௐιʔεϑΝΠϧͷੜ੒࣌ɼ͢ͳΘͪιϑτ΢ΣΞͷ‫ػ‬ೳͷ௥Ճ΂ͨɽ͞Βʹ 1 ͭͷΦʔϓϯιʔειϑτ΢ΣΞʹର࣮ͯ͠‫ݧ‬࣌ʹओʹߦΘΕΔ͜ͱ͕Θ͔ͬͨɽΛߦ͍ɼऑࢀরͷར༻͕࣮ࡍʹ༗ޮͰ͋Δ͜ͱΛ֬ೝͨ͠ɽ

RQ3: ऑࢀরΛͲͷΑ͏ʹ࢖͍ͬͯΔ͔ ऑࢀরͷ࢖͍ํࠓ‫ޙ‬ͷ՝୊ͱͯ͠ɼऑࢀর͕ར༻͞Ε͍ͯΔίʔυΛ͞ΒʹʹςετίʔυͰͷར༻͕͋ͬͨͷ͸༧૝֎ͷ݁ՌͰ͋Δͱߟௐࠪ͢Δ͜ͱͰɼऑࢀরΛಋೖͰ͖ΔίʔυͷύλʔϯΛఆٛ͑Δɽಛʹɼऑࢀরͷ࢖͍ํͰςετίʔυͰͷར༻͕࠷΋ଟ͢Δ͜ͱ͕ߟ͑ΒΕΔɽ·ͨɼఆٛ͞Ε͍ͯΔίʔυͷύλʔ͔ͬͨ͜ͱͰɼऑࢀরΛςετίʔυʹ༻͍Δύλʔϯ͕‫ʹط‬ϯΛ༻͍ɼऑࢀরͷར༻Λιϑτ΢ΣΞ։ൃऀʹఏҊ͢Δ࢓૊޿͘஌ΒΕ͍ͯͨͷ͔ͱߟ͑ͨɽଞͷ࢖͍ํʹ͍ͭͯ΋ 5. 3 અΈΛ։ൃͯ͠ɼऑࢀরͷಋೖΛࣗಈԽ͢Δ͜ͱ΋ߟ͑ΒΕΔɽँࣙͰίʔυͷύλʔϯΛ‫͓ͯ͠ࡌه‬ΓɼऑࢀরΛ࢖͓͏ͱ͢Δι

ʢBʣʢ՝୊൪߸ɿ17H01725ʣͷॿ੒ΛಘͯߦΘΕͨɽϑτ΢ΣΞ։ൃऀʹͱͬͯඇৗʹ໾ཱͭͰ͋Ζ͏ͱߟ͑Δɽ

RQ4: ऑࢀর͸ςετ͞Ε͍ͯΔ͔ ऑࢀর͕࢖ΘΕ͍ͯΔίʔυ͸͋·Γςετ͞Ε͍ͯͳ͍͜ͱ͕Θ͔ͬͨɽऑࢀর΁ͷςετ͕ͳ͍ཧ༝͸ɼऑࢀরͷར༻ͷ೉͠͞ΑΓ͸ɼऑࢀরΛςετ͢ΔͨΊͷίʔυͷύλʔϯ͕͋·Γप஌͞Ε͍ͯͳ͍ͨΊͰ͋Δͱߟ͑Δɽ

RQ5: ऑࢀরͷಋೖʹࣦഊͨ͠έʔε͸͋Δ͔ 5. 5 અͰ঺հ͞Ε͍ͯΔΑ͏ʹɼιϑτ΢ΣΞ։ൃऀ͕༧‫͔ͬͳ͖Ͱظ‬ͨ໰୊Ͱऑࢀরͷར༻Λ΍Ίͨέʔε͕͍͔ͭ͘ଘࡏͨ͠ɽ͜ͷΑ͏ͳ໰୊Λ‫͍ͨͳ͜͞ى‬Ίʹɼऑࢀরͷಋೖ͸े෼஫ҙΛ෷ܾͬͯఆ͢΂͖Ͱ͋Δͱߟ͑Δɽ

RQ6: ऑࢀরͷར༻͸࣮ࡍʹ༗ޮ͔ Φʔϓϯιʔειϑτ΢ΣΞΛར༻࣮ͯ͠‫ݧ‬Λߦͬͨ݁Ռɼऑࢀরͷར༻͕༗ޮͰ͋Δ͜ͱ͕֬ೝͰ͖ͨͱߟ͑Δɽը૾σʔλ΁ͷࢀরΛશͯ࣋ͭΞϓϦͰ͸ऑࢀরΛ࢖͏‫ط‬ଘͷ৔߹Ͱ΋ҟৗऴྃͱͳ͕ͬͨɼ

1.6GB ͷը૾σʔλΛҰ‫Ͱׅ‬ϩʔυ͠Կ͔ͷॲཧΛͤ͞Δ͜ͱද 7: RQ6: ࣮‫ݧ‬ͷ݁ՌΞϓϦͷछྨ‫ط‬ଘ (ऑࢀর)վม (‫ࢀڧ‬র)ը૾σʔλ΁ͷࢀর͋Γ ҟৗऴྃҟৗऴྃը૾σʔλ΁ͷࢀরͳ͠ ਖ਼ৗಈ࡞ҟৗऴྃຊ‫ڀݚ‬͸ɼ೔ຊֶज़ৼ‫ڵ‬ձՊֶ‫ڀݚ‬අิॿۚ‫ج‬൫‫ڀݚ‬- 36 -จ‫ݙ‬[1] P.R. Wilson, “Uniprocessor garbage collection techniques,”
Memory Management, pp.1–42, Springer, 1992.
[2] W. De Pauw and G. Sevitsky, “Visualizing reference patterns for solving memory leaks in java,” European Conference on Object-Oriented ProgrammingSpringer, pp.116–134
1999.
[3] “Java Reference ͱ GC (‫)ޠࠃؖ‬,” https://d2.naver.com/
helloworld/329631ɽ ࠷ऴΞΫηε: 2019-02-04ɽ
[4] H. Borges, A. Hora, and M.T. Valente, “Understanding thefactors that impact the popularity of github repositories,”
Software Maintenance and Evolution (ICSME), 2016 IEEE
International Conference onIEEE, pp.334–344 2016.
[5] C. Vendome, M. Linares-Vásquez, G. Bavota, M. Di Penta,
D. German, and D. Poshyvanyk, “License usage andchanges: a large-scale study of java projects on github,”Proceedings of the 2015 IEEE 23rd International Conference on Program ComprehensionIEEE Press, pp.218–228
2015.
[6] R. Shaham, E.K. Kolodner, and M. Sagiv, “Automatic removal of array memory leaks in java,” International Conference on Compiler ConstructionSpringer, pp.50–66 2000.
[7] “WeakReference (JavaDoc),” https://docs.oracle.com/
javase/8/docs/api/java/lang/ref/WeakReference.html.
࠷ऴΞΫηε: 2019-02-04.
[8] “WeakHashMap (JavaDoc),” https://docs.oracle.com/
javase/8/docs/api/java/util/WeakHashMap.html.
࠷ऴΞΫηε: 2019-02-04.

—6—