Tôi đã chạy một khối đống trên chương trình của mình. Khi tôi mở nó trong công cụ phân tích bộ nhớ, tôi thấy rằng java.lang.ref.Finalizer
cho org.logicalcobwebs.proxool.ProxyStatement
chiếm nhiều bộ nhớ. Tại sao cái này rất?có bị rò rỉ bộ nhớ không? lý do tại sao java.lang.ref.Finalizer ăn quá nhiều bộ nhớ
Trả lời
Một số lớp thực hiện các phương pháp Object.finalize()
. Các đối tượng ghi đè phương thức này cần được gọi bằng trình hoàn thành cuộc gọi luồng nền và chúng không thể được dọn sạch cho đến khi điều này xảy ra. Nếu những tác vụ này ngắn và bạn không loại bỏ nhiều tác vụ này thì tất cả đều hoạt động tốt. Tuy nhiên nếu bạn đang tạo ra rất nhiều các đối tượng và/hoặc finalizers của họ mất một thời gian dài, hàng đợi của các đối tượng được hoàn thành xây dựng lên. Có thể cho hàng đợi này sử dụng hết bộ nhớ.
Giải pháp là
- không sử dụng hoàn thiện() d đối tượng nếu bạn có thể (nếu bạn đang viết các lớp học cho các đối tượng)
- làm hoàn thiện rất ngắn (nếu bạn phải sử dụng nó)
- không loại bỏ các đối tượng như mỗi lần (cố gắng tái sử dụng chúng)
tùy chọn cuối cùng có khả năng là tốt nhất cho bạn khi bạn đang sử dụng một thư viện hiện có.
Tùy chọn # 4 - tránh sử dụng thư viện (over-) sử dụng finalizers. –
Biến thể của tùy chọn # 1;) –
có thể sự cố là nguyên nhân của chuỗi Finalizer. một lớp ghi đè hoàn thành methond, gây ra khóa chết cuối cùng của biến chủ đề – fuyou001
Từ những gì tôi có thể tạo ra, Proxool là một hồ bơi kết nối cho các kết nối JDBC. Điều này cho thấy rằng vấn đề là ứng dụng của bạn đang lạm dụng hồ bơi kết nối. Thay vì gọi số close
trên các đối tượng câu lệnh, mã của bạn có thể đang xóa chúng và/hoặc các kết nối cha mẹ của chúng. Proxool dựa vào finalizers để đóng các đối tượng điều khiển bên dưới, nhưng điều này đòi hỏi các cá thể Finalizer đó. Nó cũng có thể có nghĩa là bạn đang gây ra kết nối để mở/đóng (thực) kết nối cơ sở dữ liệu thường xuyên hơn là cần thiết, và đó sẽ là xấu cho hiệu suất.
Vì vậy, tôi khuyên bạn nên kiểm tra mã của mình cho các đối tượng ResultSet, Statement và/hoặc Connection bị rò rỉ và đảm bảo rằng bạn đóng chúng trong các khối finally
.
Nhìn vào kết xuất bộ nhớ, tôi hy vọng bạn quan tâm đến 898,527,228 byte đang diễn ra. Phần lớn được giữ lại bởi đối tượng Finalizer có id là 2aab07855e38
. Nếu bạn vẫn có tệp kết xuất, hãy xem những gì rằngFinalizer
đang đề cập đến. Nó trông có vấn đề hơn các đối tượng Proxool.
cảm ơn nhưng tôi không thể tìm thấy nguyên nhân gây ra rò rỉ memo kết nối JDBC – fuyou001
Tôi cũng không thể trừ khi tôi thấy mã nguồn của bạn. (Và tôi không chuẩn bị để dành thời gian của mình trawling thông qua nó anyway ...) –
Liên kết "hình ảnh" chuyển đến những gì dường như là tiểu sử trên twitter của bạn. –
@ R.MartinhoFernandes Nó đi qua một hình ảnh ông đã lưu trữ với twitter, tôi nghĩ. – Oliver