C# Programming

Java๋ฅผ ์•„๋Š” ์‚ฌ๋žŒ์„ ์œ„ํ•œ .NET ๊ฒฌ์ฃผ์–ด ์ดํ•ดํ•˜๊ธฐ

ํ”„๋กœ๊ทธ๋ž˜๋จธ ์˜ค์›” 2026. 5. 27.

JDK, JRE, JVM์˜ ๊ตฌ์กฐ๋ฅผ ์•Œ๊ณ  ์žˆ๋‹ค๋ฉด .NET์˜ ๊ฑฐ์˜ ์ด๋ฆ„๋งŒ ๋ฐ”๊ฟ” ์ฝ์œผ๋ฉด ๋  ์ •๋„๋กœ ๋‹ฎ์€๊ฒŒ ๋งŽ์Šต๋‹ˆ๋‹ค. Java ์™€ Spring ์œผ๋กœ  ๋ฐฑ์—”๋“œ๋ฅผ ๊ณต๋ถ€ํ–ˆ๋˜ ์ €์—๊ฒŒ ํ•œ๊ฐ€์ง€ ๊ฐœ๋…์„ ์ œ๋Œ€๋กœ ์ดํ•ดํ•˜๋ฉด ๋‹ค๋ฅธ ์–ธ์–ด์™€ ํ”„๋ ˆ์ž„์›Œํฌ๋„ ์ถฉ๋ถ„ํžˆ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๋ฏฟ์Œ์ด ์žˆ์—ˆ๋Š”๋ฐ์š”. ์ด๋ฒˆ์—” ์ž๋ฐ”์—์„œ ์•„๋Š” ๊ฐœ๋…์ด .NET์˜ ์–ด๋””์— ํ•ด๋‹นํ•˜๋Š”์ง€๋ฅผ ๋Œ€์‘ํ‘œ์™€ ๊ทธ๋ฆผ์œผ๋กœ ์ •๋ฆฌํ•˜๊ณ , ๊ตฌ์กฐ๋Š” ๋‹ฎ์•˜์ง€๋งŒ ์„ค๊ณ„๊ฐ€ ๊ฐˆ๋ฆฐ ์ง€์ ์„ ๋”ฐ๋กœ ์งš์–ด ๋ณด์•˜์Šต๋‹ˆ๋‹ค.

 

 

1๏ธโƒฃ ํ•œ ๋ˆˆ์— ๋ณด๋Š” ๋Œ€์‘ํ‘œ

๋‘ ์–ธ์–ด๋ฅผ ๊ณต๋ถ€ํ•˜๋‹ค ๋А๋‚€ ๊ฑด๋ฐ ๋‘ ์–ธ์–ด์˜ ํ”Œ๋žซํผ์€ ๊ฐ™์€ ๋ผˆ๋Œ€๋ฅผ ์“ด๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์†Œ์Šค๋ฅผ ์ค‘๊ฐ„ ์ฝ”๋“œ๋กœ ์ปดํŒŒ์ผํ•˜๊ณ , ๊ฐ€์ƒ ๋จธ์‹ ์ด ๊ทธ๊ฒƒ์„ JIT๋กœ ๊ธฐ๊ณ„์–ด๋กœ ๋ฐ”๊ฟ” ์‹คํ–‰ํ•˜๊ณ , ๋ฉ”๋ชจ๋ฆฌ๋Š” GC๊ฐ€ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ๊ฑฐ์˜ ์ผ๋Œ€์ผ๋กœ ๋งค์นญ์ด ๋์Šต๋‹ˆ๋‹ค.

 

Java .NET ์—ญํ• 
JDK .NET SDK ๊ฐœ๋ฐœ ๋„๊ตฌ ํ‚คํŠธ(์•„๋ž˜ ๋Ÿฐํƒ€์ž„·์ปดํŒŒ์ผ๋Ÿฌ ํฌํ•จ)
JRE .NET Runtime ์‹คํ–‰ ์—”์ง„ + ๊ธฐ๋ณธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ. ๋งŒ๋“ค์–ด์ง„ ์•ฑ์„ ๋Œ๋ฆด ๋•Œ
JVM CLR (CoreCLR) GC, JIT, ํƒ€์ž… ๋กœ๋”ฉ. ์‹คํ–‰ ์—”์ง„ ๊ทธ ์ž์ฒด
ํด๋ž˜์Šค ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ (java.*) BCL (System.*) ๊ธฐ๋ณธ ํด๋ž˜์Šค(์ปฌ๋ ‰์…˜, ๋ฌธ์ž์—ด, ํŒŒ์ผ, ๋„คํŠธ์›Œํฌ)
javac Roslyn (csc) ์ปดํŒŒ์ผ๋Ÿฌ(์†Œ์Šค → ์ค‘๊ฐ„ ์ฝ”๋“œ)
๋ฐ”์ดํŠธ์ฝ”๋“œ (.class, .jar) IL (.dll) ์ค‘๊ฐ„ ์ฝ”๋“œ(์‹คํ–‰ ๋•Œ JIT๊ฐ€ ๊ธฐ๊ณ„์–ด๋กœ ๋ณ€ํ™˜)
java ๋ช…๋ น dotnet ๋ช…๋ น ์•ฑ ์‹คํ–‰(.net์€ SDK๊ฐ€ ์žˆ์œผ๋ฉด ๋นŒ๋“œ๋„ ๊ฒธํ•จ)
Maven, Gradle MSBuild + NuGet ๋นŒ๋“œ์™€ ํŒจํ‚ค์ง€ ๊ด€๋ฆฌ(.NET์€ SDK์— ํฌํ•จ, ์ž๋ฐ”๋Š” ๋นŒ๋“œ ๋„๊ตฌ๋ฅผ ๋”ฐ๋กœ ์„ค์น˜.)
Spring MVC, Spring Boot ASP.NET Core ์›น ํ”„๋ ˆ์ž„์›Œํฌ
Java, Kotlin, Scala C#, F# ๊ฐ™์€ ๊ฐ€์ƒ ๋จธ์‹  ์œ„์˜ ์–ธ์–ด๋“ค

 

 

 

2๏ธโƒฃ์–ด๋–ค ์–ธ์–ด๊ฐ€ ๋จผ์ € ๊ฐœ๋ฐœ ๋์„๊นŒ?

C#์€ ์ด๋ฆ„์— C๊ฐ€ ๋“ค์–ด๊ฐ€ C, C++์˜ ๋ฐ”๋กœ ๋‹ค์Œ ์„ธ๋Œ€์ฒ˜๋Ÿผ ๋ณด์ด์ง€๋งŒ Java๋ณด๋‹ค 7๋…„ ๋Šฆ๊ฒŒ ๋‚˜์™”์Šต๋‹ˆ๋‹ค. ์ด๋ฆ„์˜ #์€ ์Œ์•…์˜ ์˜ฌ๋ฆผํ‘œ(์ƒพ)์ด๊ณ , C ๊ณ„์—ด ๋ฌธ๋ฒ•์„ ์ด์–ด๋ฐ›์•˜๋‹ค๋Š” ๋œป์ž…๋‹ˆ๋‹ค.

๋ฌธ๋ฒ•์€ ์‹ค์ œ๋กœ C ๊ณ„์—ด์ž…๋‹ˆ๋‹ค. ์ค‘๊ด„ํ˜ธ, ์„ธ๋ฏธ์ฝœ๋ก , for, if ๊ฐ™์€ ๊ฒƒ๋“ค์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ๊ทธ๊ฒƒ์€ Java๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค. Java ์—ญ์‹œ C++ ๊ฐœ๋ฐœ์ž๊ฐ€ ์‰ฝ๊ฒŒ ๋„˜์–ด์˜ค๋„๋ก C++ ๋ฌธ๋ฒ•์„ ๋นŒ๋ ค ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.

 

 

๋‘ ์–ธ์–ด์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๋‹ค๊ฐ€ ๋ฐœ๊ฒฌํ•œ๊ฑด๋ฐ ๋‘ ์–ธ์–ด๋Š” ์†Œ์†ก์ „์„ ํ–ˆ๋˜ ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

