2013-06-13 32 views
7

Tôi có ứng dụng web kiểu 'Hello world' rất đơn giản (Spring 3.2.1, Hibernate 4.1.9) khi dừng/khởi động lại ứng dụng web Tomcat 7.0.26permgen, nhưng Java VisualVM nói "Không tìm thấy gốc GC"

The following web applications were stopped (reloaded, undeployed), but their 
classes from previous runs are still loaded in memory, thus causing a memory 
leak (use a profiler to confirm): 
/myapp 

tôi lấy các bước sau: Started JVisualVM nhấp chuột phải vào Tomcat và chọn 'Heap Dump' nhấp vào 'OQL Bảng điều khiển' trên [heapdump] Ran truy vấn này:

select x from org.apache.catalina.loader.WebappClassLoader x 

Tìm thấy 4 trường hợp:

org.apache.catalina.loader.WebappClassLoader 

một lựa chọn mà "bắt đầu" lĩnh vực là "false" phải nhấp vào "đây" tham khảo và nhấp "Hiển thị GC gần Root" Một hộp thoại nói rằng "Không có gốc GC tìm thấy" được hiển thị.

Tôi đang thiếu gì? Chúng tôi rất trân trọng bất kỳ sự giúp đỡ nào. Cảm ơn.

+0

Mọi cập nhật về điều này?Tôi đang đấu tranh với vấn đề này. Một cái gì đó để chia sẻ? – ggarciao

+0

@ggarciao, không được nghỉ ngơi. – kmansoor

+0

Tôi đã tạo trên luồng Stackoverflow với trường hợp của tôi http://stackoverflow.com/questions/19470328/webappclassloader-memory-leak-even-with-no-gc-roots – ggarciao

Trả lời

-3

Thử đóng javaw.exe khỏi các quy trình Trình quản lý tác vụ.

+0

Điều gì nếu env. tomcat được triển khai trên Linux là gì? Điều gì xảy ra nếu có các ứng dụng khác được triển khai tới t/c? Bên cạnh đó, việc đóng cửa có thể không phải là một lựa chọn. – kmansoor

4

Với tất cả các hướng dẫn trên web, cho thấy quá trình chính xác mà bạn mô tả,

  1. sử dụng VisualVM,
  2. tìm kiếm WebappClassLoader,
  3. nhìn cho những người thân với 'bắt đầu' bằng giả.
  4. Nhấp vào 'Hiển thị gần nhất GC Root'

Có thể gây nhầm lẫn khi trả về 'Không có gốc GC'.

Nhưng đây là một điều tốt

Những hướng dẫn đã bỏ lỡ một bước, khi xem danh sách các WebappClassLoader nhấp chuột vào liên kết 'Tính giữ lại kích thước ở phía bên tay phải

visualVM showing link to compute retained sizes

Sau một chút (tùy thuộc vào tổng kích thước của heap), điều này sẽ hiển thị một cái gì đó như sau

visualVM showing retained sizes

Các dòng có giá trị giữ lại là 0 là cũng là Trình nạp lớp có trạng thái sai và không có Gốc GC.

Điều này chỉ có nghĩa là chúng đã sẵn sàng cho lần chạy GC tiếp theo mà JVM chạy.

Tóm tắt: Mặc dù 'phát hiện rò rỉ tomcat' cho thấy rò rỉ, nếu kích thước được giữ lại bằng 0, nó chưa bị rò rỉ, chỉ cần đợi GC loại bỏ nó.

Lưu ý: kích hoạt GC trong visualVM sẽ không phải lúc nào cũng xóa nó. Mặc dù nó sẽ bị xóa bởi một GC được kích hoạt bởi chính JVM.

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