Garbage-Collection
๐ซ Q
๊ฐ๋น์ง์ ๋ํ์ฌ
- GC์ ๋ํด ์ค๋ช ํด๋ด๋ผ
- GC ์ต์ ํ๋ฅผ ์ํด ํ ์์๋์ผ์ ๋ฌด์์ด ์์์ง ์ค๋ช ํด๋ด๋ผ
- GC์ ์ฅ์ ๊ณผ ๋จ์ ์ ๋ํด ์ค๋ช ํด๋ด๋ผ
- ์ธ๋๋ณ ๊ฐ๋น์ง ์ปฌ๋ ์
- Unity
Instantiate/Destroy
๋ฅผ ๋ฐ๋ณต์ ์ผ๋ก ์ฌ์ฉํ๋ฉด ๋ฉ๋ชจ๋ฆฌ ์ฆ๊ฐ- -> ์ค๋ธ์ ํธ ํ ์ฌ์ฉ
๐ซ Garbage
ํ๋ก๊ทธ๋จ์ด ๋์ ์ผ๋ก ํ ๋นํ ๋ฉ๋ชจ๋ฆฌ ์ค์์ ๋ ์ด์ ์ฌ์ฉํ์ง ์๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ฐ๋น์ง๋ผ๊ณ ํ๋ค.
๊ฐ๋น์ง๋ ํ๋ก๊ทธ๋จ์ ์ฑ๋ฅ์ ์ ํ์ํค๊ณ ๋ฉ๋ชจ๋ฆฌ ๋์๋ฅผ ๋ฐ์์ํฌ ์ ์์ผ๋ฏ๋ก ๊ฐ๋น์ง ์ปฌ๋ ์
์ ํตํด ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํด์ ํด์ฃผ์ด์ผ ํ๋ค.
๐ซ Garbage๊ฐ ์๊ธฐ๋ ์ํฉ
๐ซง ๋ฌธ์์ด
1
2
string str = "Hello";
str = "World";
World
๊ฐ ์๋ก์ด ๋ฉ๋ชจ๋ฆฌ์ ํ ๋น๋๊ณ Hello
๋ ๋ ์ด์ ์ฌ์ฉ๋์ง ์๊ธฐ ๋๋ฌธ์ ๊ฐ๋น์ง๊ฐ ๋๋ค.
1
2
string str = "Hello";
str += "World";
HelloWorld
๊ฐ ์๋ก์ด ๋ฉ๋ชจ๋ฆฌ์ ํ ๋น๋๊ณ Hello
๋ ๋ ์ด์ ์ฌ์ฉ๋์ง ์๊ธฐ ๋๋ฌธ์ ๊ฐ๋น์ง๊ฐ ๋๋ค.
๋ง์ ๋ฌธ์์ด์ ์กฐํฉํ๋ ๊ฒฝ์ฐ์๋ StringBuilder
๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ๋น์ง๋ฅผ ์ค์ผ ์ ์๋ค.
Append
๋ฅผ ํตํด ๋ฏธ๋ฆฌ ํ ๋น๋ ๋ฉ๋ชจ๋ฆฌ์ ๋ฌธ์์ด์ ๋ณต์ฌ๋ง ํด๋๋ค๊ฐ, ToString
์ ํตํด ํ ๋ฒ์ ๋ฌธ์์ด ๊ฐ์ฒด๋ก ๋ณํํ๋ค.
1
2
3
4
StringBuilder sb = new StringBuilder();
sb.Append("Hello");
sb.Append("World");
string str = sb.ToString();
๐ซง ๊ฐ์ฒด (new)
1
2
3
4
5
6
7
class MyClass
{
public int value;
}
MyClass myClass = new MyClass();
myClass = new MyClass();
- ํด๋์ค๋ฅผ ์ธ์คํด์ฑํ๋ ค๋ฉด
new
๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค. new
๋ก ์์ฑ๋ ๊ฐ์ฒด๋ Heap์ ํ ๋น๋๊ณ Stack์๋ Heap์ ํ ๋น๋ ๊ฐ์ฒด์ ์ฃผ์๊ฐ์ด ์ ์ฅ๋๋ค.- ๋ฉ์๋ ์์์ new๋ก ์์ฑํ ๊ฐ์ฒด๋ ๋ฉ์๋๊ฐ ์ข ๋ฃ๋๋ฉด ๊ฐ๋น์ง๊ฐ ๋๋ค.
-> ๋ฉ์๋๊ฐ ์์ฃผ ํธ์ถ๋๋ ๊ฒฝ์ฐ์๋ ๊ฐ๋น์ง๊ฐ ๋น ๋ฅด๊ฒ ์์ผ ์ ์๋ค.
- ํด๋์ค ๋์ ๊ตฌ์กฐ์ฒด๋ฅผ ์ฌ์ฉํ๋ฉด (๊ฐ๋ฅํ๋ค๋ฉด) Stack์ ํ ๋น๋๊ธฐ ๋๋ฌธ์ ๊ฐ๋น์ง๊ฐ ๋ฐ์ํ์ง ์๋๋ค.
๐ซง Boxing, Unboxing
1
2
3
int num = 10;
object obj = num;
int num2 = (int)obj;
- ์ฐธ๊ณ : โBoxing, Unboxingโ
๐ซง ์ด์ค ์ฐธ์กฐ
1
2
MyClass myClass = new MyClass();
MyClass myClass2 = myClass;
myClass
์myClass2
๋ ๊ฐ์ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ๊ณ ์๊ธฐ ๋๋ฌธ์ ๋ ์ค ํ๋๋ง ์ฐธ์กฐํ๊ณ ์์ด๋ ๊ฐ๋น์ง๊ฐ ๋์ง ์๋๋ค.
๐ซ GC
๋์ ์ผ๋ก Garbage
๋ฅผ ์๋์ผ๋ก ํ์งํ๊ณ ํด์ ํ๋ ๋ฉ๋ชจ๋ฆฌ ๊ธฐ๋ฒ.
์ด๋ ๋ฉ๋ชจ๋ฆฌ ๋์์ ๊ฐ์ ๋ฌธ์ ์ ์ ๋ฐฉ์งํ์ฌ ํ๋ก๊ทธ๋จ์ ์์ ์ฑ๊ณผ ์ฑ๋ฅ์ ํฅ์ํ๋ ๋ฐ ์ฌ์ฉํ๋ค.
๐ซง ์ธ๋๋ณ GC
์ธ๋๊ฐ ๋ฎ์ ๋ฉ๋ชจ๋ฆฌ๋ถํฐ ๋ฉ๋ชจ๋ฆฌ ํด์ ๋ฅผ ํด์ค ๋ค์ ๋ฉ๋ชจ๋ฆฌ ์ปดํ์ ์ ํด์ค๋ค.
- 0์ธ๋ : GC๋ฅผ ํ๋ฒ๋ ๊ฒช์ง ์์ ๊ฐ ์์ฑ๋ ๊ฐ์ฒด๊ฐ ๋์
- 1์ธ๋ : GC๋ฅผ 1ํ ๊ฒช์ ๊ฐ์ฒด๊ฐ ๋์
- 2์ธ๋ : GC๋ฅผ 2ํ ์ด์ ๊ฒช์ ๊ฐ์ฒด๊ฐ ๋์(์ ์ฒด๋ฅผ ์๋ฏธ)
- 2์ธ๋ GC๋ฅผ ํ ์ Full Garbage Collection์ด๋ผ ํ๊ณ ์ ์ฒด Heap์ ๋ํ์ฌ GCํ๋ ๊ฒ์ ์๋ฏธํ๋ค.
๐ซง ์ธ๋๋ฅผ ๋๋๋ ๊ทผ๊ฑฐ
- ์ต๊ทผ์ ์์ฑ๋ ๊ฐ์ฒด์ผ์๋ก ์๋ช ์ฃผ๊ธฐ๊ฐ ์งง์ ๊ฐ๋ฅ์ฑ์ด๋๊ณ , ์ค๋๋ ๊ฐ์ฒด์ผ์๋ก ์๋ช ์ฃผ๊ธฐ๊ฐ ๊ธธ ๊ฐ๋ฅ์ฑ์ด ๋์ต๋๋ค.
- ์ต๊ทผ์ ์์ฑ๋ ๊ฐ์ฒด๋ผ๋ฆฌ๋ ์๋ก ์ฐ๊ด์ฑ์ด ๋์ ์ ์์ผ๋ฉฐ, ๋น์ทํ ์์ ์ ์์ฃผ ์ก์ธ์ค ๋ฉ๋๋ค.
- ์ผ๋ถ๋ถ Heap์ ๋ํด GC๋ฅผ ํ๋ ๊ฒ์ด ์ ์ฒด GC๋ฅผ ํ๋ ๊ฒ ๋ณด๋ค ๋น ๋ฆ ๋๋ค.
๐ซง ์ธ์ด์์
- ๋งค๋์ง๋ ์ธ์ด (GC ์ง์)
- C# : .NET ํ๋ ์์ํฌ์์ ์คํ.
- ์ธ๋งค๋์ง๋ ์ธ์ด
- C++ : ์ง์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋นํ๊ณ ํด์ .
๐ซ C#
๐ซง GC
1
2
3
4
5
6
GC.Collect(); // ๊ฐ๋น์ง ์ปฌ๋ ์
๊ฐ์ ์ํ
GC.Collect(0); // 0์ธ๋ ๊ฐ๋น์ง ์ปฌ๋ ์
๊ฐ์ ์ํ
GC.Collect(0, GCCollectionMode.Forced); // 0์ธ๋ ๊ฐ๋น์ง ์ปฌ๋ ์
๊ฐ์ ์ํ
GC.WaitForPendingFinalizers(); // ๊ฐ๋น์ง ์ปฌ๋ ์
์๋ฃ ๋๊ธฐ
GC.WaitForFullGCComplete(); // ์ ์ฒด ๊ฐ๋น์ง ์ปฌ๋ ์
์๋ฃ ๋๊ธฐ
GC.GetTotalMemory(true); // ์ ์ฒด ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋ ๋ฐํ
๐ซง Dispose Pattern
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
public class MyClass : IDisposable
{
private bool disposed = false;
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
protected virtual void Dispose(bool disposing)
{
if (!disposed)
{
if (disposing)
{
// ๊ด๋ฆฌ๋๋ ์์ ํด์
}
// ๋น๊ด๋ฆฌ ์์ ํด์
disposed = true;
}
}
~MyClass()
{
Dispose(false);
}
}
IDisposable
: ๊ด๋ฆฌ๋๋ ์์๊ณผ ๋น๊ด๋ฆฌ ์์์ ํด์ ํ๋ ๋ฉ์๋๋ฅผ ์ ์ํ๋ ์ธํฐํ์ด์ค- ์ง์ ๋ฉ์๋๋ฅผ ๋ง๋ค์ด ์ธ ์๋ ์์ง๋ง,
IDisposable
์ธํฐํ์ด์ค๋ฅผ ์์๋ฐ์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข๋ค.- ์๋ก ๋ค๋ฅธ Type์ ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํด๋, ๋์ผํ ์ฝ๋/๋ฐฉ๋ฒ์ผ๋ก ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํด์ ํ ์ ์๋ค.
Dispose
๋ฉ์๋๋ง ๋ณด๊ณ ๋ โ์, ํด๋์ค ์ฌ์ฉ์ด ๋๋๋ฉดDispose
๋ฅผ ํธ์ถํด์ผ๊ฒ ๊ตฌ๋โ ๋ผ๋ ๊ฒ์ ์ ์ ์๋ค.
- ์ง์ ๋ฉ์๋๋ฅผ ๋ง๋ค์ด ์ธ ์๋ ์์ง๋ง,
Dispose
: ๊ด๋ฆฌ๋๋ ์์๊ณผ ๋น๊ด๋ฆฌ ์์์ ํด์ Dispose(true)
: ๊ด๋ฆฌ๋๋ ์์์ ํด์ Dispose(false)
: ๋น๊ด๋ฆฌ ์์์ ํด์
GC.SuppressFinalize(this)
: ํ๊ดด์๋ฅผ ํธ์ถํ์ง ์๋๋ก ์ค์
FileStream
๊ด๋ จ ๊ฐ์ฒด์์ ๋ง์ด ๋ณผ ์ ์๋ค.
๐ซง WeakReference
1
WeakReference weakReference = new WeakReference(new MyClass());
WeakReference
: ์ฝํ ์ฐธ์กฐWeakReference
๋ฅผ ์ฌ์ฉํ๋ฉด ๊ฐ๋น์ง ์ปฌ๋ ์ ๋์์ด ๋์ง ์๋๋ค.