Microsoft๋Š” ์ฒ˜์Œ์— Java๋ฅผ ์ž๊ธฐ ๋ฐฉ์‹์œผ๋กœ ํ™•์žฅํ•ด ์“ฐ๋ ค ํ–ˆ๊ณ (J++), ๊ทธ๊ฒƒ์ด ๋ง‰ํžˆ์ž ์ž์ฒด ํ”Œ๋žซํผ์„ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.

 

 

1995๋…„ Java 1.0 (Sun Microsystems)์ด ์„ธ์ƒ์— ๋‚˜์™”๊ณ , 1996๋…„ Microsoft๊ฐ€ Java ๋ผ์ด์„ ์Šค๋ฅผ ๋ฐ›์•„ Visual J++ ์ถœ์‹œํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋‹ค์Œํ•ด์ธ 1997๋…„ Sun Microsystems์ด Microsoft๋ฅผ ์ œ์†Œํ–ˆ์Šต๋‹ˆ๋‹ค.(J++์— Windows ์ „์šฉ ํ™•์žฅ์„ ๋„ฃ์–ด Java ํ˜ธํ™˜์„ฑ์„ ๊นผ๋‹ค๋Š” ์ด์œ )

2000๋…„์—๋Š” Microsoft๊ฐ€ .NET๊ณผ C# ๋ฐœํ‘œํ–ˆ๊ณ  ๋‹ค์Œํ•ด์ธ 2001๋…„์— ์†Œ์†ก ํ•ฉ์˜ํ•˜์—ฌ Microsoft๋Š” Java ์‚ฌ์—…์—์„œ ์†์„ ๋–ผ๊ฒŒ ๋์Šต๋‹ˆ๋‹ค.

 

 

๋ฌธ๋ฒ•์˜ ๊ฒ‰๋ชจ์Šต์€ ๋‘˜ ๋‹ค C++์—์„œ ๊ฐ€์ ธ์™”์Šต๋‹ˆ๋‹ค. ๋‹ค๋งŒ, C#์€ ๋ฌธ๋ฒ•์€ C++์—์„œ, ์‹คํ–‰ ๋ชจ๋ธ์€ Java์—์„œ ๊ฐ€์ ธ์˜จ ์–ธ์–ด์— ๊ฐ€๊น์Šต๋‹ˆ๋‹ค.

C#์˜ ์„ค๊ณ„ ์ฑ…์ž„์ž Anders Hejlsberg๋Š” ๊ทธ ์ „์— Turbo Pascal๊ณผ Delphi(๋ธํŒŒ์ด)๋ฅผ ๋งŒ๋“  ์‚ฌ๋žŒ์ด์–ด์„œ ์†์„ฑ, ์ด๋ฒคํŠธ ๊ฐ™์€ Delphi์˜ ์˜ํ–ฅ๋„ ๋“ค์–ด ์žˆ์„ ๊ฑฐ๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์„ค๊ณ„์ž๋“ค์˜ ์˜๋„๋ฅผ ๋‹จ์ •ํ•  ์ˆ˜๋Š” ์—†์ง€๋งŒ, ๊ฐ€์ƒ ๋จธ์‹ ·์ค‘๊ฐ„ ์ฝ”๋“œ·GC·๋‹จ์ผ ์ƒ์†๊ณผ ์ธํ„ฐํŽ˜์ด์Šค ๊ฐ™์€ ํฐ ๊ตฌ์กฐ๊ฐ€ ๋จผ์ € ๋‚˜์˜จ Java์™€ ๊ฐ™๋‹ค๋Š” ๊ฒƒ์€ ์‚ฌ์‹ค์ž…๋‹ˆ๋‹ค.

 

  C, C++ Java, C#
์ปดํŒŒ์ผ ๊ฒฐ๊ณผ ๊ธฐ๊ณ„์–ด ์ค‘๊ฐ„ ์ฝ”๋“œ (๋ฐ”์ดํŠธ์ฝ”๋“œ / IL)
์‹คํ–‰ CPU๊ฐ€ ์ง์ ‘ ๊ฐ€์ƒ ๋จธ์‹ ์ด JIT๋กœ
๋ฉ”๋ชจ๋ฆฌ ์ง์ ‘ ํ•ด์ œ (free, delete) GC
ํฌ์ธํ„ฐ ์ž์œ ๋กญ๊ฒŒ ์‚ฌ์šฉ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ˆจ๊น€

 

 

 

3๏ธโƒฃํ—ท๊ฐˆ๋ฆฌ๋Š” .NET ์˜ ์ด๋ฆ„ ์ •๋ฆฌ

.NET ์ชฝ์€ ์ด๋ฆ„์ด ์—ฌ๋Ÿฌ ๋ฒˆ ๋ฐ”๋€Œ์–ด ํ—ท๊ฐˆ๋ฆฝ๋‹ˆ๋‹ค. ๋„ค ๊ฐœ๋งŒ ๊ตฌ๋ถ„ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

์ด๋ฆ„ ์ •์ฒด Java๋กœ ์น˜๋ฉด
.NET ๋Ÿฐํƒ€์ž„ + ๊ธฐ๋ณธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ + ๋„๊ตฌ๋ฅผ ํ•ฉ์นœ ํ”Œ๋žซํผ. ์ง€๊ธˆ์˜ ์ •์‹ ์ด๋ฆ„ Java(์–ธ์–ด ์ด๋ฆ„์ด์ž ์ƒํƒœ๊ณ„)
.NET Core 2016๋…„์— ์ƒˆ๋กœ ๋งŒ๋“  ํฌ๋กœ์Šค ํ”Œ๋žซํผ .NET. 5๋ถ€ํ„ฐ ์ด๋ฆ„์—์„œ Core๋ฅผ ๋—Œ ์ด๋ฆ„๋งŒ ๋ฐ”๋€ ๊ฐ™์€ ๊ฒƒ
.NET Framework 2002๋…„๋ถ€ํ„ฐ ์žˆ๋˜ Windows ์ „์šฉ ์›์กฐ. 4.8์—์„œ ๋ฉˆ์ถค ๊ตฌ์„ธ๋Œ€ ํ”Œ๋žซํผ
ASP.NET (Core) .NET ์œ„์—์„œ ์›น ์„œ๋ฒ„์™€ API๋ฅผ ๋งŒ๋“œ๋Š” ํ”„๋ ˆ์ž„์›Œํฌ Spring MVC / Boot

 

๋‹ค๋งŒ ASP.NET๊ณผ ASP.NET Core๋Š” ๋‹ค๋ฅธ ๋ฌผ๊ฑด์ž…๋‹ˆ๋‹ค. ์ „์ž๋Š” .NET Framework์šฉ ๊ตฌ๋ฒ„์ „์ด๊ณ , ํ›„์ž๋Š” ์ง€๊ธˆ์˜ .NET ์œ„์—์„œ ๋„๋Š” ์ƒˆ ํ”„๋ ˆ์ž„์›Œํฌ์ž…๋‹ˆ๋‹ค.

ASP.NET Core ๋ผ๊ณ  ๋ถ€๋ฅด๋Š” ์ด์œ ๋„, .NET Framework ์œ„์—์„œ๋งŒ ๋Œ๋˜ ์˜› ASP.NET๊ณผ ๊ตฌ๋ถ„ํ•ด์•ผ ํ•˜๊ธฐ ์œ„ํ•จ์ž…๋‹ˆ๋‹ค.

 

์ง€๊ธˆ ".NET"์ด๋ผ๊ณ  ํ•˜๋ฉด ์•„๋ž˜ ์ค„์„ ๊ฐ€๋ฆฌํ‚จ๋‹ค. ์œ„ ์ค„์€ ๊ผญ ".NET Framework"๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.

 

4๋ฅผ ๊ฑด๋„ˆ๋›ด ์ด์œ ๋Š” ๊ตฌ ํ”Œ๋žซํผ์ธ .NET Framework 4.x์™€ ํ—ท๊ฐˆ๋ฆฌ์ง€ ์•Š๊ฒŒ ํ•˜๋ ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

