2008-09-22 41 views
16

Tôi đang sử dụng jProfiler để tìm rò rỉ bộ nhớ trong ứng dụng Java swing. Tôi đã xác định trường hợp của một JFrame mà giữ ngày càng tăng tính.'Tham chiếu toàn cầu JNI' là gì

Khung này được mở và sau đó đóng.

Sử dụng jProfiler và xem Đường dẫn đến GC Gốc chỉ có một tham chiếu, 'Tham chiếu toàn cầu JNI'.

Điều này có nghĩa là gì? Tại sao nó treo trên mỗi trường hợp của khung?

Trả lời

8

Wikipedia có tổng quan tốt về Java Native Interface, về cơ bản nó cho phép liên lạc giữa Java và thư viện hệ điều hành gốc được viết bằng các ngôn ngữ khác.

Tham chiếu toàn cầu JNI dễ bị rò rỉ bộ nhớ, vì chúng không được thu thập rác tự động và lập trình viên phải giải phóng chúng một cách rõ ràng. Nếu bạn không tự viết bất kỳ mã JNI nào, có thể thư viện bạn đang sử dụng bị rò rỉ bộ nhớ.

chỉnh sửahere là biết thêm một chút về tài liệu tham khảo toàn cầu địa phương vs, và tại sao tài liệu tham khảo toàn cầu được sử dụng (và làm thế nào họ nên được trả tự do)

+2

Wikipedia là nguồn phụ. Nguồn chính và tài liệu chính thức là [Đặc tả JNI] (http://docs.oracle.com/javase/6/docs/technotes/guides/jni/spec/jniTOC.html). – EJP

12

Một JNI tham khảo toàn cầu là một tham chiếu từ mã "mẹ đẻ" đối tượng Java được trình thu thập rác Java quản lý. Mục đích của nó là ngăn chặn việc thu thập một đối tượng vẫn đang được sử dụng bởi mã gốc, nhưng dường như không có bất kỳ tham chiếu trực tiếp nào trong mã Java.

JFrame là java.awt.Window và được liên kết với đối tượng Window "gốc". Khi bạn hoàn thành xong với một cá thể JFrame cụ thể, bạn nên gọi phương thức dispose() để dọn dẹp.

Tôi không chắc liệu có mã gốc nào đang tạo tham chiếu chung cho JFrame hay không, nhưng dường như có khả năng. Nếu có, điều này sẽ ngăn JFrame bị thu gom rác. Nếu bạn đang tạo nhiều Windows (hoặc các lớp con) và thấy rằng chúng không bao giờ được thu thập, hãy chắc chắn rằng chúng được xử lý.

+0

Nếu mã chỉ là Java, đây là giải thích có khả năng nhất. Tôi đã có vấn đề với con trỏ toàn cầu nhưng tôi đã làm việc với JNI. –

7

Tôi gặp sự cố chính xác này khi sửa lỗi rò rỉ bộ nhớ trong ứng dụng JavaFX. Cuối cùng, vấn đề hóa ra là tôi đang chạy ứng dụng ở chế độ gỡ lỗi và có một số điểm ngắt trong mã. Điều này dường như đã khiến cho các đối tượng trở thành 'tham chiếu toàn cầu JNI' và được lưu giữ trong bộ nhớ mà không có lý do rõ ràng. Khi tôi tắt chế độ gỡ lỗi tất cả mọi thứ đã làm việc như nó phải!

+0

Crap, đây chính xác là những gì vừa xảy ra với tôi! – Trejkaz

+0

Một chi tiết nữa .. haha – BrunoJCM

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