[ANDROID] ν”„λ‘œμ„ΈμŠ€ 수λͺ… μ£ΌκΈ°

κ°œμš” 

  1. ν”„λ‘œμ„ΈμŠ€μ˜ 수λͺ… 관리 방식에 λŒ€ν•΄ μ΄ν•΄ν•œλ‹€.
  2. ν”„λ‘œμ„ΈμŠ€ μ€‘μš”λ„ 계측 ꡬ쑰에 λŒ€ν•΄ μ΄ν•΄ν•œλ‹€.
  3. μ‹œμŠ€ν…œμ˜ ν”„λ‘œμ„ΈμŠ€ μ€‘μš”λ„ 선별 방식에 λŒ€ν•΄ μ΄ν•΄ν•œλ‹€.

 

μ• ν”Œλ¦¬μΌ€μ΄μ…˜ ν”„λ‘œμ„ΈμŠ€


λŒ€λΆ€λΆ„μ˜ 경우 λͺ¨λ“  Android μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ€ 자체 Linux ν”„λ‘œμ„ΈμŠ€μ—μ„œ μ‹€ν–‰λ˜λ©°, μ‹œμŠ€ν…œμ΄ λ©”λͺ¨λ¦¬λ₯Ό νšŒμˆ˜ν•΄μ•Ό ν•  λ•ŒκΉŒμ§€ 계속 μ‹€ν–‰λ©λ‹ˆλ‹€. Android의 ν”„λ‘œμ„ΈμŠ€μ˜ 수λͺ… μ£ΌκΈ°λŠ” μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œ κ΄€λ¦¬λ˜λŠ” 것이 μ•„λ‹ˆλΌ, μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ΄ 가지고 μžˆλŠ” μš”μ†Œλ“€μ˜ μ€‘μš”μ„±κ³Ό μ‹œμŠ€ν…œμ΄ μ‚¬μš©ν•  수 μžˆλŠ” μž”μ—¬ λ©”λͺ¨λ¦¬ 양을 μ‘°ν•©ν•˜μ—¬ μ‹œμŠ€ν…œμ— μ˜ν•΄ κ²°μ •λ©λ‹ˆλ‹€. 

 

λ”°λΌμ„œ μ•ˆλ“œλ‘œμ΄λ“œ κ°œλ°œμžλŠ” λ‹€μ–‘ν•œ μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ»΄ν¬λ„ŒνŠΈ(Activity, Service, BroadcastReceiver)κ°€ μ• ν”Œλ¦¬μΌ€μ΄μ…˜ ν”„λ‘œμ„ΈμŠ€μ˜ μ€‘μš”λ„μ— 영ν–₯을 λ―ΈμΉ˜λŠ” 방식을 이해해야 ν•©λ‹ˆλ‹€. λ§Œμ•½ μ»΄ν¬λ„ŒνŠΈλ“€μ„ μ˜¬λ°”λ₯΄κ²Œ μ‚¬μš©ν•˜μ§€ μ•ŠμœΌλ©΄ μ• ν”Œλ¦¬μΌ€μ΄μ…˜ ν”„λ‘œμ„ΈμŠ€κ°€ μ’…λ£Œλ  수 μžˆμŠ΅λ‹ˆλ‹€. 

 

μ€‘μš”λ„ 계측 ꡬ쑰 


λ©”λͺ¨λ¦¬κ°€ λΆ€μ‘±ν•  λ•Œ μ’…λ£Œν•΄μ•Ό ν•˜λŠ” ν”„λ‘œμ„ΈμŠ€λ₯Ό κ²°μ •ν•˜κΈ° μœ„ν•΄ AndroidλŠ” μ€‘μš”λ„μ— 따라 ν”„λ‘œμ„ΈμŠ€λ“€μ„ μœ ν˜•λ³„λ‘œ 계측 ꡬ쑰에 λ°°μΉ˜ν•©λ‹ˆλ‹€. 총 넀가지 ν”„λ‘œμ„ΈμŠ€ μœ ν˜•μ΄ μ‘΄μž¬ν•©λ‹ˆλ‹€. (μ€‘μš”λ„ μˆœμ„œλ‘œ μž‘μ„±)

 

1. ν¬κ·ΈλΌμš΄λ“œ ν”„λ‘œμ„ΈμŠ€

