μΆμ²
Gemini
ChatGPT
μλ° λ©λͺ¨λ¦¬ ꡬ쑰
μλ° νλ‘κ·Έλ¨μ΄ μ€νλ λ, JVM(Java Virtual Machine)μ μ΄μ체μ λ‘λΆν° λ©λͺ¨λ¦¬λ₯Ό ν λΉλ°μ μ΄λ₯Ό μ¬λ¬ μμμΌλ‘ λλμ΄ κ΄λ¦¬νλ€. κ° μμμ κ³ μ ν λͺ©μ μΌλ‘ κ°μ§λ©° νλ‘κ·Έλ¨ μ€νμ νμν λ°μ΄ν°λ₯Ό μ μ₯νλμν μ νλ€.
μλ° λ©λͺ¨λ¦¬ λͺ¨λΈμ JVM ꡬνμ λ°λΌ λ€μ μ°¨μ΄κ° μμ μ μλ€.
μλ°μ λ©λͺ¨λ¦¬ ꡬ쑰λ κ°μ²΄ μ§ν₯ νλ‘κ·Έλλ°(OOP) κ°λ μ ν¨μ¨μ μΌλ‘ μ§μνλλ‘ μ€κ³λμλ€. μλ°λ κ°μ²΄ μ§ν₯ μΈμ΄λ‘μ κ°μ²΄μ ν΄λμ€μ κ°λ μ μ€μ¬μΌλ‘ νλ‘κ·Έλ¨μ ꡬμ±νλ©°, μ΄μ κ°μ ꡬ쑰λ₯Ό ν¨κ³Όμ μΌλ‘ μ§μνκΈ° μν΄ λ©λͺ¨λ¦¬ κ΄λ¦¬λ₯Ό μ€κ³νλ€.
μ£Όμ λ©λͺ¨λ¦¬ μμ
1. Method Area λ©λͺ¨λ¦¬ μμ
ν΄λμ€μ κ΄λ ¨λ λ©νλ°μ΄ν°λ₯Ό μ μ₯νλ€. ν΄λμ€ μ 보, λ©μλ, μ μ λ³μ(static variables), μμ ν(Constant Pooll)λ±μ μ μ₯νλ μμ.
JVMμ΄ μμλ λ μμ±λλ©°, νλ‘κ·Έλ¨μ΄ μ’ λ£λ λκΉμ§ μ μ§λλ€.
static λ³μ, μμ, μΈν°νμ΄μ€ λ±μ΄ μ΄ μμμ μ μ₯λλ€.
λͺ¨λ μ€λ λκ° κ³΅μ νλ 곡κ°μ΄λ€.
- PermGen μμ : Java 8 μ΄μ λ²μ μμλ Perm μμμ΄ λ©μλ μμμ κ΄λ¦¬νμ§λ§, Java 8λΆν°λ Metaspaceλ‘ λ³κ²½λμλ€. Metaspaceλ Native λ©λͺ¨λ¦¬λ₯΄ μ¬μ©ν΄ λ μ μ°ν λ©λͺ¨λ¦¬ κ΄λ¦¬λ₯Ό μ 곡νλ€.
κ°μ²΄ μ§ν₯ κ°λ κ³Όμ μ°κ΄μ±
- ν΄λμ€ λ‘λ©: ν΄λμ€ λ‘λ(Class Loader)μ μν΄ ν΄λμ€κ° λ‘λλκ³ , κ·Έ λ©νλ°μ΄ν°κ° λ©μλ μμμ μ μ₯λλ€.
- μ μ λ©€λ² : μ μ λ©μλμ λ³μλ λ©μλ μμμ μ μ₯λμ΄ ν΄λμ€ μμ€μμ 곡μ λλ€.
μ₯μ
- ν΄λμ€μ λ©μλμ λ©νλ°μ΄ν°λ₯Ό μ€μμμ κ΄λ¦¬νμ¬ ν¨μ¨μ μΌλ‘ μ κ·Όν μ μλ€.
- μ μ λ³μμ λ©μλλ₯Ό 곡μ ν΄ νλ‘κ·Έλ¨μ μΌκ΄μ±μ μ μ§νλ€.
λ¨μ
- λ©μλ μμμ ν¬κΈ°κ° μ νμ μ΄λ©°, λ§μ ν΄λμ€κ° λ‘λλλ©΄ λ©λͺ¨λ¦¬ λΆμ‘± λ¬Έμ λ₯Ό μΌμΌν¬ μ μλ€.
μ
public class Example {
// λ©μλ μμμ μ μ₯λλ μ μ λ³μ
static int staticVariable = 10;
public static void staticMethod() {
// λ©μλ μμμ μ μ₯λλ μ μ λ©μλ
}
}
2. Heap ν μμ
κ°μ²΄ μΈμ€ν΄μ€κ° μμ±λλ 곡κ°μ΄λ€.
new μ°μ°μλ₯Ό ν΅ν΄ μμ±λ κ°μ²΄λ€(λ°°μ΄ ν¬ν¨)μ λͺ¨λ ν μμμ ν λΉλλ€.
Garbage Collector(GC)μ μν΄ κ΄λ¦¬λλ©°, λ μ΄μ μ°Έμ‘°λμ§ μλ κ°μ²΄λ μλμΌλ‘ νμλλ€.
ν μμμ νλ‘κ·Έλ¨ μ€ν μ€μ λμ μΌλ‘ λ³κ²½λ μ μλ€.
ꡬ쑰μ μΌλ‘ ν° λ©λͺ¨λ¦¬ 곡κ°μ κ°μ§λ€.
κ°μ²΄ μ§ν₯ κ°λ κ³Όμ μ°κ΄μ±
- κ°μ²΄μ ν΄λμ€: κ°μ²΄ μ§ν₯ νλ‘κ·Έλλ°μμ λͺ¨λ λ°μ΄ν°λ κ°μ²΄ ννλ‘ ννλλ©°, κ°μ²΄λ ν λ©λͺ¨λ¦¬μ μ μ₯λλ€.
- μΈμ€ν΄μ€ : ν΄λμ€μ μΈμ€ν΄μ€λ ν λ©λͺ¨λ¦¬μ μ μ₯λκ³ , μ¬λ¬ μΈμ€ν΄μ€κ° μλ‘ λ 립μ μΌλ‘ μ‘΄μ¬ν μ μλ€.
νΉμ§
1. λ©λͺ¨λ¦¬ ν λΉ λ° ν΄μ
- λμ ν λΉ : κ°μ²΄κ° μμ±λλ©΄ νμ λ©λͺ¨λ¦¬κ° ν λΉλλ€.
- κ°λΉμ§ 컬λμ (Garbage Collection) : μ¬μ©λμ§ μλ κ°μ²΄λ μλμΌλ‘λ©λͺ¨λ¦¬κ° ν΄μ λλ€. μ΄λ Javaμ μ€μν λ©λͺ¨λ¦¬ κ΄λ¦¬ κΈ°λ₯ μ€ νλλ‘, κ°λ°μκ° μ§μ λ©λͺ¨λ¦¬ ν΄μ λ₯Ό κ΄λ¦¬ν νμλ μλ€.
2. λ°μ΄ν° μ μ₯
- κ°μ²΄μ λ°°μ΄ : λͺ¨λ κ°μ²΄μ λ°°μ΄μ νμ μ μ₯λλ€. κ°μ²΄κ° ν¬ν¨νλ λ€λ₯Έ κ°μ²΄λ€(μ€μ²© κ°μ²΄)λ λͺ¨λ νμ μ μ₯λλ€.
3. λ²μ
- μ μ λ²μ : νμ μ μ₯λ λ°μ΄ν°λ μ ν리κ²μ΄μ μ μ 체 μλͺ λμ μ ν¨νλ€. μ¦, μ μμ μΌλ‘ μ κ·Όμ΄ κ°λ₯νλ€.
4. Thread-Safe μλ
- νμ μ¬λ¬ μ€λ λ κ°μ 곡μ λλ―λ‘, μ μ ν λκΈ°ν μμ΄ μ€λλμ μμ νμ§ μλ€. λ°λΌμ λμμ± λ¬Έμ λ₯Ό νΌνκΈ° μν΄ κ°λ°μκ° μ§μ μ€λ λ λκΈ°ν μ²λ¦¬λ₯Ό ν΄μΌ νλ€.
μ
public class HeapExample {
public static void main(String[] args) {
Person person = new Person("Alice", 30); // νμ μ μ₯λλ κ°μ²΄
person.displayInfo();
}
}
class Person {
String name; // μ°Έμ‘° λ³μ
int age; // κΈ°λ³Έ λ°μ΄ν° νμ
Person(String name, int age) {
this.name = name;
this.age = age;
}
void displayInfo() {
System.out.println("Name: " + name + ", Age: " + age);
}
}
- 'Person' κ°μ²΄λ ν λ©λͺ¨λ¦¬μ μ μ₯λλ€.
- κ°μ²΄μ λ©€λ²λ³μ 'name'κ³Ό 'age' μμ νμ μ μ₯λλ€.
νμ νκ³
- λ©λͺ¨λ¦¬ μ¬μ©λ μ¦κ° : λ§μ κ°μ²΄λ₯Ό μμ±νλ©° ν λ©λͺ¨λ¦¬ μ¬μ©λμ΄ μ¦κ°νλ€. λ©λͺ¨λ¦¬ λμ(memory leak)κ° λ°μνμ§ μλλ‘ μ£Όμν΄μΌ νλ€.
- κ°λΉμ§ 컬λ μ μ€λ²ν€λ : κ°λΉμ§ 컬λ μ μ΄ μ€νλλ©΄ μ ν리μΌμ΄μ μ μ±λ₯μ μν₯μ λ―ΈμΉ μ μλ€. νΉν ν λ©λͺ¨λ¦¬κ° ν¬κ±°λ κ°λΉμ§ 컬λ μ μ΄ λΉλ²ν μΌμ΄λλ κ²½μ° μ΄λ¬ν λ¬Έμ κ° λ°μν μ μλ€.
3. Stack μ€ν μμ
λ©μλ νΈμΆ μλ§λ€ μ€ν νλ μ(stack frames)μ΄ μμ±λλ μμμ΄λ€.
μ€ν νλ μμλ μ§μ λ³μ, 맀κ°λ³μ, λ°ν μ£Όμ λ±μ΄ μ μ₯λλ€.
λ©μλκ° μ’ λ£λλ©΄ μ€ν νλ μμ΄ ν΄μ λλ€.
μ€ν μμμ LIFO(Last In First Out) λ°©μμΌλ‘ κ΄λ¦¬λλ€.
κ° μ€λ λλ μμ μ μ€ν λ©λͺ¨λ¦¬λ₯Ό κ°μ§κ³ μλ€.
κ°μ²΄ μ§ν₯ κ°λ κ³Όμ μ°κ΄μ±
- λ©μλ νΈμΆκ³Ό μ€ν: κ°μ²΄μ λ©μλλ₯Ό νΈμΆν λ μ€ν λ©λͺ¨λ¦¬λ₯Ό μ¬μ©ν΄ μ€ν νκ²½μ ꡬμ±νλ€.
- μ§μ λ³μ : λ©μλμ μ§μ λ³μλ μ€ν λ©λͺ¨λ¦¬μ μ μ₯λλ©°, λ©μλ μ’ λ£ μ μλμΌλ‘ ν΄μ λλ€.
νΉμ§
1. λ©λͺ¨λ¦¬ ν λΉ λ° ν΄μ
- μλ κ΄λ¦¬ : λ©μλκ° νΈμΆλλ©΄ λ©λͺ¨λ¦¬κ° μλμΌλ‘ ν λΉλκ³ , λ©μλ μ€νμ΄ λλλ©΄ λ©λͺ¨λ¦¬κ° μλμΌλ‘ ν΄μ λλ€.
- λΉ λ₯Έ μ κ·Ό : μ€νμ LIFO ꡬ쑰μ΄λ―λ‘ κ°μ₯ λ§μ§λ§μ μΆκ°λ λ°μ΄ν°μ λν μ κ·Όμ΄ λΉ λ₯΄λ€
2. λ°μ΄ν° μ μ₯
- ν리미ν°λΈ νμ : int, double, boolean λ±μ κΈ°λ³Έ λ°μ΄ν° νμ μ μ€νμ μ§μ μ μλλ€.
- μ°Έμ‘° λ³μ : κ°μ²΄μ μ°Έμ‘°κ° μ€νμ μ μ₯λλ©°, μ€μ κ°μ²΄ λ°μ΄ν°λ νμ μ μ₯λλ€.
3. λ²μ
- λΈλ‘ λ 벨 : λ³μμ μ ν¨ λ²μλ μ½λ λΈλ‘ λ΄μμλ§ μ ν¨νλ€. λΈλ‘μ λ²μ΄λλ©΄ μλμΌλ‘ λ©λͺ¨λ¦¬κ° ν΄μ λλ€.
4. Thread-Safe
- κ° μ€λ λλ μ¬μ§μ μ€νμ κ°μ§κ³ μμΌλ―λ‘, λ€λ₯Έ μ€λ λμ 곡μ λμ§ μμ κΈ°λ³Έμ μΌλ‘ μ€λ λ μμ νλ€
μμ
public class StackExample {
public static void main(String[] args) {
int number = 10; // μ€νμ μ μ₯λλ κΈ°λ³Έ λ°μ΄ν° νμ
String text = "Hello"; // μ€νμ μ μ₯λλ μ°Έμ‘° νμ
printNumber(number); // λ©μλ νΈμΆλ‘ μλ‘μ΄ μ€ν νλ μ μμ±
}
public static void printNumber(int num) {
System.out.println(num);
}
}
- 'number' λ³μλ μ€νμ μ μ₯λλ€.
- 'printNuber' λ©μλ νΈμΆ μ μλ‘μ΄ μ€ν νλ μμ΄ μμ±λμ΄ 'num' 맀κ°λ³μκ° κ·Έ μ€ν νλ μμ μ μ₯λλ€.
μ€νμ νκ³
- νμ λ ν¬κΈ° : μ€ν λ©λͺ¨λ¦¬λ νμ λ ν¬κΈ°λ₯Ό κ°μ§λ©°, λ무 κΉμ μ¬κ· νΈμΆμ΄λ λ§μ λ‘컬 λ³μλ₯Ό μ¬μ©νλ κ²½μ°, 'StackOverflowError'κ° λ°μν μ μλ€.
4. Native Method Stack λ€μ΄ν°λΈ λ©μλ μ€ν
Java μ½λμμ native ν€μλλ‘ μ μΈλ λ€μ΄ν°λΈ λ©μλλ₯Ό νΈμΆν λ μ¬μ©λλ μμμ΄λ€.
λ€μ΄ν°λΈ λ©μλλ λ€λ₯Έ μΈμ΄(C, C++)λ‘ μμ±λ λ©μλλ₯Ό νΈμΆνλ κ²½μ°μ μ¬μ©λλ€.
JNI(Java Native Interface)λ₯Ό ν΅ν΄ λ€μ΄ν°λΈ λ©μλλ₯Ό νΈμΆν λ, μ΄ μ€νμ μ¬μ©νμ¬ λ€μ΄ν°λΈ λ©μλμ νΈμΆ μ 보μ κ΄λ ¨λ λ°μ΄ν°λ₯Ό μ μ₯νλ€.
κ°μ²΄ μ§ν₯ κ°λ κ³Όμ μ°κ΄μ±
- μλ°λ μμν κ°μ²΄ μ§ν₯ μΈμ΄λ‘ μ€κ³λμμ§λ§, μμ€ν μμ€μ μμ μ΄λ μ±λ₯ ν₯μμ μν΄ λ€μ΄ν°λΈ λ©μλκ° νμν λ μ΄ μ€νμ μ¬μ©νλ€.
μ₯μ
- λ€μ΄ν°λΈ μ½λλ₯Ό ν¨μ¨μ μΌλ‘ μ€νν μ μμ΄, μ±λ₯ ν₯μ λ° μμ€ν μμμ λν μ κ·Όμ΄ κ°λ₯νλ€.
λ¨μ
- λ€μ΄ν°λΈ λ©μ€λλ JVMμ λ©λͺ¨λ¦¬ κ΄λ¦¬μ λ€λ₯΄κ² λμν μ μμΌλ©°, λ²κ·Έλ 보μ λ¬Έμ κ° λ°μν μ μλ€.
5. Program Counter Register νλ‘κ·Έλ¨ μΉ΄μ΄ν° λ μ§μ€ν°
νμ¬ μ€ν μ€μΈ JVM λͺ λ Ήμ΄μ μ£Όμλ₯Ό μ μ₯νλ λ μ§μ€ν°μ΄λ€.
κ° μ€λ λλ§λ€ λ 립μ μΌλ‘ μ‘΄μ¬νλ©°, μ€λ λκ° μ€ν μ€μΈ λͺ λ Ήμ΄λ μΆμ νλ€.
κ°μ²΄ μ§ν₯ κ°λ κ³Όμ μ°κ΄μ±
PC λ μ§μ€ν°λ κ°μ²΄ μ§ν₯μ μ§μ μ μΈ κ΅¬νκ³Ό κ΄λ ¨μ μμ§λ§, JVMμ λͺ λ Ήμ΄ μ€νμ μΆμ ν΄ κ°μ²΄ λ©μλ νΈμΆμ κ΄λ¦¬νλ€.
μ₯μ
μ€λ λ κ°μ μ€ν νλ¦μ κ΄λ¦¬ν΄ λ©ν°μ€λ λ©μ μ§μνλ€.
λ¨μ
νΉμ λͺ λ Ήμ΄ μ€ν μμ μμλ§ μ¬μ©λλ©°, λ©λͺ¨λ¦¬ μ¬μ©λμ λ§€μ° μλ€
κ° μμμ μν κ³Ό νΉμ§
μμ μ€λͺ
Method Area | ν΄λμ€ μ 보 μ μ₯, static λ³μ, μμ λ± |
Heap | κ°μ²΄ μΈμ€ν΄μ€ μ μ₯, GC κ΄λ¦¬ |
Stack | λ©μλ νΈμΆ μ μ€ν νλ μ μμ±, μ§μ λ³μ, 맀κ°λ³μ μ μ₯ |
Native Mathod Stack | λ€μ΄ν°λΈ λ©μλ νΈμΆ μ μ¬μ© |
Program Counter Register | νμ¬ μ€ν μ€μΈ λͺ λ Ήμ΄ μ£Όμ μ μ₯ |
μ€νκ³Ό νμ μ°¨μ΄μ
νΉμ§ | μ€ν Stack | ν Heap |
μ μ₯ ꡬ쑰 | LIFO ꡬ쑰 (Last-In-First-Out) | λμ ꡬ쑰(Dynamic Allocation) |
μ μ₯ λ°μ΄ν° | κΈ°λ³Έ νμ , μ°Έμ‘° λ³μ | κ°μ²΄, λ°°μ΄ |
λ©λͺ¨λ¦¬ ν λΉ | μλ(λ©μλ νΈμΆ μ) | μλ(new ν€μλλ₯Ό ν΅ν΄ κ°μ²΄ μμ± μ) |
λ©λͺ¨λ¦¬ ν΄μ | μλ(λ©μλ μ’ λ£ μ) | κ°λΉμ§ 컬λ μ μ μν΄ μλ ν΄μ |
λ²μ | λΈλ‘ λ벨 (μ§μ λ³μ) | μ μμ λ²μ(κ°μ²΄ μ μ μ κ·Ό κ°λ₯) |
μ€λ λ μμ μ± | μ€λ λ μμ (κ° μ€λ λμ κ°λ³ ν λΉ) | μ€λ λ μμ νμ§ μμ(μ¬λ¬ μ€λ λ κ° κ³΅μ λ¨) |
μ±λ₯ | λΉ λ₯Έ μ κ·Ό(κ³ μ ν¬κΈ°, μ§μμ λ°μ΄ν°) | μλμ μΌλ‘ λλ¦Ό(λμ ν λΉ, μ μμ λ°μ΄ν°) |
ν¬κΈ° | μ νμ (μ€ν μ€λ²νλ¬μ° λ°μ κ°λ₯) | μλμ μΌλ‘ νΌ(ν λ©λͺ¨λ¦¬ λΆμ‘± κ°λ₯) |
μλ° λ©λͺ¨λ¦¬ ꡬ쑰μ μνΈ μμ©
κ°μ²΄ μμ±κ³Ό λ©μλ νΈμΆ
1. κ°μ²΄ μμ±
- ν΄λμ€λ₯Ό ν΅ν΄ κ°μ²΄λ₯Ό μμ±νλ©΄, ν΄λΉ κ°μ²΄λ ν λ©λͺ¨λ¦¬μ μ μ₯λλ€.
- ν΄λμ€μ λ©νλ°μ΄ν°λ μ΄λ―Έ λ©μλ μμμ λ‘λλμ΄ μμΌλ©°, μ΄ μ 보λ₯Ό ν΅ν΄ κ°μ²΄μ μΈμ€ν΄μ€ λ³μκ° νμ ν λΉλλ€.
2. λ©μλ νΈμΆ
- λ©μλ νΈμΆ μ, μ€νμ μλ‘μ΄ νλ μμ΄ μμ±λκ³ λ©μλμ μ€νμ νμν μ§μ λ³μκ° μ μ₯λλ€.
- λ©μλκ° μ€νλλ©΄μ κ°μ²΄μ μΈμ€ν΄μ€ λ³μμ μ κ·Όν μ μμΌλ©°, νμ μ μ₯λ κ°μ²΄μ λ°μ΄ν°λ₯Ό μμ ν μ μλ€.
μ μ λ³μμ λ©μλ
- μ μ λ³μμ λ©μλλ λ©μλ μμμ μ μ₯λλ©°, ν΄λμ€ μμ€μμ κ΄λ¦¬λλ€.
- λͺ¨λ μΈμ€ν΄μ€κ° 곡μ ν μ μμΌλ©°, μΈμ€ν΄μ€κ° μμ΄λ ν΄λμ€ μ΄λ¦μ ν΅ν΄ μ κ·Όν μ μλ€.
λ€μ΄ν°λΈ λ©μλ νΈμΆ
- λ€μ΄ν°λΈ λ©μλλ μλ°μ λ€μ΄ν°λΈ λ©μλ μ€νμ μ¬μ©ν΄ μ€νλλ€.
- JNIλ₯Ό ν΅ν΄ λ€μ΄ν°λΈ μ½λλ₯Ό νΈμΆν λ, μλ° κ°μ²΄μ ν λ©λͺ¨λ¦¬μ μλ λ°μ΄ν°λ₯Ό λ€μ΄ν°λΈ λ©μλμ μ λ¬ν μ μλ€.
λ©λͺ¨λ¦¬ κ΄λ¦¬
- Garbage Collector : ν μμμμ λ μ΄μ μ¬μ©λμ§ μλ κ°μ²΄λ₯Ό μλμΌλ‘ νμνλ 맀컀λμ¦
- Stack Overflow : μ€ν μμμ΄ κ°λ μ°¨μ λ μ΄μ μλ‘μ΄ μ€ν νλ μμ μμ±ν μ μλ κ²½μ° λ°μνλ μλ¬. 무ν μ¬κ· νΈμΆμ΄λ λ무 λ§μ μ§μ λ³μ μ¬μ©μ΄ μμΈμ΄ λ μ μλ€.
- OutOfMemoryError : ν μμμ λ μ΄μ κ°μ²΄λ₯Ό ν λΉν 곡κ°μ΄ μμ λ λ°μνλ μλ¬. λ©λͺ¨λ¦¬ λμλ λ무 ν° κ°μ²΄ μμ±μ΄ μμΈμ΄ λ μ μλ€.