2011-02-03 5 views
1

구문을 변경하지 않고 스택 개체를 사용할 수없는 이유를 알지 못합니다. 범위를 벗어나지 않는 객체에 대한 참조를 작성하는 경우 객체에 GC 플래그를 지정하고 객체를 파괴하지 마십시오. 이것이 사실이 아니라면, 그것을 완벽하게 파괴하는 것이 합리적입니다.왜 Java에는 결정 론적 소멸자가 없습니까?

개체 자체에 참조가 있는지 여부에 따라 클래스 자체가 다르게 동작하기 때문입니까? 해결할 수있는 것 같습니다. 객체에 소멸자가 있으면 외부 참조가 있으면 인스턴스가 범위를 벗어나는 런타임 오류입니다.

제발 이해 좀 도와주세요.

+0

메타를 참조하십시오 결정적 파괴 나 당신이 지금 ... :) –

+1

소년 사용할 수있다. Java는 RAII 문제를 해결하는 방법입니다. :-) –

+0

을 잘못된 언어를 집어 RAII 패턴 –

답변

1

그래서 내가 알 수있는 한 대답은 스택 개체를 구현하는 것이 이러한 방식으로 가능하지만 참조 카운팅 가비지 수집기가 필요하다는 것입니다. 자바 (그리고 아마도 .NET)이 경로를 피할 이유는

당신은 자연적으로 적게 을 실행할 수있는 "진짜"GC와 refcount로 증대 할 수의 일부 (보통 작은) 부분 때문에 생성 된 쓰레기는 에 있습니다. 또 다른 요인은 속도 - 영리한 최적화 된 GC는

(때문에 잠금에 refcount를 훨씬 더 costy을 감소시키는/증가 만든다) 스레드 의 존재 특히 에, refcount로보다 훨씬 더 을 수행 할 수 있습니다

this answer to why-dont-most-jvm-gcs-use-refcounts

0

왜 구문을 변경하지 않고 스택 개체를 사용할 수 없습니까? 범위를 벗어나지 않는 개체에 대한 참조를 만드는 사람이 있다면 개체에 GC 플래그를 지정하고 개체를 삭제하지 마십시오. 객체를 제외하고

당신이 당신의 바로 다음 메서드 호출에 필요할 공간을 차지, 스택에 입니다. GC는 모든 개체 삭제 실행되지 않기 때문에

+0

왜이 문제를 이해하지 못합니까? JVM은 여전히 ​​힙에있는 객체와 스택에 포인터를 구현할 수 있습니다. 포인터가 범위를 벗어나서 객체에 소멸자가있는 경우 객체의 refcount를 확인하여 런타임 오류가 아닌지 확인하십시오 –

+0

@Dustin : refcount가 없다는 것을 제외하고는. –

0

간단한 대답은 - 그것은 주기적으로 실행 - 그리고 노력이 이유는 JDK 7

http://blogs.oracle.com/darcy/entry/project_coin_try_out_try

C로 시도 -과 - 자원을 추가 뒤에 이제 ++ RAII에 대해이 문제를 해결하기 위해 GC 프레임 워크에서도 스택 생성 객체에 대한 별도의 개념을 사용합니다.

+0

내가 제안한 접근 방식이 객체 삭제시 실행될 GCC를 필요로한다고 생각하지 않는다. –

+0

"누군가가 범위를 벗어나지 않는 객체에 대한 참조를 만드는 경우?" 이것으로 인수로 전달되지 않은 객체를 의미합니까? 당신은 그때 강력한 논쟁을합니다 ... –

+0

아무도 자신의 참조를 저장하지 않는 한, 너무 지나칠 수 있습니다. (더 나은 용어는 전달 된 참조의 복사본을 저장합니까?) –

1

일반적인 JVM 구현에서는 참조 카운팅을 사용하지 않습니다. 따라서 참조 카운팅에 의존하는 모든 구성표는 일반적인 JVM에서 실패합니다. JVM에 참조 카운팅을 추가하는 것은 적합하지만 구현은 훨씬 느릴 수 있습니다.

귀하의 게시물에 어떤 접근 방식을 제안했는지 확실하지 않습니다. 어떻게하면 객체에 대한 참조가 있는지를 감지하기를 원한다면, 대부분의 경우 사소한 객체 사용조차도 탐지를 깨뜨릴 수 있습니다.

{ 
A a = new A(); 
a.m(); 
} 

이 두 가지 문제가 문제가 있습니다 이미 (계산 스택에) 객체에 대한 참조를 만드는 로컬 변수 읽기

  • 합니다. "참조 만들기"가 이미 "스택 개체로 적합하지 않음"으로 간주되는 경우 스택 개체의 접근 방식은 비실용적입니다.
  • 개체가 호출되어 개체가 this을 참조 할 수 있습니다. 내부, 발신자에게 보이지 않습니다. 따라서 스택 객체를 포함하는 로컬 변수에 대한 액세스를 허용하는 정책이 있어도 실제로 스택 객체에 대한 메소드 호출을 허용 할 수 없습니다. 그것은 finalize()에 대한 호출을 포함하기 때문에 스택 객체를 갖는 것은 상당히 무의미합니다.
+0

첫 번째 글 머리 저는 참조 카운트가 주어진다면 장벽이라고 생각하지 않습니다. 두 번째 총알은 완전히 이해하지 못합니다. –

+0

객체가 finalize 된 객체 인 경우 생성자 을 실행하기 전에 VM에 대기열에 추가됩니다. 즉 기술적으로 참조 할 수 있습니다 (D) – bestsss

+0

@Dustin Getz : 참조 카운팅이 있으면 문제가되지 않지만 isn 자바에서는 그런 것이 없습니다. –

0

나는이 요구 사항이 문제가 될 것이라고 생각 : 객체 소멸자가있는 경우 외부 참조가있는 경우

는, 인스턴스에 대한 런타임 오류가 범위를 벗어나 이동합니다.

왜냐하면 소멸자가있는 유형의 로컬 변수를 선언 한 모든 메소드에서 GC 사이클을 수행해야하기 때문입니다.

에펠의 expanded variables과 비슷한 점이있을 수 있습니다. 확장 변수의 참조 변수 (메서드 매개 변수 포함)에 할당하는 것은 잘못되었으므로이 문제가 발생할 수 없습니다.

관련 문제