.NET5๋ถ€ํ„ฐ๋Š” "Core" ๋ฅผ ๋–ผ๊ธด ํ–ˆ์ง€๋งŒ Core๋ผ๋Š” ๋ง์€ ์•„์ง ํ”์ ์œผ๋กœ ๋งŽ์ด ๋‚จ์•„ ์žˆ์Šต๋‹ˆ๋‹ค. ๋Ÿฐํƒ€์ž„์˜ ์ด๋ฆ„์ด CoreCLR์ด๊ณ , ๋คํ”„์—์„œ ๋ณธ coreclr.dll, System.Private.CoreLib์œผ๋กœ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

 

 

 

4๏ธโƒฃSDK์˜ ๊ตฌ์กฐ

์‹คํ–‰ ๋ชจ๋ธ์€ Java์—์„œ ๊ฐ€์ ธ์˜จ ์–ธ์–ด๋‹ต๊ฒŒ JDK ⊃ JRE ⊃ JVM์˜ ํฌํ•จ ๊ด€๊ณ„๊ฐ€ .NET SDK ⊃ .NET Runtime ⊃ CLR๋กœ ๊ทธ๋Œ€๋กœ ์˜ฎ๊ฒจ์ง‘๋‹ˆ๋‹ค.

 

JDK์˜ ๊ตฌ์กฐ. Java 11๋ถ€ํ„ฐ JRE๋ฅผ ๋”ฐ๋กœ ๋ฐฐํฌํ•˜์ง€ ์•Š์ง€๋งŒ ๊ฐœ๋… ๊ตฌ๋ถ„์€ ๊ทธ๋Œ€๋กœ ์“ฐ์ž…๋‹ˆ๋‹ค.

 

 

.NET SDK 10(Windows์šฉ)์˜ ๊ตฌ์กฐ. ํŒŒ๋ž€ ํ…Œ๋‘๋ฆฌ๊ฐ€ ์„œ๋กœ ๋Œ€์‘ํ•˜๋Š” ์‹คํ–‰ ์—”์ง„์ž…๋‹ˆ๋‹ค.

 

์œ„ ๊ทธ๋ฆผ์—์„œ ์•„๋ž˜ ๋‘ ๋Ÿฐํƒ€์ž„์€ .NET Runtime๊ณผ ๋‚˜๋ž€ํžˆ ๊ทธ๋ ธ์ง€๋งŒ ๋…๋ฆฝ์ ์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‘˜ ๋‹ค .NET Runtime์ด ์žˆ์–ด์•ผ ๋Œ์•„๊ฐ‘๋‹ˆ๋‹ค. dotnet ํ•˜๋‚˜๊ฐ€ ๋‘ ์—ญํ• ์„ ํ•˜๋Š” ๊ฒƒ์€ java๊ฐ€ JRE์™€ JDK ์–‘์ชฝ์— ์žˆ๋Š” ๊ฒƒ๊ณผ ๋น„์Šทํ•ฉ๋‹ˆ๋‹ค. ๋Ÿฐํƒ€์ž„๋งŒ ์„ค์น˜ํ•˜๋ฉด ์•ฑ์„ ์‹คํ–‰ํ•˜๋Š” ํ˜ธ์ŠคํŠธ๋กœ๋งŒ ๋™์ž‘ํ•˜๊ณ , SDK๋ฅผ ์„ค์น˜ํ•˜๋ฉด build, run ๊ฐ™์€ ๋ช…๋ น์ด ์ถ”๊ฐ€๋ฉ๋‹ˆ๋‹ค.

 

๋Ÿฐํƒ€์ž„ ๋‚ด์šฉ ํ•„์š”ํ•œ ์•ฑ
.NET Runtime CLR + BCL ์ฝ˜์†” ์•ฑ, ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์„œ๋น„์Šค
ASP.NET Core Runtime ์›น ์„œ๋ฒ„์™€ ์›น ํ”„๋ ˆ์ž„์›Œํฌ HTTP ์š”์ฒญ์„ ๋ฐ›๋Š” ์•ฑ
Windows Desktop Runtime WPF, Windows Forms. ์„ค์น˜ ํŒŒ์ผ์— .NET Runtime์ด ํ•จ๊ป˜ ๋“ค์–ด ์žˆ์Œ. ์ฐฝ์ด ์žˆ๋Š” Windows ํ”„๋กœ๊ทธ๋žจ

 

 

JDK ์™€ .NET SDK ์—์„œ ๋‹ค๋ฅธ ๊ณณ

ํ•ญ๋ชฉ JDK .NET SDK
๋Ÿฐํƒ€์ž„ ๋ฌถ์Œ ํ•˜๋‚˜ ์„ธ ๊ฐœ. ๊ธฐ๋ณธ ๋Ÿฐํƒ€์ž„ ์œ„์— ASP.NET Core์™€ Windows Desktop์ด ๋”ฐ๋กœ ์žˆ์Œ.
UI ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๊ธฐ๋ณธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์•ˆ (Swing, AWT) ๋ณ„๋„ ๋Ÿฐํƒ€์ž„ (WPF, Windows Forms)
์›น ํ”„๋ ˆ์ž„์›Œํฌ ํฌํ•จ๋˜์ง€ ์•Š์Œ (Spring ๋“ฑ์„ ๋”ฐ๋กœ ๋ฐ›์Œ) ๋Ÿฐํƒ€์ž„์˜ ํ•œ ์ข…๋ฅ˜๋กœ ํฌํ•จ (ASP.NET Core)
๋นŒ๋“œ·ํŒจํ‚ค์ง€ ๋„๊ตฌ ํฌํ•จ๋˜์ง€ ์•Š์Œ (Maven, Gradle) ํฌํ•จ (MSBuild, NuGet)
์ง„๋‹จ ๋„๊ตฌ ํฌํ•จ (jmap, jstack) ํฌํ•จ๋˜์ง€ ์•Š์Œ (dotnet-dump ๋“ฑ์„ ๋”ฐ๋กœ ์„ค์น˜)
์‹คํ–‰ ์—”์ง„์˜ ์ธํ„ฐํ”„๋ฆฌํ„ฐ ์žˆ์Œ ์—†์Œ. ์ฒ˜์Œ๋ถ€ํ„ฐ JIT

 

 

 

5๏ธโƒฃ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์ฐจ์ด

JVM ๋ช…์„ธ๋Š” ๋Ÿฐํƒ€์ž„ ๋ฐ์ดํ„ฐ ์˜์—ญ์„ ๋‹ค์„ฏ ๊ฐœ๋กœ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. ํž™, JVM ์Šคํƒ, ๋ฉ”์„œ๋“œ ์˜์—ญ, ๋„ค์ดํ‹ฐ๋ธŒ ๋ฉ”์„œ๋“œ ์Šคํƒ, PC ๋ ˆ์ง€์Šคํ„ฐ์ž…๋‹ˆ๋‹ค. .NET์˜ ๋ช…์„ธ(ECMA-335)์—๋Š” ์ด๋Ÿฐ ๋ชฉ๋ก์ด ์—†์–ด์„œ, .NET ์ชฝ ์šฉ์–ด๋Š” CoreCLR ๊ตฌํ˜„๊ณผ ์ง„๋‹จ ๋„๊ตฌ์—์„œ ์˜จ ๊ฒƒ๋“ค์ž…๋‹ˆ๋‹ค.

