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?
Trả lời
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.
Thông minh! Tôi sẽ thử nó ngay bây giờ, cảm ơn. – shino
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".
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ổ.
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ư:
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
- 1. Kiểm tra xem đối tượng có thể được tìm nạp bởi bộ thu gom rác
- 2. Cách thu gom rác thu thập các đối tượng tự tham chiếu?
- 3. Làm thế nào tôi có thể xem java thu gom rác nào đang sử dụng
- 4. Đối tượng COM này có bị thu gom rác không?
- 5. Khi nào đối tượng thu gom rác trong python?
- 6. Thu gom rác của hình tròn tham chiếu đối tượng
- 7. Khi nào để thu gom rác
- 8. Trong Java, làm thế nào là một mảng các đối tượng rác thu thập được?
- 9. Làm thế nào để hướng dẫn PowerShell thu thập rác các đối tượng .NET như XmlSchemaSet?
- 10. Ruby: Đánh dấu một đối tượng để thu gom rác
- 11. Bộ thu gom rác có gọi là Dispose() không?
- 12. Thu gom rác trong Perl
- 13. Thu gom rác trễ?
- 14. Khi nào bộ thu gom rác net hoạt động?
- 15. đế và bộ thu gom rác Đi
- 16. Thu gom rác - các nút gốc
- 17. Java không thu thập bộ nhớ rác
- 18. Làm thế nào để ngăn chặn một đối tượng bị thu gom rác?
- 19. đa và thu gom rác thải
- 20. Có một JVM thiếu bộ thu gom rác không?
- 21. Các loại giá trị có được thu gom rác không?
- 22. Thu gom rác thủ công bằng Python
- 23. Tại sao Ada không có bộ thu gom rác?
- 24. Buộc thu gom rác thải
- 25. Tham khảo chéo và thu gom rác
- 26. Hành vi suy yếu khi đối tượng được hoàn thành nhưng chưa thu gom rác
- 27. Thông báo Thu gom Rác Bỏ lỡ
- 28. tham chiếu nội bộ ngăn chặn việc thu gom rác
- 29. Thời gian thu gom rác cực dài
- 30. Khi nào thì bộ thu gom rác sẽ xóa một thể hiện của một đối tượng sử dụng mẫu Singleton?
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
Bạn đã đọc cái này chưa? http://gent.ilcore.com/2011/08/finding-memory-leaks.html?m=1 – HerrSerker
@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