μ‚¬μš©μžκ°€ ν˜„μž¬ ν•˜κ³  μžˆλŠ” μž‘μ—…μ— ν•„μˆ˜μ μœΌλ‘œ ν•„μš”ν•œ ν”„λ‘œμ„ΈμŠ€μž…λ‹ˆλ‹€. λ‹€μ–‘ν•œ μ»΄ν¬λ„ŒνŠΈλ“€λ‘œ μΈν•΄μ„œ ν¬κ·ΈλΌμš΄λ“œλ‘œ κ°„μ£Όλ˜λ©°, λ‹€μŒ 쑰건 쀑 ν•˜λ‚˜λΌλ„ ν•΄λ‹Ήν•˜λ©΄ ν¬κ·ΈλΌμš΄λ“œ ν”„λ‘œμ„ΈμŠ€λ‘œ κ°„μ£Όλ©λ‹ˆλ‹€. 

  • ν”„λ‘œμ„ΈμŠ€κ°€ μ‚¬μš©μžμ™€ μƒν˜Έμž‘μš©ν•˜κ³  μžˆλŠ” Activityλ₯Ό μ‹€ν–‰ 쀑인 경우 
  • ν”„λ‘œμ„ΈμŠ€μ— ν˜„μž¬ μ‹€ν–‰ 쀑인 BroadcastReceiverκ°€ μžˆλŠ” 경우 
  • ν”„λ‘œμ„ΈμŠ€μ— 콜백 λ©”μ„œλ“œ(onCreate(), onStart(), onDestory()) μ€‘μ—μ„œ ν˜„μž¬ μ½”λ“œλ₯Ό μ‹€ν–‰ 쀑인 Serviceκ°€ μžˆλŠ” 경우

ν¬κ·ΈλΌμš΄λ“œ ν”„λ‘œμ„ΈμŠ€λŠ” λ©”λͺ¨λ¦¬κ°€ 맀우 λΆ€μ‘±ν•˜μ—¬ ν¬κ·ΈλΌμš΄λ“œ ν”„λ‘œμ„ΈμŠ€μ‘°μ°¨ 계속 μ‹€ν–‰ν•  수 없을 κ²½μš°μ—λ§Œ μ’…λ£Œν•©λ‹ˆλ‹€.

 

2. κ°€μ‹œμ  ν”„λ‘œμ„ΈμŠ€

μ‚¬μš©μžκ°€ ν˜„μž¬ μ•Œκ³  μžˆλŠ” μž‘μ—…μ„ μˆ˜ν–‰μ€‘μΈ ν”„λ‘œμ„ΈμŠ€μ΄λ©°, μ’…λ£Œλ˜λ©΄ μ‚¬μš©μžμ—κ²Œ 뢀정적인 영ν–₯을 λ―ΈμΉ©λ‹ˆλ‹€. λ‹€μŒ 쑰건에 ν•΄λ‹Ήλ˜λŠ” ν”„λ‘œμ„ΈμŠ€λ₯Ό κ°€μ‹œμ  ν”„λ‘œμ„ΈμŠ€λ‘œ κ°„μ£Όν•©λ‹ˆλ‹€. 

  • ν”„λ‘œμ„ΈμŠ€κ°€ ν™”λ©΄μƒμœΌλ‘œλŠ” ν‘œμ‹œλ˜μ§€λ§Œ, ν¬κ·ΈλΌμš΄λ“œμ— μžˆμ§€ μ•Šμ€ Activity(onPause() 호좜)λ₯Ό μ‹€ν–‰ 쀑인 경우. 예λ₯Ό λ“€μ–΄ λŒ€ν™” μƒμž λ’€λ‘œ μ•‘ν‹°λΉ„ν‹°κ°€ νλ¦Ών•˜κ²Œ λ³΄μ΄λŠ” 경우λ₯Ό λ§ν•©λ‹ˆλ‹€. 
  • ν”„λ‘œμ„ΈμŠ€μ— startForeground()λ₯Ό 톡해 ν¬κ·ΈλΌμš΄λ“œ μ„œλΉ„μŠ€λ‘œ μ‹€ν–‰ 쀑인 Serviceκ°€ μžˆλŠ” 경우
  • ν”„λ‘œμ„ΈμŠ€μ— μ‚¬μš©μžκ°€ μ•Œκ³  μžˆλŠ” νŠΉμ • κΈ°λŠ₯에 μ‚¬μš©ν•˜λŠ” μ„œλΉ„μŠ€κ°€ μžˆλŠ” 경우