JVM .NET์—์„œ ํ•ด๋‹นํ•˜๋Š” ๊ฒƒ ๋น„๊ณ 
ํž™ ๊ด€๋ฆฌ ํž™ (GC heap). 0·1·2์„ธ๋Œ€, LOH, POH ๊ฐ€์žฅ ์ž˜ ๋Œ€์‘๋œ๋‹ค
JVM ์Šคํƒ ์Šค๋ ˆ๋“œ ์Šคํƒ ์Šค๋ ˆ๋“œ๋งˆ๋‹ค ํ•˜๋‚˜
๋„ค์ดํ‹ฐ๋ธŒ ๋ฉ”์„œ๋“œ ์Šคํƒ ๋”ฐ๋กœ ์—†์Œ. ๊ฐ™์€ ์Šค๋ ˆ๋“œ ์Šคํƒ์„ ์“ด๋‹ค ์‹ค์ œ HotSpot๋„ ํ•œ ์Šคํƒ์— ์„ž์–ด ์Œ“๋Š”๋‹ค. ๋ช…์„ธ์ƒ์˜ ๊ตฌ๋ถ„
๋ฉ”์„œ๋“œ ์˜์—ญ ๋กœ๋” ํž™ + JIT ์ฝ”๋“œ ํž™ ํƒ€์ž… ์ •๋ณด์™€ ์ปดํŒŒ์ผ๋œ ์ฝ”๋“œ๊ฐ€ ๋”ฐ๋กœ ์žˆ๋‹ค
PC ๋ ˆ์ง€์Šคํ„ฐ ๋”ฐ๋กœ ์—†์Œ. CPU์˜ ๋ช…๋ น ํฌ์ธํ„ฐ๋ฅผ ๊ทธ๋Œ€๋กœ ์“ด๋‹ค ์ธํ„ฐํ”„๋ฆฌํ„ฐ๊ฐ€ ์—†์–ด์„œ ํ•„์š”ํ•˜์ง€ ์•Š๋‹ค

 

JVM์˜ PC ๋ ˆ์ง€์Šคํ„ฐ๋Š” ์ง€๊ธˆ ์‹คํ–‰ ์ค‘์ธ ๋ฐ”์ดํŠธ์ฝ”๋“œ์˜ ์œ„์น˜์ž…๋‹ˆ๋‹ค. .NET์€ IL์„ ์ธํ„ฐํ”„๋ฆฌํ„ฐ๋กœ ๋Œ๋ฆฌ์ง€ ์•Š๊ณ  ๊ธฐ๊ณ„์–ด๋กœ ์ปดํŒŒ์ผํ•ด ์‹คํ–‰ํ•˜๋ฏ€๋กœ CPU์˜ ๋ช…๋ น ํฌ์ธํ„ฐ ํ•˜๋‚˜๋กœ ์ถฉ๋ถ„ํ•ฉ๋‹ˆ๋‹ค.

.NET์—์„œ ์ฐธ์กฐ ํƒ€์ž…์˜ static ํ•„๋“œ๋Š” ๊ด€๋ฆฌ ํž™์˜ Object[] ๋ฐฐ์—ด์— ์ €์žฅ๋ฉ๋‹ˆ๋‹ค. gcroot ์ถœ๋ ฅ์˜ "strong handle → Object[]"๊ฐ€ ๊ทธ ๋ฐฐ์—ด์ž…๋‹ˆ๋‹ค. HotSpot๋„ Java 7๋ถ€ํ„ฐ static ๋ณ€์ˆ˜๋ฅผ ํž™์— ๋‘ก๋‹ˆ๋‹ค.

 

 

 

.NET์—์„œ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ จ ์šฉ์–ด์™€ SOS ๋ช…๋ น์–ด

SOS๋Š” ๋””๋ฒ„๊ฑฐ์— “.NET ๋Ÿฐํƒ€์ž„์˜ ๋‚ด๋ถ€ ๊ตฌ์กฐ๋ฅผ ์ฝ๋Š” ๋ฒ•”์„ ๊ฐ€๋ฅด์ณ ์ฃผ๋Š” ํ™•์žฅ ๋ชจ๋“ˆ์ž…๋‹ˆ๋‹ค. Son of Strike์˜ ์•ฝ์ž์ž…๋‹ˆ๋‹ค.

.NET ์ดˆ๊ธฐ ๊ฐœ๋ฐœ ๋•Œ ๋Ÿฐํƒ€์ž„์˜ ์ฝ”๋“œ๋ช…์ด Lightning์ด์—ˆ๊ณ , ๊ทธ๊ฒƒ์„ ๋””๋ฒ„๊น…ํ•˜๋˜ ์‚ฌ๋‚ด ๋„๊ตฌ ์ด๋ฆ„์ด Strike์˜€์Šต๋‹ˆ๋‹ค. ๋ฒˆ๊ฐœ(lightning)๊ฐ€ ์น˜๋Š” ๊ฒƒ(strike)์—์„œ ๋”ด ์ด๋ฆ„์ž…๋‹ˆ๋‹ค. ๋‚˜์ค‘์— ์™ธ๋ถ€ ๊ณต๊ฐœ์šฉ์œผ๋กœ ์ค„์—ฌ์„œ ๋งŒ๋“  ๊ฒƒ์ด “Strike์˜ ์•„๋“ค”, SOS์ž…๋‹ˆ๋‹ค.

dumpheap, dumpobj, gcroot, eeheap, clrstack์ด ์ „๋ถ€ SOS๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๋ช…๋ น์ž…๋‹ˆ๋‹ค.

 

์šฉ์–ด ์„ค๋ช… ๋ณด๋Š” ๋ฐฉ๋ฒ•
๊ด€๋ฆฌ ํž™ / GC ํž™ GC๊ฐ€ ๊ด€๋ฆฌํ•˜๋Š” ๊ฐ์ฒด ์˜์—ญ eeheap -gc
SOH, LOH, POH ๊ด€๋ฆฌ ํž™์˜ ์„ธ๋ถ€ ๊ตฌ์—ญ (์ž‘์€ ๊ฐ์ฒด, ํฐ ๊ฐ์ฒด, ๊ณ ์ • ๊ฐ์ฒด) eeheap -gc
๋กœ๋” ํž™ ํƒ€์ž… ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ eeheap -loader
์ฝ”๋“œ ํž™ JIT๋œ ์ฝ”๋“œ eeheap -loader
์Šคํƒ ์Šค๋ ˆ๋“œ๋ณ„ ํ˜ธ์ถœ ์Šคํƒ clrstack
ํ•ธ๋“ค ํ…Œ์ด๋ธ” GC ํ•ธ๋“ค. GC ๋ฃจํŠธ์˜ ํ•œ ์ข…๋ฅ˜ gchandles
๋„ค์ดํ‹ฐ๋ธŒ / ๋น„๊ด€๋ฆฌ ๋ฉ”๋ชจ๋ฆฌ ๊ทธ ๋ฐ–์— ๋Ÿฐํƒ€์ž„๊ณผ ๋„ค์ดํ‹ฐ๋ธŒ ์ฝ”๋“œ๊ฐ€ ์ง์ ‘ ์žก์€ ๊ฒƒ WinDbg ๋„๊ตฌ ์‚ฌ์šฉํ•ด์„œ
!address -summary ๋ช…๋ น์–ด

 

์‹ค๋ฌด์—์„œ๋Š” "๊ด€๋ฆฌ(managed)๋ƒ ๋น„๊ด€๋ฆฌ(unmanaged)๋ƒ"์˜ ๋‘ ๊ฐˆ๋ž˜๋กœ ๋จผ์ € ๋‚˜๋ˆ•๋‹ˆ๋‹ค. ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๋Š˜์—ˆ์„ ๋•Œ GC ํž™์ด ๊ฐ™์ด ๋Š˜์—ˆ์œผ๋ฉด ๊ด€๋ฆฌ ์ชฝ, ์•„๋‹ˆ๋ฉด ๋น„๊ด€๋ฆฌ ์ชฝ์„ ๋ด…๋‹ˆ๋‹ค.

WinDbg๋Š” Windows ๋คํ”„ ๋ถ„์„์˜ ํ‘œ์ค€ ๋„๊ตฌ์ž…๋‹ˆ๋‹ค. ๋‹ค๋งŒ Windows์— ๋“ค์–ด ์žˆ๋Š” ์•ฑ์€ ์•„๋‹ˆ๊ณ  ๋”ฐ๋กœ ์„ค์น˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋„ค์ดํ‹ฐ๋ธŒ ๋ฉ”๋ชจ๋ฆฌ, ํฌ๋ž˜์‹œ, ๊ต์ฐฉ ๋“ฑ์„ ์ง์ ‘ ํƒ์ƒ‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

 

 

6๏ธโƒฃGC ๋น„๊ต

