2012-07-01 21 views
8

Tôi đã tìm thấy điều này trên tất cả các trình duyệt được thử nghiệm - IE, Firefox, Chrome và Safari trên Window Safari Safari trên Apple.làm mới trình duyệt không làm bộ sưu tập rác

Bị cáo buộc, làm mới trình duyệt, nút quay lại hoặc liên kết chuyển tiếp sẽ đổ nút trình duyệt và biến và đối tượng javascript, v.v. Điều này có vẻ không đúng đối với WebGL. Lần đầu tiên tôi nhận thấy nó khi phát triển một ứng dụng WebGL phức tạp đòi hỏi khoảng 100MB đến 200MB bộ nhớ. Trong khi phát triển, tôi phải làm rất nhiều làm mới và máy tính của tôi sẽ bắt đầu chậm lại và đóng băng sau 5-10 lần làm mới.

Sau khi một số nghiên cứu tôi nhận ra rằng điều này không nên. Các giải pháp được chấp nhận trong một rò rỉ bộ nhớ là làm mới trang mà nên giải phóng tất cả các đối tượng javascript và các biến và các nút dom. Nhưng hãy xem các hình ảnh sau:

Vì vậy, thỏa thuận ở đây là gì? Trên các ứng dụng nhỏ nó không được nhận thấy, nhưng đối với các ứng dụng WebGL lớn như của tôi (orbitingeden.com) đây là một vấn đề thực sự và người dùng của tôi sẽ nghĩ rằng phần mềm thậm chí còn nhiều hơn một con heo tài nguyên hơn nó thực sự là. Những hình ảnh sau đây cho thấy những làm mới ngấu nghiến tất cả các bộ nhớ có sẵn của tôi, vì vậy thu gom rác thải không hoạt động và/hoặc JS và DOM đối tượng không được phát hành:

http://orbitingeden.com/images/big_memory_after.png

Không ai biết của một thủ thuật để buộc các trình duyệt để làm một bãi chứa bộ nhớ thực sự? Tại sao tất cả tài liệu ra có sai?

+2

https://bugs.webkit.org/show_bug.cgi?id=76225 – gman

+0

@gman: nếu bạn trả lời câu hỏi, tôi sẽ cung cấp cho bạn tín dụng. Tóm tắt: WebGL sử dụng ngữ cảnh được lưu trữ theo tên miền và tab, không liên quan đến trang cụ thể (làm mới). Kết quả là, mọi bộ nhớ được phân bổ cho việc hiển thị WebGL sẽ không được giải phóng để thu thập rác cho đến khi người dùng điều hướng khỏi miền cơ sở hoặc đóng tab. Một sửa chữa có thể là thêm nút thoát vào ứng dụng chuyển hướng nhanh đến miền mới chuyển hướng ngược lại. –

+0

Lỗi này sẽ được sửa vào bất kỳ ngày nào, vì vậy hy vọng sẽ không cần phải giải quyết sớm. Có thực sự là một thử nghiệm cho điều này trong các bài kiểm tra sự phù hợp webgl (https://cvs.khronos.org/svn/repos/registry/trunk/public/webgl/sdk/tests/conformance/context/context-creation-and-destruction. html) – gman

Trả lời

2

Một trong những điểm thu thập rác là các đối tượng là không làm sạch ngay lập tức chúng không được sử dụng. Bộ thu gom rác có thể tự xác định khi nào thuận tiện nhất để thực hiện các bộ sưu tập.

Điều bình thường đối với một hệ thống thu gom rác thải để lại một số đối tượng không sử dụng trong heap, miễn là có nhiều bộ nhớ để sử dụng. Một máy tính không chạy nhanh hơn do có nhiều bộ nhớ không sử dụng.

+0

Điều đó được cho là đúng trong phiên trang. Tuy nhiên, quy tắc chung là làm mới trang nên thực hiện các thao tác sau: xóa tất cả các nút, hoặc vô hiệu tất cả các biến và sau đó bắt buộc thu thập bộ sưu tập rác cần thu thập tất cả các đối tượng và biến bị bỏ gần đây và xóa chúng khỏi bộ nhớ. Bất kể, bởi lý thuyết của bạn khi máy tính bắt đầu chạy ra khỏi bộ nhớ, thu gom rác nên thu thập tất cả những đối tượng không sử dụng và xử lý chúng. Nhưng máy tính của tôi chỉ dừng lại để dừng lại! –

+0

@OrbitingEden: Nếu bộ nhớ không được thu thập khi cần thiết, thì rất có thể đó là sự rò rỉ bộ nhớ thực tế. Bộ thu gom rác nên khởi động khi bạn chạy thấp. – Guffa

+2

Sau đó, tôi đoán câu hỏi là tốt hơn đặt: Làm thế nào có thể rò rỉ bộ nhớ javascript tràn ngập trên làm mới trang và điều hướng? Điều đó là không thể, phải không? –