2011-08-24 20 views
8

Tôi đã gặp phải OutOfMemoryException trong ứng dụng của tôi và thay vì chỉ đơn giản tăng số lượng không gian Heap có sẵn, tôi đã cố gắng xem xét vấn đề là gì, trong trường hợp có một số rò rỉ từ ứng dụng của tôi.Java Heap Space - Làm thế nào để -Xmx hoạt động chính xác?

Tôi đã thêm thông số JVM -XX: + HeapDumpOnOutOfMemoryError tạo Heap Dump khi gặp lỗi OutOfMemory. Sau đó tôi phân tích tệp kết xuất được tạo bằng các công cụ lược tả khác nhau. Sau đó tôi bắt đầu chơi xung quanh với tham số -Xmx và các mẫu quan sát.

Điều gì khiến tôi bối rối là như sau. Tại sao nó phân tích kết xuất tôi thấy rằng tổng kích thước của tất cả các đối tượng nhỏ hơn nhiều so với tổng số mà tôi đã đặt bằng tham số -Xmx? Ví dụ: giả sử tôi đặt -Xmx thành '2048m'. Khi tôi phân tích tệp kết xuất, tôi đã tìm thấy tổng số 400Mb đối tượng trên Heap. Tôi đã mong đợi để tìm 2GB. Tui bỏ lỡ điều gì vậy?

+0

Bạn có kiểm tra xem OOME của bạn có thực sự đề cập đến bộ nhớ heap không? Có một vài trường hợp (tương đối ít phổ biến) khi OOME bị ném, nhưng nó KHÔNG phải là đống đầy. –

+1

Phải, @Joachim, quá nhiều chủ đề trong JVM x86 bị ​​treo quá với ngoại lệ OOM – aalku

Trả lời

3

Đọc lại thông báo lỗi của bạn - nó có thể cho bạn biết loại bộ nhớ bạn đã hết. Tôi đoán đó là không gian PermGen. Permgen được sử dụng cho các định nghĩa lớp (trong số những thứ khác). Bạn có thể điều chỉnh khoảng trống cho PermGen qua -XX: MaxPermSize PermGen không phải là một phần của heap, do đó, không được bao gồm trong heap dump.

Xem this answer để biết thêm thông tin về cách xem PermGen.

Nếu đây không phải là vấn đề, hãy thử đặt kích thước heap ban đầu của bạn (-Xms) thành giá trị tối đa. Làm điều này có nghĩa là heap sẽ không phát triển mà nên làm cho sự hiểu biết những gì đang xảy ra dễ dàng hơn.

Tôi khuyên bạn nên sử dụng jvisualvm (một phần của JDK) để xem xét việc sử dụng bộ nhớ của bạn khi chương trình của bạn chạy.

+0

Có thể thú vị .... Có lỗi tôi nhận là cái này. Cố gắng hiểu điều này. Sẽ đăng lại với kết quả. – Kros

+0

Đã sử dụng -XX: MaxPermSize và đã gặp sự cố kể từ đó. Tôi nghĩ rằng những thay đổi mới nhất trong ứng dụng của tôi đã dẫn đến một ngưỡng bị vượt qua đã gây ra ngoại lệ. Cảm ơn bạn đã giúp đỡ. – Kros

5

tôi đoán là vì tổng công ty hiện đại phân vùng đống vào các khu vực bộ nhớ riêng biệt (trẻ/tenured/thế hệ vĩnh viễn), nó là đủ cho không gian thế hệ lâu dài để lấp đầy hoàn toàn cho một trong số lỗi bộ nhớ xảy ra. Bạn có thể cấu hình tỷ lệ của các không gian thế hệ khác nhau bằng cách sử dụng các tùy chọn dòng lệnh JVM khác nhau.

Đây là một bài viết hay về Tuning Garbage Collection with the 5.0 Java[tm] Virtual Machine (Tôi không thể tìm thấy bài viết gần đây hơn nhưng tôi nghĩ rằng các khái niệm cơ bản vẫn được áp dụng trong các máy ảo mới hơn).

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