์ž๋ฐ”, .NET ๋‘˜ ๋‹ค ์„ธ๋Œ€๋ณ„ GC์ด๊ณ  ๋„๋‹ฌ ๊ฐ€๋Šฅ์„ฑ์œผ๋กœ ์ƒ์‚ฌ๋ฅผ ํŒ๋‹จํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์ ์€ "๋ฌด์—‡์„ ๊ณ ๋ฅด๊ฒŒ ํ•˜๋Š”๊ฐ€"์ž…๋‹ˆ๋‹ค. JVM์€ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ž์ฒด๋ฅผ ๊ณ ๋ฅด๊ณ , .NET์€ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ํ•˜๋‚˜์ด๊ณ  ์šด์šฉ ๋ฐฉ์‹์„ ๊ณ ๋ฆ…๋‹ˆ๋‹ค.

 

.NET์˜ ๋‘ ๋ชจ๋“œ

.NET์˜ ๊ธฐ๋ณธ GC๋Š” Workstation GC์ด๊ณ  Server GC ๋Š” ์„ค์ •์„ ํ†ตํ•ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 

  Workstation GC Server GC
์šฐ์„ ์‹œ ํ•˜๋Š” ๊ฒƒ ์ ์€ ๋ฉ”๋ชจ๋ฆฌ, ์งง์€ ๋ฉˆ์ถค ์ฒ˜๋ฆฌ๋Ÿ‰ (์ดˆ๋‹น ์š”์ฒญ ์ˆ˜)
๊ด€๋ฆฌ ํž™ ๊ฐœ์ˆ˜ 1๊ฐœ ๋…ผ๋ฆฌ ์ฝ”์–ด๋‹น 1๊ฐœ (4์ฝ”์–ด๋ฉด 4๊ฐœ)
GC๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ์Šค๋ ˆ๋“œ ํ• ๋‹นํ•˜๋‹ค GC๋ฅผ ์ผ์œผํ‚จ ๊ทธ ์Šค๋ ˆ๋“œ 1๊ฐœ ์ฝ”์–ด๋งˆ๋‹ค ์ „์šฉ GC ์Šค๋ ˆ๋“œ. ๋ณ‘๋ ฌ๋กœ ์ˆ˜์ง‘
0์„ธ๋Œ€ ์˜ˆ์‚ฐ ์ž‘๋‹ค. ์ž์ฃผ, ์งง๊ฒŒ ์ˆ˜์ง‘ ํฌ๋‹ค. ๋“œ๋ฌผ๊ฒŒ, ํ•œ๊บผ๋ฒˆ์— ์ˆ˜์ง‘
๋ฉ”๋ชจ๋ฆฌ ์ ์œ  ๋‚ฎ๋‹ค ๋†’๋‹ค. ํž™๋งˆ๋‹ค ์—ฌ์œ ๋ถ„์„ ๋”ฐ๋กœ ์œ ์ง€
์ ์ ˆํ•œ ๊ณณ ๋ฐ์Šคํฌํ†ฑ ์•ฑ, ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๋น ๋“ฏํ•œ ์„œ๋ฒ„, ํ•œ ์„œ๋ฒ„์— ํ”„๋กœ์„ธ์Šค๊ฐ€ ์—ฌ๋Ÿฌ ๊ฐœ์ธ ๊ฒฝ์šฐ ์„œ๋ฒ„ ํ•œ ๋Œ€๋ฅผ ํ”„๋กœ์„ธ์Šค ํ•˜๋‚˜๊ฐ€ ๋…์ฐจ์ง€ํ•˜๋Š” ์›น ์„œ๋ฒ„

 

“0์„ธ๋Œ€ ์˜ˆ์‚ฐ”์€ 0์„ธ๋Œ€์— ์ด๋งŒํผ ํ• ๋‹น๋˜๋ฉด GC๋ฅผ ๋Œ๋ฆฐ๋‹ค๋Š” ๊ธฐ์ค€๋Ÿ‰์ž…๋‹ˆ๋‹ค.

Server GC๋Š” ์ด ๊ฐ’์ด ํ›จ์”ฌ ํฌ๊ณ  ํž™์ด ์ฝ”์–ด ์ˆ˜๋งŒํผ ์žˆ์–ด์„œ, ๊ฐ™์€ ์ผ์„ ํ•ด๋„ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์žก๊ณ  ์žˆ๋Š” ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๋” ํฝ๋‹ˆ๋‹ค.

 

 

GC๊ฐ€ ๊ฐ์ฒด๋ฅผ ์ง€์šฐ๋Š” ๊ฒƒ๊ณผ ๊ทธ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ OS์— ๋ฐ˜๋‚ฉ(๋””์ปค๋ฐ‹)ํ•˜๋Š” ๊ฒƒ์€ ๋ณ„๊ฐœ์˜ ๋‹จ๊ณ„์ž…๋‹ˆ๋‹ค. GC๋Š” ๋น„๊ฒŒ ๋œ ๊ณต๊ฐ„์„ ๊ณง ๋‹ค์‹œ ์“ธ ๊ฒƒ์œผ๋กœ ๋ณด๊ณ  ์–ด๋А ์ •๋„ ์ฅ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. OS์— ๋Œ๋ ค์คฌ๋‹ค๊ฐ€ ๋‹ค์‹œ ๋ฐ›๋Š” ๋น„์šฉ์ด ํฌ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ Server GC ํ”„๋กœ์„ธ์Šค๋Š” ํฐ ์ž‘์—…์„ ํ•œ ๋ฒˆ ์น˜๋ฅธ ๋’ค Private Bytes๊ฐ€ ํ•œ์ฐธ ๋†’๊ฒŒ ์œ ์ง€๋˜๋Š” ์ผ์ด ํ”ํ•˜๊ณ , ์ด๊ฒƒ์€ ๋ˆ„์ˆ˜๊ฐ€ ์•„๋‹ˆ๋ผ ์ •์ƒ ๋™์ž‘์ž…๋‹ˆ๋‹ค.
์ด "์ฅ๊ณ  ์žˆ๋Š”" ์„ฑํ–ฅ์ด Server GC์—์„œ ํ›จ์”ฌ ๊ฐ•ํ•ฉ๋‹ˆ๋‹ค.

 

Workstation์€ ๊ทธ๋ ‡๊ฒŒ ์˜ค๋ž˜ ์ฅ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํž™์ด ํ•˜๋‚˜์ด๊ณ  ์˜ˆ์‚ฐ์ด ์ž‘์•„์„œ, ์ „์ฒด GC ๋’ค์— ๋น„๊ฒŒ ๋œ ์˜์—ญ์„ ๋น„๊ต์  ๋นจ๋ฆฌ ๋ฐ˜๋‚ฉํ•ฉ๋‹ˆ๋‹ค.

 

์„ธ๋Œ€๋ณ„ GC ์ค‘์— 2์„ธ๋Œ€ GC์—๋Š” ๋‘ ๋ฐฉ์‹์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐฑ๊ทธ๋ผ์šด๋“œ GC์™€ ๋ธ”๋กœํ‚น GC์ž…๋‹ˆ๋‹ค.

๋ฐฑ๊ทธ๋ผ์šด๋“œ GC ๋Š” ์ „์šฉ ์Šค๋ ˆ๋“œ๊ฐ€ 2์„ธ๋Œ€๋ฅผ ๋งˆํฌํ•˜๋Š” ๋™์•ˆ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ๊ณ„์† ์‹คํ–‰. ์งง๊ฒŒ ๋‘ ๋ฒˆ๋งŒ ๋ฉˆ์ถฅ๋‹ˆ๋‹ค.

๋ธ”๋กœํ‚น GC ๋Š” ์ฒ˜์Œ๋ถ€ํ„ฐ ๋๊นŒ์ง€ ๋ชจ๋“  ์Šค๋ ˆ๋“œ๋ฅผ ์„ธ์›๋‹ˆ๋‹ค.

๋ฐฑ๊ทธ๋ผ์šด๋“œ GC(2์„ธ๋Œ€ ์ˆ˜์ง‘์„ ์•ฑ๊ณผ ๋™์‹œ์— ์ง„ํ–‰)๋ฅผ ์ผค์ง€๊ฐ€ ๋ณ„๋„ ์„ค์ •์œผ๋กœ ์žˆ๊ณ  ๊ธฐ๋ณธ๊ฐ’์€ ์ผœ์ง์ž…๋‹ˆ๋‹ค.

 

