2012-09-22 26 views
14

Tôi có tạm dừng thu gom rác thải đáng kể. Tôi muốn xác định các đối tượng chịu trách nhiệm nhất về bộ sưu tập này trước khi tôi cố khắc phục sự cố. Tôi đã nhìn vào heap snapshot trên Chrome, nhưng (đúng với tôi nếu tôi sai) Tôi dường như không thể tìm thấy bất kỳ chỉ báo về những gì đang được thu thập, chỉ có những gì đang chiếm nhiều bộ nhớ nhất. Có cách nào để trả lời điều này theo kinh nghiệm, hay tôi bị hạn chế với những dự đoán được giáo dục?Làm thế nào tôi có thể xác định đối tượng nào đang được thu thập bởi bộ thu gom rác?

+2

Làm thế nào bạn có thể chắc chắn rằng tạm dừng là do thu gom rác thải? – pencil

+0

Bạn đã đọc cái này chưa? http://gent.ilcore.com/2011/08/finding-memory-leaks.html?m=1 – HerrSerker

+1

@pencil Hai cách - chúng trùng với sự sụt giảm bộ nhớ trên dòng thời gian bộ nhớ trong Chrome và khi tôi bắt buộc mã để lặp đi lặp lại rất nhiều để tạo ra tạm dừng liên tục, thu gom rác thải (cho đến nay) phần tốn nhiều thời gian nhất trong các kết quả lược tả của tôi. – shino

Trả lời

3

Nếu bạn đang cố gắng lựa chọn giữa một vài thủ phạm có khả năng, bạn có thể sửa đổi định nghĩa đối tượng để đính kèm bản thân vào phạm vi toàn cầu (dưới dạng danh sách theo tài liệu hoặc thứ gì đó). Sau đó, điều này sẽ ngăn chặn chúng được thu thập. Mà có thể làm cho chương trình nhanh hơn (chúng không được khai hoang) hoặc chậm hơn (bởi vì chúng được xây dựng và được kiểm tra bằng cách quét và quét mỗi lần). Vì vậy, nếu bạn thấy thay đổi về hiệu suất, bạn có thể đã tìm thấy sự cố.

Một cách khác là xem có bao nhiêu đối tượng đang được tạo ra cho từng loại (thiết lập bộ đếm trong hàm tạo). Nếu họ đang thu thập được rất nhiều, chúng cũng đang được tạo ra thường xuyên.

+0

Thông minh! Tôi sẽ thử nó ngay bây giờ, cảm ơn. – shino

9

Trong cấu hình chrome có hai ảnh chụp nhanh heap, một ảnh trước khi thực hiện hành động bạn muốn kiểm tra và sau đó.

Bây giờ hãy nhấp vào ảnh chụp nhanh thứ hai.

Trên thanh dưới cùng, bạn sẽ thấy hộp chọn có tùy chọn "tóm tắt". Thay đổi nó thành "so sánh".

Sau đó, trong hộp chọn bên cạnh nó, chọn snaphot bạn muốn so sánh (nó nên tự động chọn ảnh chụp nhanh).

Kết quả là bạn sẽ nhận được bảng có dữ liệu bạn cần. Các đối tượng "Mới" và "Đã xóa".

5

Với Chrome mới phát hành có một công cụ mới có sẵn mà là tiện dụng cho các loại hình công việc:

"Bản ghi Heap phân bổ" profiling loại. Công cụ so sánh "Heap SnapShot" thông thường (như được giải thích trong câu trả lời của Rafał Łużyński) không thể cung cấp cho bạn loại thông tin đó bởi vì mỗi khi bạn chụp ảnh heap, một lần chạy GC được thực hiện, vì vậy đối tượng GCed không bao giờ là một phần của ảnh chụp nhanh. Tuy nhiên với công cụ "Ghi lại phân bổ đống" liên tục, tất cả các phân bổ đang được ghi lại (đó là lý do tại sao nó có thể làm chậm ứng dụng của bạn rất nhiều khi nó được ghi). Nếu bạn đang gặp phải các lần chạy GC thường xuyên, công cụ này có thể giúp bạn xác định các địa điểm trong mã của bạn, nơi có rất nhiều bộ nhớ được cấp phát. Kết hợp với so sánh Heap SnapShot, bạn sẽ thấy rằng phần lớn thời gian có nhiều bộ nhớ được cấp phát giữa hai ảnh chụp nhanh hơn bạn có thể thấy từ so sánh. Trong trường hợp cực đoan, sự so sánh sẽ không tạo ra sự khác biệt nào cả, trong khi công cụ phân bổ sẽ cho bạn thấy rất nhiều và rất nhiều bộ nhớ được phân bổ (rõ ràng là phải thu gom rác trong thời gian chờ đợi).

Đáng tiếc là phiên bản hiện tại của công cụ này không chỉ cho bạn nơi việc giao đã diễn ra, nhưng nó sẽ cho bạn thấy những gì đã được phân bổ và làm thế nào nó được được giữ lại tại thời điểm phân bổ. Từ dữ liệu (và có thể là các nhà xây dựng), tuy nhiên bạn sẽ có thể xác định các đối tượng của bạn và do đó là nơi chúng được phân bổ.

3

Hãy xem https://developers.google.com/chrome-developer-tools/docs/heap-profiling

đặc biệt Containment Xem

Quan điểm Containment bản chất là một "cái nhìn mắt chim" của cấu trúc vật ứng dụng của bạn. Nó cho phép bạn nhìn trộm bên trong chức năng đóng cửa, để quan sát các vật thể bên trong của máy ảo mà cùng nhau tạo thành các đối tượng JavaScript của bạn và để biết mức độ sử dụng của bộ nhớ mà bạn sử dụng ở mức rất thấp.

Quan điểm cung cấp một số điểm vào:

đối tượng DOMWindow - đây là những đối tượng được coi là "toàn cầu" đối tượng cho mã JavaScript; Rễ GC - rễ GC thực tế được sử dụng bởi rác của VM collector; Đối tượng gốc - đối tượng trình duyệt được "đẩy" bên trong máy ảo JavaScript để cho phép tự động hóa, ví dụ: DOM node, quy tắc CSS (xem phần tiếp theo để biết thêm chi tiết.) Dưới đây là ví dụ về những gì nhìn Containment trông giống như:

enter image description here

+0

Theo như tôi hiểu, các đối tượng có thể được thu thập rác sẽ không xuất hiện trong khung nhìn này, bởi vì trước khi chụp nhanh, một lần chạy GC được thực hiện. Vì OP muốn biết những đối tượng nào được GC, điều này không thực sự giúp ích được, hay là nó? – Sebastian

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