κ°€μ‹œμ  ν”„λ‘œμ„ΈμŠ€λŠ” ν¬κ·ΈλΌμš΄λ“œ ν”„λ‘œμ„ΈμŠ€λ³΄λ‹€λŠ” 덜 μ œν•œμ μ΄μ§€λ§Œ, 맀우 μ€‘μš”ν•œ κ²ƒμœΌλ‘œ κ°„μ£Όλ˜λ©° ν¬κ·ΈλΌμš΄λ“œ ν”„λ‘œμ„ΈμŠ€μ˜ μ‹€ν–‰ μƒνƒœλ₯Ό μœ μ§€ν•˜λŠ” 데 ν•„μš”ν•œ 상황이 μ•„λ‹ˆλΌλ©΄ μ’…λ£Œλ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

 

3. μ„œλΉ„μŠ€ ν”„λ‘œμ„ΈμŠ€ 

startService() λ©”μ„œλ“œλ‘œ μ‹œμž‘λœ Serviceλ₯Ό μœ μ§€ν•˜λŠ” ν”„λ‘œμ„ΈμŠ€μž…λ‹ˆλ‹€. μ΄λŸ¬ν•œ ν”„λ‘œμ„ΈμŠ€λŠ” μ‚¬μš©μžμ—κ²Œ 직접 ν‘œμ‹œλ˜μ§€ μ•Šμ§€λ§Œ, μ‚¬μš©μžκ°€ 포컀슀λ₯Ό κ°–κ³  μžˆλŠ” μž‘μ—…(λ°± κ·ΈλΌμš΄λ“œ μž‘μ—…)을 μ‹€ν–‰ν•©λ‹ˆλ‹€. λ”°λΌμ„œ ν¬κ·ΈλΌμš΄λ“œ ν”„λ‘œμ„ΈμŠ€ 및 κ°€μ‹œμ  ν”„λ‘œμ„ΈμŠ€λ₯Ό μœ μ§€ν•  λ©”λͺ¨λ¦¬κ°€ λΆ€μ‘±ν•˜μ§€ μ•Šλ‹€λ©΄ 항상 μ‹€ν–‰ μƒνƒœλ₯Ό μœ μ§€ν•©λ‹ˆλ‹€. 

λ§Œμ•½, μ˜€λž«λ™μ•ˆ μ‹€ν–‰λ˜κ³  μžˆλŠ” μ„œλΉ„μŠ€λŠ” μ€‘μš”λ„κ°€ κ°•λ“±λ˜λ©°, μΊμ‹œλœ ν”„λ‘œμ„ΈμŠ€ λͺ©λ‘μœΌλ‘œ 이전될 수 μžˆμŠ΅λ‹ˆλ‹€. μ΄λ ‡κ²Œ ν•˜λ©΄ 쓸데 μ—†λŠ” λ©”λͺ¨λ¦¬ λˆ„μˆ˜ λ˜λŠ” μž₯κΈ° μ‹€ν–‰ μ„œλΉ„μŠ€κ°€ λ©”λͺ¨λ¦¬λ₯Ό λ‚­λΉ„ν•˜λŠ” 상황을 방지할 수 μžˆμŠ΅λ‹ˆλ‹€.

 

4. μΊμ‹œλœ ν”„λ‘œμ„ΈμŠ€ 

λ‹Ήμž₯ ν•„μš”ν•˜μ§€ μ•Šμ€ ν”„λ‘œμ„ΈμŠ€μž…λ‹ˆλ‹€. μ‹œμŠ€ν…œμ€ λ‹€λ₯Έ 곳에 λ©”λͺ¨λ¦¬κ°€ ν•„μš”ν•˜λ‹€λ©΄ μ–Έμ œλ“ μ§€ 이 ν”„λ‘œμ„ΈμŠ€λ“€μ„ μ’…λ£Œν•  수 μžˆμŠ΅λ‹ˆλ‹€. μΊμ‹œλœ ν”„λ‘œμ„ΈμŠ€λŠ” λ©”λͺ¨λ¦¬ 관리와 μœ μΌν•˜κ²Œ κ΄€λ ¨λœ ν”„λ‘œμ„ΈμŠ€μ΄λ©°, ν•„μš”μ— 따라 κ°€μž₯ 였래된 ν”„λ‘œμ„ΈμŠ€λ₯Ό μ •κΈ°μ μœΌλ‘œ μ’…λ£Œμ‹œν‚΅λ‹ˆλ‹€.

