2009-11-11 5 views
1

는 사람, 나는 몇 가지 질문을 검토하고있어하지만 난 정말 알아낼 수 없습니다 이봐, 난 텍스트 책을 통해 보았다하지만 난 답을 찾을 수있는 곳 난 ... 잘 모르겠어요자바와 메모리 레이아웃

메모리 다이어그램을 사용하여 사진을 찍는 것은 상당히 어려울 지 모르지만 제발 참아주십시오.

interface Lovable 
    public void love(); 

class Foo implements Lovable 
    public void love(); 
     // something 
    public int val() 
     // return something1 

public class Love 
    public static void main(String args []) 
     Foo foo = new Foo() 
     foo.love() 
     foo.love() 
     int bar = =foo.val() 
     System.out.print(v) 

는 지금, 나는 foo는이 new로 선언 된 것을 볼, 그래서 나는 실제 푸 클래스 정보가 힙에 저장 알고 프레임? 포인터가있다? 스택의 맨 위에있는 힙의 메모리 공간을 가리킨다 (foo가 어떤 메소드를 호출하기 전에). 그러면 인터페이스는 어떻습니까? 그것은 힙에도 저장 될 것인가?

그래서 스택 맨 아래에 클래스 Love (int bar 포함), 힙의 Foo foo를 가리키는 포인터, foo.love()의 프레임, 다른 프레임 foo.love(), foo.val()에 대한 테두리, 인쇄용 테두리

아이디어를 얻고 있습니까? 또는 나는 정말로 정말로 멀었 느냐? 더 많은 정보를 얻을 수있는 곳을 알고 있다면 알려주십시오. 모든 입력을 주셔서 감사합니다.

답변

4

일반적으로 개체는 가비지 수집기에서 관리하는 heap에 저장됩니다.

탈출하지 않으면 스택에 개체를 저장하기 위해 latest release of Java 6에만 이스케이프 분석이 있습니다.

클래스 정보는 perm space에 저장됩니다.

0

foo 참조가 스택에 있습니다. foo이 가리키는 객체은 힙에 있습니다 (단순한 경우 실제로 스택에 최적화 될 수 있지만 실제로는 힙에 있습니다).

개체의 클래스는 수퍼 클래스를 가질 수 있으며 인터페이스를 구현할 수 있습니다. 그러나 필드가 선언 된 클래스 중 인스턴스 필드는 모두 힙의 동일한 메모리 할당에 보관됩니다.

+0

정말 멋진 사진입니다! –

+0

그건 아주 이상합니다. – Skilldrick

+0

오, 그렇습니다 3 개의 팔이 있습니다. –

1

메모리 레이아웃은 JVM에 따라 다르며 JVM에는 프로그래머가 생각하는 Java 객체 모델의 논리적 뷰를 유지하는 한 메모리 사용 방법에 대한 많은 여지가 있습니다. Sun JVM에는 세대 별 가비지 수집을 구현하기 때문에 여러 "힙"이 있습니다. 객체는 매우 빠르게 객체를 생성 할 수 있도록 스택으로 취급되는 eden 공간에서 생성됩니다. 수명이 오래 지속되면 객체는 오래 살아있는 세대로 이동하게되며, 동적으로 할당 된 일반적인 힙처럼 구현됩니다. JVM은 클래스와 interned 문자열을 "permspace"힙에 저장합니다. Permspace는 실제로 영구적이지 않습니다. 인스턴스 또는 클래스 로더에 대한 참조가 더 이상 없으면 클래스가 수집됩니다. 그리고 위에서 지적한대로 Java 6은 객체에 대한 참조가 블록을 떠나지 않는다고 판단 할 수있는 경우 호출 스택에 객체를 할당합니다.

관련 문제