๊ตฌ๋ถ„ ๋ฐฑ๊ทธ๋ผ์šด๋“œ GC ๋ธ”๋กœํ‚น GC
๋™์ž‘ ์ „์šฉ ์Šค๋ ˆ๋“œ๊ฐ€ 2์„ธ๋Œ€๋ฅผ ๋งˆํฌํ•˜๋Š” ๋™์•ˆ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ๊ณ„์† ์‹คํ–‰. ์งง๊ฒŒ ๋‘ ๋ฒˆ๋งŒ ๋ฉˆ์ถค ์ฒ˜์Œ๋ถ€ํ„ฐ ๋๊นŒ์ง€ ๋ชจ๋“  ์Šค๋ ˆ๋“œ๋ฅผ ์„ธ์›€
์ •๋ฆฌ ๋ฐฉ์‹ ์Šค์œ•๋งŒ ํ•จ. ์••์ถ•ํ•˜์ง€ ์•Š์Œ ์••์ถ• ๊ฐ€๋Šฅ. ๋นˆ ์˜์—ญ์„ ๋ชจ์•„ OS์— ๋ฐ˜๋‚ฉํ•  ์ˆ˜ ์žˆ์Œ
์–ธ์ œ ํ‰์ƒ์‹œ์˜ 2์„ธ๋Œ€ GC ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๋ถ€์กฑํ•  ๋•Œ, ์••์ถ•์ด ํ•„์š”ํ•˜๋‹ค๊ณ  ํŒ๋‹จ๋  ๋•Œ, ์ˆ˜์ง‘ ์ค‘ ํ• ๋‹น์ด ๋„ˆ๋ฌด ๋น ๋ฅผ ๋•Œ

 

 

JVM์˜ GC์™€ ๋†“๊ณ  ๋ณด๋ฉด

JVM ๋น„์Šท .NET ์„ค์ • ๊ณตํ†ต์ 
Serial Workstation, ๋ฐฑ๊ทธ๋ผ์šด๋“œ ๋” ์Šค๋ ˆ๋“œ ํ•˜๋‚˜๋กœ ์ˆ˜์ง‘. ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ ๊ฒŒ ์”€
Parallel Server, ๋ฐฑ๊ทธ๋ผ์šด๋“œ ๋” ๋ณ‘๋ ฌ ์ˆ˜์ง‘. ์ฒ˜๋ฆฌ๋Ÿ‰ ์šฐ์„ 
G1 (JDK 9๋ถ€ํ„ฐ ๊ธฐ๋ณธ) Server, ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์ผฌ ๋ณ‘๋ ฌ ์ˆ˜์ง‘ + ๋งˆํฌ์˜ ์ผ๋ถ€๋ฅผ ์•ฑ๊ณผ ๋™์‹œ์—
ZGC, Shenandoah ๋Œ€์‘ํ•˜๋Š” ๊ฒƒ ์—†์Œ ์••์ถ•๊นŒ์ง€ ์•ฑ๊ณผ ๋™์‹œ์—. ๋ฉˆ์ถค์ด ๋งค์šฐ ์งง์Œ

 

JVM์€ CPU๊ฐ€ 2๊ฐœ ์ด์ƒ์ด๊ณ  ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์•ฝ 2GB ์ด์ƒ์ธ ํ™˜๊ฒฝ์—์„œ G1์„, ๊ทธ๋ณด๋‹ค ์ž‘์œผ๋ฉด Serial์„ ๊ณ ๋ฆ…๋‹ˆ๋‹ค. .NET์ด ํ”„๋กœ์ ํŠธ ์ข…๋ฅ˜๋กœ ๊ธฐ๋ณธ๊ฐ’์„ ์ •ํ•˜๋Š” ๊ฒƒ๊ณผ ๋‹ฌ๋ฆฌ ํ•˜๋“œ์›จ์–ด๋ฅผ ๋ณด๊ณ  ์ •ํ•ฉ๋‹ˆ๋‹ค. ์ •ํ™•ํžˆ ์ผ์น˜ํ•˜๋Š” ์ง์€ ์—†๊ณ  ์„ฑ๊ฒฉ์ด ๊ฐ€๊นŒ์šด ๊ฒƒ๋ผ๋ฆฌ ๋†“์€ ํ‘œ์ž…๋‹ˆ๋‹ค.

 

๊ฐ€์žฅ ํฐ ์ฐจ์ด - ํž™ ์ƒํ•œ

GC๋ฅผ ๋น„๊ตํ•˜๋ฉด์„œ ์ œ๊ฐ€ ๊ฐ€์žฅ ๋†€๋ž๋˜ ๋ถ€๋ถ„์€ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ์•„๋‹ˆ๋ผ ํž™์˜ ์ตœ๋Œ€ ํฌ๊ธฐ๋ฅผ ์ •ํ•ด ๋‘๋А๋ƒ์˜€์Šต๋‹ˆ๋‹ค. Java๋ฅผ ํ•˜๋˜ ์Šต๊ด€๋Œ€๋กœ "ํž™์€ ์–ด๋”˜๊ฐ€์—์„œ ๋ง‰ํžˆ๊ฒ ์ง€"๋ผ๊ณ  ์ƒ๊ฐํ–ˆ๋Š”๋ฐ, .NET์€ ๊ธฐ๋ณธ์œผ๋กœ ๋ง‰๋Š” ๊ณณ์ด ์—†์—ˆ์Šต๋‹ˆ๋‹ค.

 

  JVM .NET
ํž™ ์ตœ๋Œ€ ํฌ๊ธฐ์˜ ๊ธฐ๋ณธ๊ฐ’ ๋ฌผ๋ฆฌ ๋ฉ”๋ชจ๋ฆฌ์˜ 1/4 (-Xmx๋กœ ๋ณ€๊ฒฝ) ์ƒํ•œ ์—†์Œ (GCHeapHardLimit์„ ๋”ฐ๋กœ ์ค˜์•ผ ํ•จ)
ํž™์ด ๊ณ„์† ์ปค์ง€๋ฉด ์ƒํ•œ์— ๋‹ฟ์œผ๋ฉด OutOfMemoryError. ๊ทธ ํ”„๋กœ์„ธ์Šค๋งŒ ์ฃฝ๋Š”๋‹ค OS๊ฐ€ ๋‚ด์ค„ ์ˆ˜ ์žˆ๋Š” ๋งŒํผ ์ปค์ง„๋‹ค. ์„œ๋ฒ„ ์ „์ฒด๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ ์••๋ฐ•์„ ๋ฐ›๋Š”๋‹ค
๋ฉˆ์ถค ์‹œ๊ฐ„ ๋ชฉํ‘œ G1์€ ๊ธฐ๋ณธ 200ms ๋ชฉํ‘œ๋ฅผ ๋‘๊ณ  ์ˆ˜์ง‘๋Ÿ‰์„ ์กฐ์ ˆ ๋ฐ€๋ฆฌ์ดˆ ๋‹จ์œ„ ๋ชฉํ‘œ๋ฅผ ์ฃผ๋Š” ์„ค์ •์€ ์—†์Œ

 

JVM์€ ๋”ฐ๋กœ ์˜ต์…˜์„ ์ฃผ์ง€ ์•Š์•„๋„ ๋ฌผ๋ฆฌ ๋ฉ”๋ชจ๋ฆฌ์˜ 1/4์—์„œ ํž™์„ ๋ฉˆ์ถฅ๋‹ˆ๋‹ค. 8GB ์„œ๋ฒ„๋ผ๋ฉด ์•ฝ 2GB์ž…๋‹ˆ๋‹ค. ๊ฑฐ๊ธฐ์„œ ๋” ํ•„์š”ํ•˜๋ฉด ์ „์ฒด GC๋ฅผ ๋ฐ˜๋ณตํ•˜๋‹ค๊ฐ€ OutOfMemoryError๋ฅผ ๋˜์ง€๊ณ , ๋ฌธ์ œ๊ฐ€ ๊ทธ ํ”„๋กœ์„ธ์Šค ์•ˆ์—์„œ ๋ถ„๋ช…ํ•œ ์˜ค๋ฅ˜๋กœ ๋“œ๋Ÿฌ๋‚ฉ๋‹ˆ๋‹ค.

 

 

