728x90

프로그래밍에서 함수나 메서드를 호출할 때 인자를 전달하는 방식에는 주로 Call by Value(값에 의한 호출)와 Call by Reference(참조에 의한 호출) 두 가지 방법이 있다. 이 두 전달 방식은 함수를 호출할 때 인자가 어떻게 함수에 전달되는지, 그리고 함수 내에서 인자의 값을 변경했을 때 그 변경이 호출자에게 반영되는지 여부에 대한 차이를 나타낸다.

 

 

call by value는 함수에 인자를 전달할 때, 인자의 실제 값을 복사하여 함수에 전달하는 방식이다. 함수 내에서 인자의 값을 변경해도, 원본 인자에는 영향을 미치지 않는다. 왜냐하면 함수에는 원본 인자의 복사본이 전달되기 때문이다. 주로 기본 자료형(정수, 실수, 문자 등)을 인자로 사용할 때 보이는 특성이다.

 

void addOne(int x) {
    x = x + 1;
}

int main() {
    int num = 10;
    addOne(num);
    // 여기서 num의 값은 여전히 10이다.
}

 

call by reference는 함수에 인자를 전달할 때, 인자의 메모리 주소를 전달하는 방식이다. 함수 내에서 인자의 값을 변경하면, 그 변경이 원본 인자에도 반영된다. 함수에는 원본 인자를 가리키는 주소가 전달되기 때문이다. 주로 복잡한 자료형(객체, 배열 등)을 인자로 사용할 때 보이는 특성이다.

void addOne(int& x) {
    x = x + 1;
}

int main() {
    int num = 10;
    addOne(num);
    // 여기서 num의 값은 11이 된다.
}
public void updateArray(int[] arr) {
    arr[0] = 100;
}

public static void main(String[] args) {
    int[] myArray = {1, 2, 3};
    new Test().updateArray(myArray);
    // 여기서 myArray[0]은 100이 된다.
}

 

Python에서 가비지 컬렉션은 메모리 관리의 한 형태로, 프로그램에서 더 이상 사용되지 않는 메모리를 자동으로 회수하는 프로세스를 말한다.

 

Python의 가비지 컬렉터는 주로 참조 카운팅(reference counting) 방식을 사용하여, 어떤 객체에 대한 참조가 더 이상 존재하지 않을 때 해당 객체를 메모리에서 해제한다. 추가적으로, 순환 참조(circular references)를 탐지하고 제거하기 위해 세대별(generational) 가비지 컬렉션을 사용한다.

 

Java에서 가비지 컬렉션은 JVM이 자동으로 메모리 관리를 수행하는 과정이다. 이 과정은 사용되지 않는 객체를 식별하고, 메모리에서 제거하여 애플리케이션의 효율성을 극대화한다. 가비지 컬렉션의 핵심 알고리즘에는 마킹 및 스위핑, 복사, 마킹-콤팩트, 그리고 세대별 수집이 포함된다.

 

메타 데이터는 데이터에 대한 데이터라는 의미를 가진다. Java에서는 클래스, 메서드, 변수 등과 같은 프로그램 요소에 대한 정보를 의미한다. 예를 들어, 클래스 파일(.class)에는 클래스 이름, 메서드 시그니처, 변수 타입 등 해당 클래스에 관한 정보가 메타 데이터로 포함된다.

 

메타 스페이스는  Java 8 이전에는 클래스 로더가 로드한 클래스 메타 데이터가 퍼머넌트 제너레이션(Permanent Generation, PermGen) 영역에 저장되었다. Java 8에서는 PermGen이 제거되고, 메타 스페이스라는 새로운 메모리 영역이 도입되었다. 메타 스페이스는 네이티브 메모리(non-heap memory)를 사용하여 클래스 메타 데이터를 저장한다.

 

PermGen 영역은 고정된 크기를 가지고 있었고, 이로 인해 많은 클래스를 로드하는 애플리케이션에서는 java.lang.OutOfMemoryError: PermGen space 오류가 발생할 수 있었다. 메타 스페이스는 필요에 따라 동적으로 확장될 수 있어 이러한 문제를 해결한다.

 

메타 스페이스는 JVM 외부의 네이티브 메모리를 사용하기 때문에, JVM의 힙 메모리 영역과 독립적으로 관리된다. 따라서 메타 데이터의 크기가 JVM의 최대 힙 크기에 영향을 미치지 않으며, 더 유연한 메모리 관리가 가능해진다.

 

메타 스페이스의 크기는 JVM 시작 시 -XX:MetaspaceSize-XX:MaxMetaspaceSize 옵션을 통해 초기 크기와 최대 크기를 설정할 수 있다. 이를 통해 애플리케이션의 요구 사항에 맞게 메타 스페이스의 메모리 사용을 조절할 수 있다.

728x90

+ Recent posts