2009-06-29 31 views

Trả lời

8

Điều đó tùy thuộc. Khi bạn gửi thư đến một diễn viên từ mã không phải là diễn viên, một ActorProxy được tự động tạo và lưu trữ trong một luồng cục bộ. Điều này tạo ra một rò rỉ bộ nhớ tiềm ẩn, mặc dù một bộ nhớ rất nhỏ, bởi vì ActorProxy sẽ không được GC cho đến khi luồng là GC'd. ActorProxy về cơ bản cho phép chuỗi không phải diễn viên theo nhiều cách hành xử giống như một diễn viên, bao gồm cả việc nhận tin nhắn.

Vấn đề lớn hơn là nếu chuỗi của bạn được quản lý, tương tự như cách thư viện diễn viên quản lý chủ đề, sao cho ngữ cảnh logic có thể cùng một lúc trên một chuỗi và tại một thời điểm khác trên một chuỗi khác. Một ví dụ tốt về điều này sẽ là một thùng chứa servlet. Ngữ cảnh logic của bạn có thể là một servlet hoặc một phiên, nhưng ActorProxy sẽ bị ràng buộc vào luồng, và do đó được chia sẻ trong các ngữ cảnh hợp lý. Nếu các diễn viên của bạn không trả lời ActorProxy thì đây không phải là vấn đề lớn, nhưng nếu họ có thể sẽ dẫn đến các vấn đề bởi vì (a) các câu trả lời có khả năng sẽ nhận được bởi bối cảnh sai, hoặc (b) tin nhắn không bao giờ nhận được, và do đó rò rỉ nhỏ được đề cập trước đó trở thành một lớn như các hộp thư của ActorProxies điền vào.

[Chỉnh sửa] Hmm ... Có vẻ như tôi gặp sự cố khi đọc câu hỏi! Xung quanh nó trong khối diễn viên tạo ra một đối tượng diễn viên mới sẽ được GC'd đúng khi nó chấm dứt. Hãy nhớ rằng việc gửi tin nhắn gửi trong một khối diễn viên có nghĩa là việc gửi tin nhắn sẽ được thực hiện trong một phản ứng mới trên một chủ đề khác, chứ không phải trong chuỗi tạo diễn viên.

+0

Câu trả lời hay, Eric, cảm ơn. Không gói lời gọi trong một khối "diễn viên {}" (như trong câu hỏi của tôi) bị cùng một vấn đề? Hoặc là tác nhân được tạo GC có thể khi khối thoát, bất kể chuỗi có tồn tại không? –

0

Tôi không thấy có vấn đề gì với việc đó. Nếu nó có ý nghĩa trong mã của bạn, thì tại sao không? Nếu bạn nhìn vào mô hình diễn viên thuần túy, mọi diễn viên đều là diễn viên và chỉ có các diễn viên giao tiếp với nhau, nếu bạn có thể thiết kế mã của mình như thế này..great..if bạn không thể hoặc không muốn thì không sao gửi tin nhắn từ những người không tham gia diễn viên đến các diễn viên.

+0

Tôi không chắc chắn như vậy. Xét cho cùng, trong phản ứng, "người gửi" sẽ là gì? –

+0

Tên người gửi sẽ là một ActorProxy được tạo ngầm được gắn với chuỗi gửi. –

Các vấn đề liên quan