2009-01-16 3 views
5

Mặt trời JVM phát ra rất nhiều tiếng ồn khi chạy dưới valgrind, khiến các vấn đề về bộ nhớ theo dõi trong ứng dụng trở nên rất khó khăn.Chạy ứng dụng JNI trong Sun VM theo Valgrind

Tôi muốn tìm một tệp triệt tiêu hoặc chế độ thời gian chạy VM, sẽ loại bỏ các lỗi bộ nhớ giả để tách lúa mì khỏi chaff trong tình huống này. Bất kỳ đề xuất?

+0

Tôi tìm thấy theo dõi các vấn đề bộ nhớ JNI trên Win32 không dễ dàng hơn. –

+0

Nếu bạn kết thúc việc tạo tệp loại trừ, bạn có nhớ đăng tệp ở đây không? – Arkadiy

Trả lời

1

Điều gì về việc định cấu hình mã gốc này bên ngoài ứng dụng Java? Thông thường mã JNI là một trình bao bọc xung quanh một số thư viện không phải là Java cụ thể. Bạn không chắc chắn nếu điều đó là đúng cho trường hợp cụ thể của bạn, nhưng nếu nó là sau đó có thể các vấn đề bộ nhớ có thể được cô lập bằng cách viết một khuôn khổ C hoặc C++ thử nghiệm đồng bằng xung quanh thư viện đó?

Nếu khung của bạn nằm trong C++ thì bạn cũng có thể cung cấp các toán tử mới và xóa của riêng bạn và tự theo dõi việc sử dụng bộ nhớ. Bạn sẽ phải thu thập số liệu thống kê và xử lý chúng với một số tập lệnh nhưng nó có thể hoạt động tốt.

1

Tôi không thể trả lời câu hỏi đã đăng của bạn, nhưng bạn có thể giải thích về vấn đề bạn đang gặp phải không?

Nói cách khác, bạn có thể cho chúng tôi biết nếu nó là ...

  • Trong lớp JNI và không phải là một vấn đề phạm vi đối tượng JVM?
  • Sử dụng bộ nhớ miễn phí?
  • Bộ đệm ghi đè/ghi đè?
  • Tham nhũng bộ nhớ khác?

Gần đây, tôi đã phải gỡ lỗi Java/C đã gặp sự cố (sau 30 phút chạy), mà hóa ra là sử dụng bộ nhớ sau khi đã được giải phóng. Tôi đã thử sử dụng dmalloc, một thư viện rò rỉ bộ nhớ tùy chỉnh của tôi, Valgrind và không ai làm việc như tôi cần.

Cuối cùng tôi đã tạo một bộ trình bao bọc đơn giản xung quanh miễn phí, malloc, calloc, realloc chỉ đơn giản là in địa chỉ bộ nhớ và kích thước vào tệp. Sau khi nó bị hủy bỏ (trong GDB) tôi có thể quay ngược thời gian và tìm ra khi nào bộ nhớ được tự do và nơi mà các tài liệu tham khảo không bị xóa.

NẾU vấn đề của bạn nằm trong C/C++ và bạn có thể bẫy lỗi trong trình gỡ lỗi, điều này có thể phù hợp với bạn. Có, nó tẻ nhạt, nhưng có thể không tồi tệ hơn việc chọn lọc qua megabyte đầu ra Valgrind.

Hy vọng rằng sẽ giúp & chúc may mắn.

+0

Tôi đang tìm kiếm để xác định rò rỉ chủ động, không phải để theo dõi một rò rỉ mà tôi biết tồn tại. Tôi muốn tránh tình hình của bạn, thực sự :) Đó là một thói quen cho tôi để chạy các ứng dụng của tôi thông qua valgrind trước khi phát hành chúng. Thư viện JNI làm cho một chút của một băm của điều đó, mặc dù. –

0

Trong khi không phải là như spiffy như valgrind (dựa trên những gì tôi đã đọc), bạn có thể thử jmap và jhat. Những công cụ này cho phép bạn chụp nhanh quá trình chạy và xem điều gì đang xảy ra. Tôi đã sử dụng kỹ thuật này cho rò rỉ bộ nhớ đơn giản và nó hoạt động tốt. Tuy nhiên, nếu các vấn đề bộ nhớ được gây ra bởi phân bổ không phải jvm, điều này sẽ không giúp đỡ.