.NET์€ ๋ฐ˜๋Œ€์ž…๋‹ˆ๋‹ค. GCHeapHardLimit์„ ์ง€์ •ํ•˜์ง€ ์•Š์œผ๋ฉด ๊ด€๋ฆฌ ํž™์— ์ •ํ•ด์ง„ ์ƒํ•œ์ด ์—†์Šต๋‹ˆ๋‹ค. ๋ฌผ๋ฆฌ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋ฅ ์ด 90%์— ๊ฐ€๊นŒ์›Œ์ง€๋ฉด GC๊ฐ€ ์••์ถ• GC๋ฅผ ๋” ์ ๊ทน์ ์œผ๋กœ ๋Œ๋ฆฌ๊ธด ํ•˜์ง€๋งŒ, ๊ทธ๋ž˜๋„ ๊ณ„์† ์‚ด์•„ ์žˆ๋Š” ๊ฐ์ฒด๊ฐ€ ๋Š˜์–ด๋‚˜๋ฉด ํž™๋„ ๊ฐ™์ด ์ปค์ง‘๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๋ฌธ์ œ๋Š” "์ด ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ฃฝ์—ˆ๋‹ค"๊ฐ€ ์•„๋‹ˆ๋ผ "์„œ๋ฒ„ ์ „์ฒด๊ฐ€ ๋А๋ฆฌ๋‹ค"๋Š” ๋ชจ์Šต์œผ๋กœ ๋‚˜ํƒ€๋‚˜๊ธฐ ์‰ฝ์Šต๋‹ˆ๋‹ค.

 

 

ํ•œ ๊ฐ€์ง€ ์˜ˆ์™ธ๋Š” ์ปจํ…Œ์ด๋„ˆ์ž…๋‹ˆ๋‹ค. ์ปจํ…Œ์ด๋„ˆ์ฒ˜๋Ÿผ ๋ฉ”๋ชจ๋ฆฌ ํ•œ๋„๊ฐ€ ๊ฑธ๋ฆฐ ํ™˜๊ฒฝ์—์„œ๋Š” .NET๋„ ๊ทธ ํ•œ๋„์˜ 75%(๋˜๋Š” 20MB ์ค‘ ํฐ ๊ฐ’)๋ฅผ ๊ธฐ๋ณธ ์ƒํ•œ์œผ๋กœ ์žก์Šต๋‹ˆ๋‹ค. ๋ฐ˜๋Œ€๋กœ Windows ์„œ๋ฒ„์— ๊ทธ๋ƒฅ ๋„์šด ํ”„๋กœ์„ธ์Šค๋ผ๋ฉด ์ƒํ•œ์ด ์—†๋Š” ์…ˆ์ž…๋‹ˆ๋‹ค.

์ƒํ•œ์„ ์ง์ ‘ ์ฃผ๊ณ  ์‹ถ๋‹ค๋ฉด runtimeconfig.json์— ๋‹ค์Œ์ฒ˜๋Ÿผ ๋„ฃ์œผ๋ฉด ๋ฉ๋‹ˆ๋‹ค. ๋ฐ”์ดํŠธ ๋‹จ์œ„์ด๊ณ , ์•„๋ž˜ ๊ฐ’์€ 2GiB์ž…๋‹ˆ๋‹ค.

{
  "runtimeOptions": {
    "configProperties": {
      "System.GC.HeapHardLimit": 2147483648
    }
  }
}

๋น„์œจ๋กœ ์ฃผ๊ณ  ์‹ถ์œผ๋ฉด System.GC.HeapHardLimitPercent๋ฅผ ์“ฐ๊ณ , ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋กœ๋Š” DOTNET_GCHeapHardLimit(16์ง„์ˆ˜ ๊ฐ’)์œผ๋กœ๋„ ์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

 

 

7๏ธโƒฃ์„ค๊ณ„๊ฐ€ ๊ฐˆ๋ฆฐ ๊ณณ

์ง€๊ธˆ๊นŒ์ง€๋Š” ๋‹ฎ์€ ์  ์œ„์ฃผ๋กœ ๋ดค๋‹ค๋ฉด, ์ด๋ฒˆ์—” ๊ฐ™์€ ๋ผˆ๋Œ€ ์•ˆ์—์„œ ์„œ๋กœ ๋‹ค๋ฅธ ์„ ํƒ์„ ํ•œ ์ง€์ ๋“ค์ž…๋‹ˆ๋‹ค. ์œ„์—์„œ ๋”ฐ๋กœ ๋‹ค๋ฃฌ ๊ฒƒ๋“ค๋„ ํ•œ ํ‘œ์— ๋ชจ์•„ ๋ณด์•˜์Šต๋‹ˆ๋‹ค.

 

  Java .NET
๊ฐ’ ํƒ€์ž… ๊ธฐ๋ณธํ˜• 8๊ฐœ๋ฟ. ์‚ฌ์šฉ์ž๊ฐ€ ์ง์ ‘ ์ •์˜ํ•  ์ˆ˜ ์—†์Œ struct๋กœ ์ง์ ‘ ์ •์˜. ํž™ ํ• ๋‹น ์—†์ด ์Šคํƒ์ด๋‚˜ ๋ฐฐ์—ด ์•ˆ์— ํ†ต์งธ๋กœ ๋“ค์–ด๊ฐ
์ œ๋„ค๋ฆญ ์ปดํŒŒ์ผ ๋•Œ ํƒ€์ž… ์ •๋ณด๊ฐ€ ์ง€์›Œ์ง. List<Integer>๋Š” ํ•ญ์ƒ ๋ฐ•์‹ฑ ๋Ÿฐํƒ€์ž„๊นŒ์ง€ ํƒ€์ž… ์œ ์ง€. List<int>๋Š” ๋ฐ•์‹ฑ ์—†์ด ์ •์ˆ˜๋ฅผ ๊ทธ๋Œ€๋กœ ์ €์žฅ
์‹คํ–‰ ๋ฐฉ์‹ ์ธํ„ฐํ”„๋ฆฌํ„ฐ๋กœ ์‹œ์ž‘ํ•ด ์ž์ฃผ ๋„๋Š” ์ฝ”๋“œ๋งŒ JIT ์ฒ˜์Œ๋ถ€ํ„ฐ JIT (๋‹จ๊ณ„๋ณ„ ์žฌ์ปดํŒŒ์ผ์€ ์žˆ์Œ)
ํž™ ์ƒํ•œ ๊ธฐ๋ณธ์œผ๋กœ ์žˆ์Œ ๊ธฐ๋ณธ์œผ๋กœ ์—†์Œ (์ปจํ…Œ์ด๋„ˆ ์ œ์™ธ)
GC ์„ ํƒ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ž์ฒด๋ฅผ ๊ณ ๋ฆ„ ์šด์šฉ ๋ฐฉ์‹๋งŒ ๊ณ ๋ฆ„
๋Ÿฐํƒ€์ž„ ๋ฌถ์Œ ํ•˜๋‚˜ ์šฉ๋„๋ณ„๋กœ ์„ธ ๊ฐœ
์ง„๋‹จ ๋„๊ตฌ JDK์— ํฌํ•จ ๋”ฐ๋กœ ์„ค์น˜
๊ตฌํ˜„์ฒด ์—ฌ๋Ÿฌ ๋ฒค๋” (OpenJDK ๊ธฐ๋ฐ˜ ๋ฐฐํฌํŒ๋“ค) ์‚ฌ์‹ค์ƒ Microsoft๊ฐ€ ์ฃผ๋„ํ•˜๋Š” ๊ฒƒ ํ•˜๋‚˜

 