ν”νžˆ μΊμ‹œλœ ν”„λ‘œμ„ΈμŠ€λŠ” ν˜„μž¬ μ‚¬μš©μžμ—κ²Œ ν‘œμ‹œλ˜μ§€ μ•ŠλŠ” ν•˜λ‚˜ μ΄μƒμ˜ Activity μΈμŠ€ν„΄μŠ€λ₯Ό ν¬ν•¨ν•©λ‹ˆλ‹€.(onStop() λ©”μ„œλ“œκ°€ 호좜된) μΊμ‹œλœ ν”„λ‘œμ„ΈμŠ€κ°€ μ˜¬λ°”λ₯Έ μ•‘ν‹°λΉ„ν‹° 수λͺ… μ£ΌκΈ°λ₯Ό 가지고 μžˆλ‹€λ©΄, μ‹œμŠ€ν…œμ΄ ν”„λ‘œμ„ΈμŠ€λ₯Ό μ’…λ£Œν•˜λ”λΌλ„ μ‚¬μš©μžμ—κ²Œ 영ν–₯을 주지 μ•ŠμŠ΅λ‹ˆλ‹€. 그리고 μ—°κ²°λœ μ•‘ν‹°λΉ„ν‹°κ°€ μƒˆ ν”„λ‘œμ„ΈμŠ€μ—μ„œ λ‹€μ‹œ μƒμ„±λ˜λ”λΌλ„ μ‹œμŠ€ν…œμ΄ μ΄μ „μ˜ UI λ‚΄μš©μ„ 볡원할 수 μžˆμŠ΅λ‹ˆλ‹€.

μΊμ‹œλœ ν”„λ‘œμ„ΈμŠ€λ“€μ€ LRU μŠ€μΌ€μ€„λ§ λ°©μ‹μœΌλ‘œ μœ μ§€λ˜λ©°, λ©”λͺ¨λ¦¬ 회수 μ‹œ λͺ©λ‘μ˜ λ§ˆμ§€λ§‰ ν”„λ‘œμ„ΈμŠ€(κ°€μž₯ μ˜€λž«λ™μ•ˆ μ‚¬μš©λ˜μ§€ μ•Šμ€)κ°€ κ°€μž₯ λ¨Όμ € μ’…λ£Œλ©λ‹ˆλ‹€. 

 

ν”„λ‘œμ„ΈμŠ€ λΆ„λ₯˜ 방법을 κ²°μ •ν•  λ•Œ μ‹œμŠ€ν…œμ€ ν”„λ‘œμ„ΈμŠ€κ°€ 가지고 μžˆλŠ” λͺ¨λ“  μ»΄ν¬λ„ŒνŠΈμ€‘ κ°€μž₯ 높은 μ€‘μš”λ„μ— 따라 결정을 λ‚΄λ¦½λ‹ˆλ‹€. λ”°λΌμ„œ μœ„μ—μ„œ μ–ΈκΈ‰ν•œ 것 처럼 κ°œλ°œμžλŠ” 각 μ»΄ν¬λ„ŒνŠΈκ°€ ν”„λ‘œμ„ΈμŠ€μ˜ μ€‘μš”λ„μ— μ–΄λ–»κ²Œ κΈ°μ—¬ν•˜λŠ”μ§€ μžμ„Ένžˆ νŒŒμ•…ν•΄μ•Όλ§Œ ν•©λ‹ˆλ‹€. 

 

Reference 

https://developer.android.com/guide/components/activities/process-lifecycle?hl=ko

 

ν”„λ‘œμ„ΈμŠ€ 및 μ• ν”Œλ¦¬μΌ€μ΄μ…˜ 수λͺ… μ£ΌκΈ°  |  Android 개발자  |  Android Developers

λŒ€λΆ€λΆ„μ˜ 경우 λͺ¨λ“  Android μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ€ 자체 Linux ν”„λ‘œμ„ΈμŠ€μ—μ„œ μ‹€ν–‰λ©λ‹ˆλ‹€. 이 ν”„λ‘œμ„ΈμŠ€λŠ” 일뢀 μ½”λ“œλ₯Ό μ‹€ν–‰ν•΄μ•Ό ν•  λ•Œ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μš©μœΌλ‘œ μƒμ„±λ˜λ©° 더 이상 ν•„μš”ν•˜μ§€ μ•Šκ³  μ‹œμŠ€ν…œμ΄ λ©”λͺ¨λ¦¬λ₯Ό νšŒμˆ˜ν•΄μ•Ό ν•  λ•ŒκΉŒμ§€ 계속 μ‹€ν–‰λ©λ‹ˆλ‹€…

developer.android.com