์ถ์ฒ
ChatGPT
Out of Memory(OOM)์ Memory Leak(๋ฉ๋ชจ๋ฆฌ ๋์)๋ ๋ชจ๋ ๋ฉ๋ชจ๋ฆฌ์ ๊ด๋ จ๋ ๋ฌธ์ ๋ฅผ ๋ํ๋ด์ง๋ง, ๊ทธ ์์ธ๊ณผ ๋ฐ์ํ๋ ์ํฉ์ ๋ค๋ฅด๋ค.
1. Out of Memory
Out of Memory๋ ํ๋ก๊ทธ๋จ์ด ์คํ ์ค์ ์ฌ์ฉํ ์ ์๋ ๋ฉ๋ชจ๋ฆฌ๊ฐ ๋ถ์กฑํ ๋ ๋ฐ์ํ๋ ์ค๋ฅ์ด๋ค. JVM์์ ํ ๋ฉ๋ชจ๋ฆฌ ๋๋ ๋ฉํ์คํ์ด์ค ๋ฑ ํ ๋น๋ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ด ๋ค ์์ง๋์ด ๋ ์ด์ ๊ฐ์ฒด๋ฅผ ์์ฑํ ์ ์๋ ์ํ๋ฅผ ๋งํ๋ค.
์์ธ
๋ฉ๋ชจ๋ฆฌ ๋ถ์กฑ
ํ๋ก๊ทธ๋จ์ด ํ์ํ ๋ฉ๋ชจ๋ฆฌ๋ณด๋ค ๋ ๋ง์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋น๋ฐ์ผ๋ ค๊ณ ์๋ํ ๋ ๋ฐ์ํ๋ค.
๋๋์ ๋ฐ์ดํฐ ์ฒ๋ฆฌ
ํ๊บผ๋ฒ์ ๋๋์ ๋ฐ์ดํฐ๋ฅผ ๋ฉ๋ชจ๋ฆฌ์ ๋ก๋ํ๊ฑฐ๋, ํฐ ๊ฐ์ฒด๋ฅผ ๋ฐ๋ณต์ ์ผ๋ก ์์ฑํ ๋ ๋ฐ์ํ ์ ์๋ค.
๋ฉ๋ชจ๋ฆฌ ๋์
๋ฉ๋ชจ๋ฆฌ ๋์๊ฐ ๋ฐ์ํด ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ์ํ์ง ๋ชปํ๊ณ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ด ์ ์ ์ฆ๊ฐํ ๋๋ OOM์ด ๋ฐ์ํ ์ ์๋ค.
์ ์ ํ์ง ์์ JVM ์ค์
JVM์ ํ ๋ฉ๋ชจ๋ฆฌ ํฌ๊ธฐ(-Xmx ์ต์ )๊ฐ ๋๋ฌด ์๊ฒ ์ค์ ๋์ด ์์ ๊ฒฝ์ฐ ๋ฐ์ํ ์ ์๋ค.
์ฆ์
- Out of MemoryError๊ฐ ๋ฐ์ํ๋ฉฐ, ํ๋ก๊ทธ๋จ์ด ๋น์ ์ ์ข ๋ฃ๋ ์ ์๋ค.
- ์๋ฅผ ๋ค์ด, 'java.lang.OutOfMemoryError: Java heap space'๋ ํ ๊ณต๊ฐ ๋ถ์กฑ์ ์๋ฏธํ๋ค.
ํด๊ฒฐ๋ฐฉ๋ฒ
- JVM์ ํ ํฌ๊ธฐ ์ค์ ์ ๋๋ ค์ ๋ฉ๋ชจ๋ฆฌ ๋ถ์กฑ์ ์ํํ ์ ์๋ค.(-Xmx ์ต์ ์ ์ต๋ ํ ํฌ๊ธฐ๋ก ์ค์ )
- ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ ํจํด์ ๋ถ์ํด ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ ์ต์ ํํ๋ค.
- ๋ถํ์ํ ๊ฐ์ฒด๋ฅผ ์์ฑํ์ง ์๋๋ก ์ฝ๋ ์ต์ ํ ๋ฐ GC ํ๋์ ์ํํ๋ค.
์์
import java.util.ArrayList;
import java.util.List;
public class OutOfMemoryExample {
public static void main(String[] args) {
List<int[]> list = new ArrayList<>();
while (true) {
// ๋งค์ฐ ํฐ ๋ฐฐ์ด์ ๊ณ์ ์์ฑํ์ฌ ํ ๊ณต๊ฐ์ ์์ง์ํด
list.add(new int[1000000]); // ๋ฐ๋ณต์ ์ผ๋ก ํฐ ๊ฐ์ฒด๋ฅผ ์์ฑํ์ฌ ๋ฉ๋ชจ๋ฆฌ ๋ถ์กฑ ์ด๋
}
}
}
์์ ์์ ์์๋ ํฐ ๋ฐฐ์ด์ ๊ณ์ํด์ ์์ฑํด ํ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ณ ๊ฐ์์ผ ๊ฒฐ๊ตญ OutOfMemoryError๋ฅผ ๋ฐ์์ํจ๋ค.
2. Memory Leak ๋ฉ๋ชจ๋ฆฌ ๋์
Memory Leak(๋ฉ๋ชจ๋ฆฌ ๋์)๋ ํ๋ก๊ทธ๋จ์ด ๋ ์ด์ ํ์ํ์ง ์์ ๊ฐ์ฒด์ ๋ํ ์ฐธ์กฐ๋ฅผ ์ ์งํ์ฌ, ํด๋น ๊ฐ์ฒด๊ฐ ๊ฐ๋น์ง ์ปฌ๋ ์ (GC)์ ์ํด ํ์๋์ง ์๊ณ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ณ์ ์ฐจ์งํ๊ฒ ๋๋ ์ํฉ์ ์๋ฏธํ๋ค. ์ด๋ ์๊ฐ์ด ์ง๋๋ฉด์ ์ฌ์ฉ ๊ฐ๋ฅํ ๋ฉ๋ชจ๋ฆฌ๊ฐ ์ ์ ์ค์ด๋ค์ด ๊ฒฐ๊ตญ Out of Memory ์ค๋ฅ๋ฅผ ์ด๋ํ ์ ์๋ค.
์์ธ
๊ฐ์ฒด ์ฐธ์กฐ ์ ์ง
ํ์ํ์ง ์์ ๊ฐ์ฒด์ ๋ํ ์ฐธ์กฐ๋ฅผ ์ ์งํ์ฌ ๊ฐ์ฒด๊ฐ ๋ฉ๋ชจ๋ฆฌ์์ ํด์ ๋์ง ์์
์ปฌ๋ ์ ์ฌ์ฉ ์ค์
List, Map ๋ฑ ์ปฌ๋ ์ ๊ฐ์ฒด์ ๋ ์ด์ ํ์ํ์ง ์์ ์์๋ฅผ ์ถ๊ฐํ๊ณ ์ ๊ฑฐํ์ง ์๋ ๊ฒฝ์ฐ
ํด๋ก์ (Closure) ์ฌ์ฉ
๋ด๋ถ ํด๋์ค๋ ๋๋ค ํํ์์ด ์ธ๋ถ ๊ฐ์ฒด์ ๋ํ ์ฐธ์กฐ๋ฅผ ์ ์งํ ๋
๋ฆฌ์ค๋(Listener) ๋ฐ ์ฝ๋ฐฑ(Callback)
๋ฑ๋ก๋ ๋ฆฌ์คํฐ๋ ์ฝ๋ฐฑ์ด ํด์ ๋์ง ์์ ๋
์ฆ์
- ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ด ์ ์ง์ ์ผ๋ก ์ฆ๊ฐํ์ฌ GC๊ฐ ์์ฃผ ๋ฐ์ํ๊ฒ ๋๊ณ , ๊ฒฐ๊ตญ ์์คํ ์ฑ๋ฅ์ด ์ ํ๋๋ค.
- ๋ฉ๋ชจ๋ฆฌ ๋์๊ฐ ์ง์๋๋ฉด ๊ฒฐ๊ตญ OutOfMemoryError๊ฐ ๋ฐ์ํ ์ ์๋ค.
ํด๊ฒฐ ๋ฐฉ๋ฒ
- ๋ฉ๋ชจ๋ฆฌ ํ๋กํ์ผ๋ง ๋๊ตฌ๋ฅผ ์ฌ์ฉํด ๋์ ์ง์ ์ ์๋ณํ๋ค.(์: VisualVM, Eclipse Memory Analyzer)
- ์ฌ์ฉ ํ์ ๋ช ์์ ์ผ๋ก ๊ฐ์ฒด ์ฐธ์กฐ๋ฅผ ํด์ ํ๊ฑฐ๋, ์ปฌ๋ ์ ์์ ๋ถํ์ํ ํญ๋ชฉ์ ์ ๊ฑฐํ๋ค.
- ์ฝ๋ ๋ฆฌ๋ทฐ ๋ฐ ์ ์ ๋ถ์ ๋๊ตฌ๋ฅผ ์ฌ์ฉํด ์ ์ฌ์ ๋ฉ๋ชจ๋ฆฌ ๋์๋ฅผ ์ฌ์ ์ ๋ฐ๊ฒฌํ๋ค.
์์
import java.util.HashMap;
import java.util.Map;
public class MemoryLeakExample {
public static void main(String[] args) {
Map<Key, String> map = new HashMap<>();
while (true) {
map.put(new Key("key"), "value"); // ๋งค๋ฒ ์๋ก์ด Key ๊ฐ์ฒด ์์ฑ, ์ด์ ํค ๊ฐ์ฒด์ ๋ํ ์ฐธ์กฐ ์์
}
}
}
class Key {
String key;
Key(String key) {
this.key = key;
}
@Override
public int hashCode() {
return key.hashCode();
}
@Override
public boolean equals(Object obj) {
return key.equals(((Key) obj).key);
}
}
์ฝ๋ ์ค๋ช
์ด ์ฝ๋์ ํต์ฌ ๋ถ๋ถ์ Key ํด๋์ค์ HashMap ์ฌ์ฉ ๋ฐฉ์์ด๋ค. ์ด ์์ ์์๋ Key ๊ฐ์ฒด๋ฅผ ๋ฐ๋ณตํด์ ์๋ก ์์ฑํ๊ณ , ์ด๋ฅผ HashMap์ ํค๋ก ์ฌ์ฉํ์ฌ ๊ณ์ ์ถ๊ฐํ๊ณ ์๋ค.
- Map<Key, String> map = new HashMap<>();
HashMap ๊ฐ์ฒด๋ฅผ ์์ฑํ์ฌ Key ๊ฐ์ฒด๋ฅผ ํค๋ก ์ฌ์ฉํ๊ณ , String์ ๊ฐ์ผ๋ก ์ ์ฅํ๋ค. - while (true) { map.put(new Key("key"), "value"); }
๋ฌดํ ๋ฃจํ๋ฅผ ํตํด ๊ณ์ํด์ ์๋ก์ด Key ๊ฐ์ฒด๋ฅผ ์์ฑํ์ฌ HashMap์ ์ถ๊ฐํ๋ค.
๋ฉ๋ชจ๋ฆฌ ๋์ ๋ฐ์ ์ด์
- Key ๊ฐ์ฒด์ ๋ฌดํ ์์ฑ
- ๋งค๋ฒ new Key("key")๋ฅผ ํธ์ถํ์ฌ ์๋ก์ด Key ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ค. ์ด๋๋ง๋ค ์๋ก ๋ค๋ฅธ Key ์ธ์คํด์ค๊ฐ ์์ฑ๋๋ค.
- HashMap์ ์ฐธ์กฐ ์ ์ง
- HashMap์ ๋ด๋ถ์ ์ผ๋ก ์ํธ๋ฆฌ(ํค-๊ฐ ์)๋ฅผ ์ ์ฅํ ๋, ํด์ ํ ์ด๋ธ์ ์ฌ์ฉํ์ฌ ํค๋ฅผ ์ฐธ์กฐ๋ก ์ ์ฅํ๋ค.
- ์๋ก ์์ฑ๋ Key ๊ฐ์ฒด๋ hashCode()์ equals() ๋ฉ์๋์ ์ํด ๊ฐ์ ๊ฐ("key")์ ๊ฐ๋๋ผ๋ ์๋ก ๋ค๋ฅธ ๊ฐ์ฒด์ด๋ค.
- ๋ฐ๋ผ์, HashMap์ ๋งค๋ฒ ์๋ก์ด Key ๊ฐ์ฒด๋ฅผ ์ธ์ํ์ฌ ์๋ก์ด ์ํธ๋ฆฌ๋ก ์ ์ฅํ๊ฒ ๋๋ค.
- ๋ฉ๋ชจ๋ฆฌ ๋์์ ์์ธ:
- HashMap์ ํค์ ๊ฐ์ ๊ฐ๊ฐ์ ์ํธ๋ฆฌ๋ก ์ ์ฅํ๊ธฐ ๋๋ฌธ์, ์ด์ ์ ์ ์ฅ๋ Key ๊ฐ์ฒด๋ฅผ ์ฌ์ ํ ์ฐธ์กฐํ๊ณ ์๋ค.
- ์ฆ, ์ด์ ์ ์ฝ์ ๋ Key ๊ฐ์ฒด๊ฐ ์ฌ์ฉ๋์ง ์๋๋ผ๋, HashMap์ด ์ฌ์ ํ ํด๋น ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ๊ณ ์์ผ๋ฏ๋ก GC(๊ฐ๋น์ง ์ปฌ๋ ํฐ)๊ฐ ํด๋น ๊ฐ์ฒด๋ฅผ ์๊ฑฐํ์ง ๋ชปํ๋ค.
- ๊ณ์ํด์ ์๋ก์ด Key ๊ฐ์ฒด๊ฐ HashMap์ ์ถ๊ฐ๋๊ณ , ๊ธฐ์กด Key ๊ฐ์ฒด๋ค์ด ์ ๊ฑฐ๋์ง ์๊ณ ์ฐธ์กฐ๋ก ๋จ์์์ผ๋ฏ๋ก, ๋ฉ๋ชจ๋ฆฌ๊ฐ ์ ์ ๋์ ๋๋ค.
- ์ฌ๋ฐ๋ฅธ hashCode()์ equals() ๊ตฌํ์ ์ค์์ฑ
์ฌ๋ฐ๋ฅธ hashCode()์ equals() ๊ตฌํ์ ์ค์์ฑ
Key ํด๋์ค๊ฐ hashCode()์ equals() ๋ฉ์๋๋ฅผ ์ฌ๋ฐ๋ฅด๊ฒ ๊ตฌํํ์ง ์์ผ๋ฉด, HashMap์ ์๋ก ๋ค๋ฅธ Key ๊ฐ์ฒด๋ฅผ ๋์ผํ ๊ฐ์ฒด๋ก ๊ฐ์ฃผํ์ง ์๋๋ค. ์ฆ, ๊ฐ์ ํค๋ฅผ ์ฌ๋ฌ ๋ฒ ์ฝ์ ํด๋ ํด์ ํ ์ด๋ธ ๋ด์์ ์ฌ๋ฌ ์ํธ๋ฆฌ๋ก ์ฒ๋ฆฌํ๊ฒ ๋์ด, ๋ถํ์ํ ๋ฉ๋ชจ๋ฆฌ ์๋น๊ฐ ๋ฐ์ํ๋ค. ์ด ๊ฒฝ์ฐ๋ ์ผ์ข ์ ๋ฉ๋ชจ๋ฆฌ ๋์๋ก ๋ณผ ์ ์๋ค.
์๋ชป๋ ๊ตฌํ ์์
class Key {
String key;
Key(String key) {
this.key = key;
}
// hashCode()์ equals()๋ฅผ ๊ตฌํํ์ง ์๊ฑฐ๋, ์๋ชป ๊ตฌํํ ๊ฒฝ์ฐ
// ๋ฉ๋ชจ๋ฆฌ ๋์ ๋ฐ์ ๊ฐ๋ฅ์ฑ ์ฆ๊ฐ
}
๊ฐ์ ๋ ์ฝ๋
Key ๊ฐ์ฒด๊ฐ ํญ์ ๋์ผํ ํด์ ๊ฐ์ ๊ฐ์ง๋๋ก ๊ตฌํํ๊ณ , equals() ๋ฉ์๋๊ฐ ๋ ๊ฐ์ฒด๋ฅผ ์ ๋๋ก ๋น๊ตํ๋๋ก ์์ฑํด์ผ ํ๋ค.
class Key {
String key;
Key(String key) {
this.key = key;
}
@Override
public int hashCode() {
return key.hashCode(); // ๋์ผํ ํค ๋ฌธ์์ด์ ๋์ผํ ํด์ ์ฝ๋ ๋ฐํ
}
@Override
public boolean equals(Object obj) {
if (this == obj) return true; // ๋์ผ ๊ฐ์ฒด์ผ ๊ฒฝ์ฐ true
if (obj == null || getClass() != obj.getClass()) return false; // ํด๋์ค๊ฐ ๋ค๋ฅผ ๊ฒฝ์ฐ false
Key other = (Key) obj;
return key.equals(other.key); // ๋์ผํ ํค ๊ฐ์ ๊ฐ์ง ๊ฒฝ์ฐ true
}
}
3. Out of Memory์ Memory Leak ์ฐจ์ด์
ํน์ง | Out of Memory (OOM) | Memory Leak (๋ฉ๋ชจ๋ฆฌ ๋์) |
์ ์ | ํ๋ก๊ทธ๋จ์ด ์ฌ์ฉํ ์ ์๋ ๋ฉ๋ชจ๋ฆฌ๊ฐ ๋ถ์กฑํ ์ฌํญ | ๋ ์ด์ ์ฌ์ฉ๋์ง ์๋ ๊ฐ์ฒด์ ๋ํ ์ฐธ์กฐ๊ฐ ์ ์ง๋์ด ๋ฉ๋ชจ๋ฆฌ๊ฐ ํด์ ๋์ง ์๋ ์ํฉ |
์์ธ | ๋๋์ ๋ฐ์ดํฐ ๋ก๋, ๋ฌดํ ๊ฐ์ฒด ์์ฑ, ์ ์ ํ์ง ์์ ํ ์ค์ ๋ฑ | ๋ถํ์ํ ๊ฐ์ฒด ์ฐธ์กฐ ์ ์ง, ์๋ชป๋ ์ปฌ๋ ์ ์ฌ์ฉ, ๋ฆฌ์คํฐ/์ฝ๋ฐฑ ๋ฏธํด์ ๋ฑ |
์ฆ์ | OutOfMemoryError ๋ฐ์, ํ๋ก๊ทธ๋จ ์ข ๋ฃ ๊ฐ๋ฅ์ฑ | ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋ ์ฆ๊ฐ, ์์คํ ์ฑ๋ฅ ์ ํ, ๊ฒฐ๊ตญ OOM์ผ๋ก ์ด์ด์ง ์ ์์ |
ํด๊ฒฐ ๋ฐฉ๋ฒ | ํ ํฌ๊ธฐ ์กฐ์ , ์ฝ๋ ์ต์ ํ, ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ ํจํด ๋ถ์ | ์ฐธ์กฐ ํด์ , ํ๋กํ์ผ๋ง ๋๊ตฌ ์ฌ์ฉ, ์ฝ๋ ๋ฆฌ๋ทฐ ๋ฐ ์ ์ ๋ถ์ ๋๊ตฌ ํ์ฉ |
๋ณต๊ตฌ ๊ฐ๋ฅ์ฑ | JVM ์ฌ์์์ด๋ ๋ฉ๋ชจ๋ฆฌ ํ์ฅ ํ์ | ์ฝ๋ ์์ ๋ฐ ์ต์ ํ๋ก ํด๊ฒฐ ๊ฐ๋ฅ |
๊ฒฐ๋ก
Out of Memory(OOM)๋ ๋ฉ๋ชจ๋ฆฌ ์์์ด ์์ ํ ๊ณ ๊ฐ๋ ๋ ๋ฐ์ํ๋ ๋ฌธ์ ์ด๊ณ , Memory Leak (๋ฉ๋ชจ๋ฆฌ ๋์)๋ ๋ถํ์ํ ๊ฐ์ฒด๊ฐ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ ์ ํ ์ํ๋ก ๋ฐฉ์น๋์ด ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ด ์ฆ๊ฐํ๋ ๋ฌธ์ ์ด๋ค. ๋ฉ๋ชจ๋ฆฌ ๋์๋ ๊ฒฐ๊ตญ OOM ์ค๋ฅ๋ก ์ด์ด์ง ์ ์๊ธฐ ๋๋ฌธ์, ๋ ๋ค ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ์ ์ฃผ์ํ ๋ถ๋ถ์ด๋ฉฐ ๊ฐ๋ฐ์๋ ์ด๋ฅผ ์ ์ดํดํ๊ณ ์ ์ ํ๊ฒ ๋์ฒํด์ผ ํ๋ค.