์ด ์ค‘์—์„œ Java ๊ฐœ๋ฐœ์ž๊ฐ€ ๊ฐ€์žฅ ๋‚ฏ์„ค๊ฒŒ ๋А๋‚„ ๋ถ€๋ถ„์€ ๊ฐ’ ํƒ€์ž…๊ณผ ์ œ๋„ค๋ฆญ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋‘˜์€ ๋”ฐ๋กœ ๋…ธ๋Š” ์ด์•ผ๊ธฐ๊ฐ€ ์•„๋‹ˆ๋ผ ๊ฐ™์ด ๋ฌถ์—ฌ ์žˆ์Šต๋‹ˆ๋‹ค.

Java์˜ ์ œ๋„ค๋ฆญ์€ ์ปดํŒŒ์ผ์ด ๋๋‚˜๋ฉด ํƒ€์ž… ์ •๋ณด๊ฐ€ ์ง€์›Œ์ง‘๋‹ˆ๋‹ค(ํƒ€์ž… ์†Œ๊ฑฐ, Type Erasure). ๋Ÿฐํƒ€์ž„์—๋Š” List<Integer>๋‚˜ List<String>์ด๋‚˜ ๋˜‘๊ฐ™์ด Object๋ฅผ ๋‹ด๋Š” ๋ฆฌ์ŠคํŠธ์ผ ๋ฟ์ด๋ผ, int๋ฅผ ๋„ฃ์œผ๋ ค๋ฉด Integer ๊ฐ์ฒด๋กœ ๊ฐ์‹ธ์•ผ(๋ฐ•์‹ฑ) ํ•ฉ๋‹ˆ๋‹ค.

List<Integer> list = new ArrayList<>();
list.add(1);   // int → Integer ๊ฐ์ฒด๋กœ ๋ฐ•์‹ฑ๋˜์–ด ํž™์— ์˜ฌ๋ผ๊ฐ„๋‹ค

 

 

.NET์€ ์ œ๋„ค๋ฆญ ํƒ€์ž… ์ •๋ณด๋ฅผ ๋Ÿฐํƒ€์ž„๊นŒ์ง€ ๋“ค๊ณ  ๊ฐ‘๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ List<int>๋Š” ๋‚ด๋ถ€ ๋ฐฐ์—ด์ด int[]์ด๊ณ , ์ •์ˆ˜๋ฅผ ๊ฐ์ฒด๋กœ ๊ฐ์‹ธ์ง€ ์•Š๊ณ  ๊ทธ๋Œ€๋กœ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.

List<int> list = new List<int>();
list.Add(1);   // ๋ฐ•์‹ฑ ์—†์Œ. ๋‚ด๋ถ€ int[] ๋ฐฐ์—ด์— 4๋ฐ”์ดํŠธ ์ •์ˆ˜๋กœ ๋“ค์–ด๊ฐ„๋‹ค

์ฆ‰, ์š”์†Œ๊ฐ€ ์ˆ˜๋ฐฑ๋งŒ ๊ฐœ์ฏค ๋˜๋ฉด Java ์ชฝ์€ ๊ทธ๋งŒํผ์˜ Integer ๊ฐ์ฒด๊ฐ€ ํž™์— ์ƒ๊ธฐ๊ณ , .NET ์ชฝ์€ ์ •์ˆ˜ ๋ฐฐ์—ด ํ•˜๋‚˜๋กœ ๋๋‚ฉ๋‹ˆ๋‹ค. ๋Œ€์‹  .NET์—์„œ๋„ ๊ฐ’ ํƒ€์ž…์„ object๋‚˜ ์ธํ„ฐํŽ˜์ด์Šค ์ž๋ฆฌ์— ๋„˜๊ธฐ๋ฉด ๋ฐ•์‹ฑ์ด ์ผ์–ด๋‚˜๊ธฐ ๋•Œ๋ฌธ์— "๋ฐ•์‹ฑ์ด ์—†๋‹ค"๊ฐ€ ์•„๋‹ˆ๋ผ "ํ”ผํ•  ์ˆ˜ ์žˆ๋Š” ๊ธธ์ด ์žˆ๋‹ค"๋กœ ์ดํ•ดํ•˜์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

 

 

 

 

โœจ๋งˆ๋ฌด๋ฆฌ

์ฒ˜์Œ .NET ์„ ๊ณต๋ถ€ํ–ˆ์„ ๋•Œ๋Š” coreclr.dll, ๋กœ๋” ํž™, Workstation GC ๊ฐ™์€ ๋‚ฏ์„  ์ด๋ฆ„๋“ค ๋•Œ๋ฌธ์— ์™„์ „ํžˆ ๋‹ค๋ฅธ ์„ธ๊ณ„์ฒ˜๋Ÿผ ๋А๊ปด์กŒ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ํ•˜๋‚˜์”ฉ Java์— ๋Œ€์‘์‹œ์ผœ ๋ณด๋‹ˆ ๋Œ€๋ถ€๋ถ„์€ ์ด๋ฆ„๋งŒ ๋‹ค๋ฅผ ๋ฟ ์ด๋ฏธ ์•Œ๊ณ  ์žˆ๋˜ ๊ฐœ๋…์ด์—ˆ์Šต๋‹ˆ๋‹ค.

์ฒ˜์Œ์— ๋ง์”€๋“œ๋ฆฐ "ํ•œ ๊ฐ€์ง€ ๊ฐœ๋…์„ ์ œ๋Œ€๋กœ ์ดํ•ดํ•˜๋ฉด ๋‹ค๋ฅธ ๊ฒƒ๋„ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋‹ค"๋Š” ๋ฏฟ์Œ์ด ์ด๋ฒˆ์—๋„ ์–ด๋А ์ •๋„ ๋งž์•˜๋˜ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ •๋ฆฌํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  1. JDK ⊃ JRE ⊃ JVM ๊ตฌ์กฐ๋Š” .NET SDK ⊃ .NET Runtime ⊃ CLR๋กœ ๊ฑฐ์˜ ๊ทธ๋Œ€๋กœ ์˜ฎ๊ฒจ์ง‘๋‹ˆ๋‹ค. ์ด๋ฆ„๋งŒ ๋ฐ”๊ฟ” ์ฝ์–ด๋„ ํฐ ๊ทธ๋ฆผ์€ ์žกํž™๋‹ˆ๋‹ค.
  2. ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์€ JVM ๋ช…์„ธ์ฒ˜๋Ÿผ ์ •ํ•ด์ง„ ๋ชฉ๋ก์ด ์—†์–ด์„œ, ๊ด€๋ฆฌ ํž™·๋กœ๋” ํž™·์ฝ”๋“œ ํž™ ๊ฐ™์€ CoreCLR ์ชฝ ์ด๋ฆ„์„ ๋”ฐ๋กœ ์ตํ˜€์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  3. GC๋Š” JVM์ด ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๊ณ ๋ฅด๊ณ , .NET์€ Workstation/Server์™€ ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์—ฌ๋ถ€๋ผ๋Š” ์šด์šฉ ๋ฐฉ์‹์„ ๊ณ ๋ฆ…๋‹ˆ๋‹ค.
  4. ๊ฐ€์žฅ ์กฐ์‹ฌํ•ด์•ผ ํ•  ์ฐจ์ด๋Š” ํž™ ์ƒํ•œ์ž…๋‹ˆ๋‹ค. Java์ฒ˜๋Ÿผ "์–ด๋”˜๊ฐ€์—์„œ ๋ง‰ํžˆ๊ฒ ์ง€"๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด .NET์—์„œ๋Š” ์„œ๋ฒ„ ์ „์ฒด๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋‚ด์ฃผ๊ฒŒ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  5. ๊ฐ’ ํƒ€์ž…๊ณผ ์ œ๋„ค๋ฆญ์€ ๋‹ฎ์€ ๊ตฌ์กฐ ์•ˆ์—์„œ ์„ค๊ณ„๊ฐ€ ๊ฐ€์žฅ ํฌ๊ฒŒ ๊ฐˆ๋ฆฐ ๊ณณ์ด๊ณ , ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์— ์ง์ ‘ ์˜ํ–ฅ์„ ์ค๋‹ˆ๋‹ค.

 

๋Œ“๊ธ€