2011-02-08 22 views
5

Tôi có một chương trình cuối cùng sẽ tạo ra OutOfMemory. Mã chương trình là:Tạo java dump khi OutOfMemory

public class VeryLargeObject implements Serializable { 
    public static final int SIZE = 1 << 12; 

    public String tag; 
    public int[][] bigOne = new int[SIZE][SIZE]; 

    { 
     // Initialize bigOne 
     for(int i = 0; i < SIZE ; ++i) { 
      for(int j = 0; j < SIZE; ++j) { 
       bigOne[i][j] = (int) (Math.random() * 100); 
      } 
     } 
    } 

    public VeryLargeObject(String tag) { 
     this.tag = tag; 
    } 

    public static void main(String args[]) { 
     VeryLargeObject[] vla = new VeryLargeObject[1 << 12]; 
     for(int i = 0; i < Integer.MAX_VALUE; ++i) { 
      vla[i] = new VeryLargeObject("aa"); 
     } 
    } 
} 

tôi chạy chương trình với các thông số sau: Chương trình

java VeryLargeObject -Xms1024m -Xmx1024m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath="D:\workspace" 

Các thất bại với OutOfMemory nhưng không có tập tin dump được tạo ra. Bạn có ý kiến ​​gì không?

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space 
     at VeryLargeObject.<init>(VeryLargeObject.java:14) 
     at VeryLargeObject.main(VeryLargeObject.java:32) 
+3

Bạn có nghĩa là để nói rằng các tập tin heap didnt tạo ra? Và nó không phải là -XX: -HeapDumpOnOutOfMemoryError thay vì -XX: + HeapDumpOnOutOfMemoryError (thông báo dấu +) – CoolBeans

+0

> Chương trình không thành công với OutOfMemory nhưng bây giờ đổ nếu tập tin được tạo ra. - Đó là một lỗi đánh máy? - ý của bạn là ** bây giờ ** hoặc ** không **? – Ralph

Trả lời

8

Đối khởi động thả các tùy chọn XX và bất kỳ tùy chọn TRƯỚCVeryLargeObject, nếu không bạn chuyển các tham số cho chương trình java chứ không phải JVM

+0

tôi không tìm thấy bất kỳ tài liệu nào cho VeryLargeObject, u có thể cung cấp cho chúng tôi một số liên kết xác thực không. – Vipin

+0

@Vipin, 'VeryLargeObject' là lớp chứa 'chính (String [])'. Nhìn vào câu hỏi, chính nó. – bestsss

+0

tôi đã không nhận thấy nó, bây giờ tôi đã nhận nó :) – Vipin

5

Tôi nghi ngờ jvm không thể ghi vào đường dẫn và không hoạt động âm thầm. Ví dụ, đây phải là tên tệp trong thư mục tồn tại. Nếu bạn có một thư mục D:\workspace nó sẽ thất bại. Nếu bạn có D:\workspace\heap.hprof nó có thể hoạt động. Hãy thử tạo một tệp trống của tên đó trước để xem bạn có thể làm điều này không.

+1

+1 trong 25 giây nhanh hơn tôi – Ralph

+1

các thông số được đặt không đúng – bestsss

14

Vấn đề ở đây là -XX:HeapDumpPath spefies một tệp chứ không phải đường dẫn.

-Xms1024m -Xmx1024m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath="c:\temp\dump2.hprof" 

thêm:

bestsss là đúng quá, vì vậy bạn cần phải sửa chữa cả "lỗi":

java -Xms1024m -Xmx1024m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath="c:\temp\dump2.hprof" VeryLargeObject 
+3

'-XX: HeapDumpPath' cũng có thể là đường dẫn, như sau: '-XX: HeapDumpPath = c: /', sẽ tạo ra các bãi bằng mẫu "java_pid4128 .hprof "trong direcoty gốc của ổ C: –

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