Tôi có một bãi chứa bộ nhớ mà tôi đã thực hiện từ một ứng dụng sắp chết. Nó đã tiêu thụ tất cả các đống có sẵn (-Xmx1024m). Nó sử dụng com.gargoylesoftware.htmlunit.WebClient
để thu thập thông tin các trang web. Thực hiện một vài yêu cầu http mỗi phút, chết trong vài ngày. Như tôi thấy từ bãi chứa, nó có ~ 1750 bản sao của lớp HtmlPage
, mỗi lớp có tông màu của các đối tượng liên quan, bao gồm nội dung đầy đủ của một trang được thu thập thông tin.Rò rỉ bộ nhớ săn bắn, VisualVM: "Không tìm thấy thư mục gốc GC". Cái gì tiếp theo?
Tôi không thể hiểu tại sao HtmlPage
không phải là rác được thu thập. Tôi đã điều tra tài liệu tham khảo cá thể và tôi không thấy bất kỳ mã nào của tôi đang nắm giữ tham chiếu đến nó và VisualVM nói rằng "Không tìm thấy thư mục gốc GC". Theo tôi hiểu nó có nghĩa là đối tượng có đủ điều kiện cho gc, nhưng nó không hoạt động.
Ứng dụng đang chạy như một quá trình độc lập đơn giản, nó không sử dụng bất kỳ vùng chứa web hoặc máy chủ ứng dụng nào.
Bất kỳ gợi ý? Tôi nên xem xét điều gì khác?
Specs:
- HtmlUnit v2.7
- phiên bản java "1.6.0_13" Java (TM) SE Runtime Environment (xây dựng 1.6.0_13-b03) Java HotSpot (TM) Máy chủ VM (xây dựng 11.3-b02, chế độ hỗn hợp)
- Linux my.lan 2.6.18-128.el5 # 1 SMP Thứ tư ngày 17 tháng 12 11:42:39 EST 2008 i686 i686 i386 GNU/Linux
Update1
Tôi đã cố gắng để phân tích các bãi chứa của YourKit Java Profiler. Nó cho tôi thấy rất nhiều đối tượng java.lang.ref.Finalizer
với kích thước giữ lại 310mb. Chúng được tạo cho trình hoàn tất net.sourceforge.htmlunit.corejs.javascript.NativeGenerator#finalize()
và NativeGenerator
đề cập đến Window
, sau đó đến HtmlPage
và cho mọi thứ.
Có ai biết tại sao họ ở lại trong bộ nhớ?
Lưu ý: Tò mò, nhưng VisualVM đã hiển thị "đang chờ hoàn tất" là không.
Bạn đã sử dụng đối số dòng lệnh cụ thể cho JVM chưa? –
@ThomasJungblut '-Xmx1024m -XX: MaxPermSize = 128m -XX: + PrintGCDetails -XX: + PrintGCTimeStamps -XX: + UseConcMarkSweepGC' – kan
Tôi cũng gặp phải rò rỉ bộ nhớ với htmlunit 2.8. Như một giải pháp thay thế, tôi tái khởi tạo WebClient một lần một ngày. Hy vọng bạn có thể theo dõi lỗi này. – milan