2009-06-29 2 views

답변

8

다릅니다. 비 액터 코드에서 액터로 메시지를 보내면 ActorProxy가 자동으로 생성되어 로컬 스레드에 저장됩니다. ThreadProvider가 GC가 될 때까지 ActorProxy가 GC되지 않기 때문에 매우 작은 메모리 임에도 불구하고 메모리 누수가 발생할 수 있습니다. ActorProxy는 본질적으로 비 액터 쓰레드가 메시지 수신을 포함하여 액터처럼 행동하는 것을 가능하게합니다.

더 큰 문제는 액터 라이브러리가 스레드를 관리하는 방식과 유사하게 스레드가 관리되는 경우입니다. 따라서 논리적 컨텍스트를 나타내는 것은 한 번에 하나의 스레드에 있고 다른 스레드는 다른 스레드에있을 수 있습니다. 좋은 예가 서블릿 컨테이너 일 것입니다. 논리적 컨텍스트는 서블릿이나 세션 일 수 있지만 ActorProxy는 스레드에 바인딩되어 논리적 컨텍스트간에 공유됩니다. 액터가 ActorProxy에 답장을 보내지 않으면 큰 문제는 아니지만 문제가있는 경우 응답이 잘못되었거나 (b) 메시지는 절대로 수신되지 않으며 앞서 언급 한 작은 누설은 ActorProxies의 메일 함이 가득 차면 큰 누설이됩니다.

[편집] 음 ... 질문을 읽는 데 문제가있는 것 같습니다! 액터 블록을 둘러싸면 새로운 액터 객체가 생성됩니다.이 액터 객체는 종료 될 때 올바르게 GC됩니다. 메시지를 액터 블록에 보내는 것은 메시지 전송이 액터를 만드는 스레드가 아니라 다른 스레드의 새로운 반응으로 수행된다는 것을 의미합니다.

+0

위대한 대답, 에릭, 고마워. "actor {}"블록 (내 질문에서와 같이)에서 호출을 래핑하는 것이 동일한 문제점을 겪고 있습니까? 또는 스레드가 존재하는지 여부에 관계없이 블록이 종료 될 때 생성 된 액터는 GC 가능합니까? –

0

그렇게하는 데는 문제가 없습니다. 그것은 당신의 코드에서 의미가 있다면, 왜 안돼? 순수 배우 모델을 보면 모든 것이 배우이고 배우 만이 서로 의사 소통을합니다. 이렇게 코드를 디자인 할 수 있다면 ... 훌륭한 ... 당신이 원할 수 없거나 원하지 않는 것은 괜찮습니다. 비 배우에서 배우에게 메시지를 보냅니다.

+0

확실하지 않습니다. 결국, 반응에서 "발신자"는 무엇입니까? –

+0

보낸 사람은 현재 보내는 스레드에 바인딩 된 암시 적으로 생성 된 ActorProxy가됩니다. –

관련 문제