2010-06-25 2 views

답변

15

아니요 - 정적 메서드로 변경하면 메모리에 아무런 영향을 미치지 않습니다.

형식이 처음 참조 될 때 (정적인지 비 정적인지) 정적 멤버가 초기화되고 정적 생성자가 실행됩니다.

그러나 비 정적에서 정적으로 메서드를 전환하는 것을 고려하고 있다면 가비지 수집 또는 총 메모리 풋 프린트에 영향을주지 않습니다.

클래스 멤버를 정적 멤버로 변경하면 메모리 사용량이 변경 될뿐입니다. 이 경우 정적 필드는 유형에 액세스하면 뿌리를 유지하고 GC가 수집하지 않습니다. 이는 일반적으로 필요할 때만, 그리고 의도적으로 만 수행됩니다. 멤버를 정적으로 유지하려는 경우 정적으로 만듭니다.

+0

메모리의 아무 곳에 나 저장되는 정적 메서드 복사본이 있습니까? 내 가정은 정적 메서드를 참조하면 어딘가에 저장되고 이후의 각 참조는 해당 메서드의 인스턴스를 사용하지만이 가정은 잘못되었을 수 있음을 이해합니다. –

+3

"메소드"는 정적 또는 인스턴스 메소드에 관계없이 프로세스 공간으로 가져 와서 JIT에서 컴파일 할 때 메모리에 한 번로드됩니다. 정적 및 비 정적 간의 메소드 사용에는 실제 차이점이 없습니다. 정적 메서드가 특정 경우에 적합한 지 여부에 중점을두고 메서드를 정적 메서드인지 인스턴스 메서드인지 결정하는 데 사용합니다. –

+0

"this"포인터를 사용하지 않는 메서드에 "this"포인터를 전달하기 위해 여분의 코드가 생성되므로 메모리에 아주 작은 영향이 있습니다. – Qwertie

7

JIT 컴파일러의 관점에서 정적 메서드와 인스턴스 메서드 사이에는 차이가 없습니다. 그들에 대한 기계어 코드는 매우 유사하며 같은 종류의 힙에 저장됩니다. 유일한 차이점은 인스턴스 메서드에 추가 인수가 있다는 것입니다.

메서드가 호출 될 때 추가 인수가 전달되어야합니다. 그러면 추가 기계 코드 명령어가 필요할 수 있지만 자주 그런 것은 아닙니다. CPU 레지스터 (ECX)는 이미 올바른 값을 가지고 있습니다. 인스턴스 메소드에 x86에서 하나 이상의 인수가 있거나 x64에서 세 개보다 많은 인수가있는 경우에는 차이가 있습니다. 추가 인수는 CPU 레지스터가 아니라 스택에 전달되어야합니다. 한가지 추가 지시.

최악의 경우, 당신은 1 나노초보다 조금 씩보고 있습니다. 마이크로 최적화의 일반적인 문제점 인 측정하기가 어려울 것입니다.

+0

이것은 원래 질문의 범위를 벗어나지 만, 정적이거나 그렇지 않은 메서드가 호출 될 때 힙에 저장되는 것은 무엇입니까? 메소드 자체 또는 메소드를 포함하고있는 클래스의 인스턴스인가 아니면 다른 것인가? 가비지 수집으로이 메모리가 수집 되었습니까? –

+0

메서드 호출 중에 아무 것도 힙에 저장되지 않습니다. 인수는 CPU 레지스터와 스택을 통해 전달됩니다. 아무것도 수집 할 필요가 없습니다. Petzold의 책 "Code"가 당신에게 흥미로울 수 있습니다. –

+0

많은 의미가 있습니다. 그래서 정말로 정적이 아닌 정적에서 내 메서드를 변환하는 유일한 이유는 클래스 인스턴스화없이 액세스하는 것입니다? 귀하의 추천에 감사드립니다. –

관련 문제