2010-07-22 3 views
1

Google App Engine에서 애플리케이션이 너무 오랫동안 유휴 상태가되거나 새 애플리케이션 인스턴스가 생성 된 경우 싱글 톤 클래스가 죽을 가능성이 있으며이를 직접 경험했습니다.Google App Engine의 싱글 톤이 만료 될 수 있습니까? 아니면 정적 변수가 만료 될 수있는 많은 수가 있습니까?

그러나 실제로는 모든 클래스의 모든 정적 변수가 응용 프로그램에서 만료 될 수 있음을 의미합니까? GAE가이 클래스가 싱글 톤임을 어떻게 식별 할 수 있습니까?

답변

5

App Engine은 길이가 시간 동안 유휴 상태 인 응용 프로그램을 정의되지 않은 시간 동안 언로드 할 수 있습니다. 다시 말해 응용 프로그램은 기본적으로 종료됩니다.

또한 GAE는 트래픽이 충분히 높으면 많은 서버에서 많은 프로세스에서 응용 프로그램을 실행할 수 있습니다.

정적 멤버 나 심지어 싱글 톤에 의존하는 것은 이러한 환경에서 나쁜 생각 일 것입니다. GAE를 사용하면 다른 시스템에서 응용 프로그램을 시작/중지 /로드 할 때 제어 할 수 없습니다.

GAE의 자바 자주 묻는 질문에이 두 질문에 부분적으로이 문제를 해결 :

편집 : 나는 "오랜 기간이"실제로 정의되지 않은 것을 말해야한다 , 나는 구글이 그것을 출판한다고 생각하지 않는다. App Engine이 일정하지 않은 일정 기간 동안 유휴 상태 인 응용 프로그램을 언로드한다고 말하는 것이 더 정확할 것입니다.

+0

링크가 모호하다. –

3

만약 내가 틀렸다면 누군가 저를 바로 잡으십시오. 그러나 당신의 앱이 n 개의 프로세스에서 실행될 수 있기 때문에 당신은 전혀 싱글 톤을 가질 수 없다고 생각합니다.

+0

사실입니다. 앱을 동일한 프로세스 내에서 여러 클래스 로더에로드 할 수도 있습니다. 그러나 전형적인 경우는 응용 프로그램의 인스턴스가 하나 뿐이며 모든 단일 개체의 인스턴스가 하나뿐입니다. (귀하의 게시물은 실제로 답변이 아니며 제쳐두고 더 많은 질문에 대한 답으로 게시되었을 것입니다.) – mdma

+0

@mdma : 질문에 답할 때 제쳐두고는 아닙니다. 싱글 톤이 아닌지 확실하지 않으면 싱글 톤은 불가능합니다. 그리고 비록 그것이 코멘트가되어야한다고해도 : 나는 다른 사용자들의 게시물을 논평 할 수 없다; D – hackbert

2

싱글 톤이 클래스의 정적 메서드 또는 정적 참조 (다른 방법이 있습니까?)로 구현되었다고 가정하면 싱글 톤 클래스를로드 한 클래스 로더를 언로드하여 해당 싱글 톤을 가비지 수집 할 수 있습니다. 다른 클래스 로더에있는 클래스의 참조 (예 : 일반적인 문제는 ThreadLocal 인스턴스가 참조에 매달려있는 경우)

저는 GAE를 사용하지 않았지만 내 생각에 이것이 무슨 일이 일어나고 있는지, 클래스 로더가 언로드되고 있는지입니다. GAE는 이것이 싱글 톤이라는 것을 모릅니다. 단순히 클래스 로더에 대한 참조를 해제합니다. 컨테이너에있는 응용 프로그램의 경우 응용 프로그램을 메모리에 유지하는 유일한 참조 일 수 있습니다 (운이 좋다면 이상적입니다). 이것이 도달 할 수 없게되면, 전체 앱은 도달 할 수 없게되고 가비지 컬렉터에 의해 수집됩니다. 물론 실행중인 모든 스레드는 app 인스턴스에 대한 참조를 가질 수 있으므로 간섭을 일으킬 수 있습니다. 그러나 컨테이너가 응용 프로그램 스레드를 제어 할 수 있다고 가정하고 응용 프로그램을 실행하는 요청 (예 : 스레드)이 없을 때만 클래스 로더를 해제합니다. 암호.

관련 문제