2017-01-26 4 views
-3

University에서 Operating Systems 과정을 수강하고 메모리 관리에 대해 더 깊이 배웁니다. 내 교과서에서 답을 얻지 못하는 것 같습니다. 객체를 선언하면 정확히 무엇이 발생합니까? 예를 들면 다음과 같습니다.개체를 선언 할 때 힙에서 정확히 무엇이 발생합니까?

String one; 
String two; 

정확히 힙에 할당 된 메모리는 얼마입니까? 또는 컴파일러가 그 객체의 크기를 알지 못하기 때문에 아직 할당되지 않았습니까? 두 개의 오브젝트가 힙에서 서로 가깝게 선언되고 인스턴스화되면 첫 번째 오브젝트가 너무 커서 두 번째 오브젝트의 메모리 공간과 겹치게됩니다.

다른 언어로 다르게 처리 될 수 있으므로 바람직하게는 Java의 관점에서 설명하고 싶습니다. 감사!

+0

개체를 선언하지 마십시오. _variables_를 선언합니다. –

+0

고마워, 내가 잘못 생각한 것 같아. –

답변

1

선언으로 인해 힙에 아무것도 할당되지 않습니다. 두 문자열은 초기화하지 않으면 null입니다. 메서드가 실행되는 스택 프레임에는 스택에 두 개의 문자열 "포인터"가 할당됩니다.

다른 질문에 대해서는 객체 (문자열 포함)가 힙에서 서로 겹칠 수 없습니다. 모든 메모리는 Java로 관리되므로이를 보장 할 수 있습니다. 한 객체가 다른 객체와 관련하여 저장되는 곳은 보장되지 않으며 가비지 수집기가 힙을 재구성하므로 실제로 프로그램 수명 기간 동안 변경 될 수 있습니다.

+0

큰 반응, 고마워요! C++에서 겹쳐진 부분이 힙에서 발생하지 않도록 가비지 수집과 같은 종류가 있다고 말합니까? –

+0

힙 관리는 가비지 수집 이상입니다 ... 두 개의 객체를 C++로 할당하면 메모리가 분리됩니다. 하지만 C++에는 gc가 없습니다 (또는 내가 오래 전에 사용했던 C++의 마지막 맛은 적어도 없습니다). –

+0

* "초기화하지 않으면 두 문자열 모두 null입니다."* 로컬 변수가 아닌 경우. 그렇다면 그들은 아무런 가치가 없을 것입니다. 그리고 스택 프레임을 언급하고 있기 때문에 지역 변수라고 가정하고 있습니다. – Andreas