2012-04-23 39 views
6

tôi đang tạo ra một người dẫn chương trình mới như vậy:GWT Garbage Collection

new MyPresenter(new MyView()); 

Nó đăng ký một số xử lý sự kiện và liên kết với các quan điểm và như vậy. Cuối cùng, tôi có thể "đóng" chế độ xem đó để nó không còn được hiển thị bởi trình duyệt nữa. Tôi không duy trì một tham chiếu đến trường hợp này là MyPresenter ở bất kỳ đâu.

Trong các diễn đàn của Google về chủ đề này, phản hồi thông thường là "đặt tham chiếu của bạn thành null" và sau đó đừng lo lắng về điều đó. Không giống như trong Javascript, tôi không thể chỉ nói this = null; trong Java vì những lý do hiển nhiên. Nhưng trong Javascript, rất dễ để vô hiệu hóa các tham chiếu đối tượng mà tôi biết sẽ không còn được sử dụng nữa.

Câu hỏi của tôi: Làm cách nào để biết liệu người trình bày này có bị thu gom rác vì tôi không duy trì tham chiếu đến nó không? Nó rất rõ ràng tồn tại. Tôi có nên tin rằng GWT và JS sẽ chăm sóc điều này? Hoặc tôi có cần duy trì tham chiếu của riêng mình cho MyPresenter để tôi có thể tự null khi tôi hoàn thành nó không?

+0

Tùy thuộc vào trình duyệt. Về cơ bản, nếu bạn không có tham chiếu đến các đối tượng, nó sẽ được thu thập, nhưng có lỗi, như lỗi nổi tiếng trong IE với các tham chiếu chéo giữa các đối tượng DOM và JS (các thành phần mặc định trong GWT thường được bảo vệ khỏi điều này) hoặc một số bộ thu gom rác không thể xóa các đảo đối tượng. Vì có rất nhiều trình duyệt, không có mẹo hay công cụ phổ quát nào để chống lại vấn đề này. Lựa chọn duy nhất là chạy thử nghiệm hiệu suất và kiểm tra mức sử dụng bộ nhớ. – jusio

+0

Tôi không bao giờ ** có tham chiếu đến đối tượng đó từ bên trong mã (người dùng) của tôi, tuy nhiên nó có thể tồn tại vì nó có thể xử lý các sự kiện nếu tôi kích hoạt chúng. Tuy nhiên, nếu tôi loại bỏ các trình xử lý sự kiện và null ra 'MyView' là đủ để làm cho nó được GC'd? Nỗi sợ của tôi là nó không phải. –

+0

@TravisWebb nó * phải * đủ. Nhưng tai nạn xảy ra. Tôi không thể phù hợp trong một ý kiến ​​tất cả các lỗi liên quan đến GC, nhưng chúng xảy ra từ thời gian. Nếu bạn loại bỏ tất cả các tham chiếu đến đối tượng, nó sẽ được thu thập (thêm một cái gì đó làm trình nghe sự kiện, được tính là tạo tham chiếu, vì một số đối tượng ở đâu đó phải biết nơi gửi sự kiện) – jusio

Trả lời

2

Có hai loại rò rỉ bộ nhớ: bộ nhớ mức

  • DOM/trình duyệt rò rỉ
  • rò rỉ bộ nhớ ứng dụng.

Rò rỉ bộ nhớ cấp trình duyệt DOM/trình duyệt thường kéo dài sau khi bạn đóng ứng dụng. Chỉ các trình duyệt cũ của AFAIK (IE6) bị ảnh hưởng và đó là lý do tại sao GWT sử dụng special way để đính kèm các trình xử lý.
Điều này không phải là vấn đề với trình duyệt hiện đại ít nhất chúng sẽ không phải là vấn đề nếu bạn đóng ứng dụng. Tuy nhiên, chúng có thể trở thành rò rỉ bộ nhớ ứng dụng. (Xem here để biết thêm chi tiết). Nhưng nói chung hiện đại Javascript GC là khá tốt trong giải phóng bộ nhớ không sử dụng.

Rò rỉ bộ nhớ ứng dụng có thể là vấn đề với các ứng dụng đang chạy lâu và khi bạn tạo động rất nhiều lượt xem/trình diễn và giữ tham chiếu qua Eventhandlers. Nhưng ở đây nó thực sự phụ thuộc vào phạm vi của các bên liên quan.
Điều này post là một tài liệu tham khảo tốt với một số thông tin thêm về điều đó.

Cuối cùng để đảm bảo rằng bạn thực sự không có bất kỳ rò rỉ bộ nhớ ứng dụng nào, bạn nên sử dụng Dev Tools Heap Profiler để kiểm tra mức tiêu thụ bộ nhớ trong một khoảng thời gian dài hơn.
Điều này blog post có thêm một số thông tin về điều đó.

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