2011-11-29 17 views
8

Tôi có một vùng lưu trữ 1 GB từ một quá trình java đã hết dung lượng lưu trữ. Tôi đã tải heap lên jvisualm đi kèm với bản phân phối java6. Tôi bắt đầu quá trình "tính toán kích thước giữ lại" khoảng 16 giờ trước và nó vẫn đang chạy. Phải mất bao lâu để chạy các kích thước tính toán được giữ lại cho 20 đối tượng trên cùng trên một vùng nhớ 1GB? Tôi có nên mong đợi nó sẽ kết thúc?Bao lâu để chạy kích thước tính toán được giữ lại trong máy ảo trực quan cho một vùng nhớ 1GB?

+0

Tôi không có ý tưởng về những gì bạn đang nói về (Tôi có ít kinh nghiệm với Java), nhưng logic của tôi nói với tôi rằng nếu bạn không chạy trên 1 GHz với 1 GB RAM (hoặc ít hơn) hệ thống, 16 giờ là waaay quá nhiều ... – ComputerSaysNo

+0

Chỉ vì tò mò, đã làm nó hoàn thành? Mất bao lâu? Nếu nó không kết thúc, thì lần chạy thứ 2 có thành công không? – uhm

+0

Nó chưa bao giờ kết thúc. Tôi đã kết thúc quá trình tải xuống bản dùng thử YourKit và hoàn tất quá trình tương tự trong khoảng 20 phút. – Joe

Trả lời

1

Tôi đã có một đống 600MB chỉ mất 900 phút CPU để tính toán kích thước được giữ lại. Đó là 15 giờ. Tôi sẽ giả sử nó rất liên quan đến những gì trên đống, vì vậy tôi sẽ không ngoại suy đến đống của bạn (cũng bạn chỉ ra nó đã không kết thúc;), nhưng đó là một điểm dữ liệu.

4

Dường như nó cũng mất thời gian trên máy tính của tôi, nhưng tôi nhận thấy từ taskmanager rằng không có gì xảy ra nữa (uage CPU thấp, Đĩa I/O). Lý do là mặc dù chỉ báo tiến trình tiếp tục hiển thị một hình ảnh động nhưng hành động này đã bị hủy bỏ âm thầm theo tệp nhật ký.

Để mở nhật ký tôi đã sử dụng các bước sau:

  • Bấm Trợ giúp
  • Bấm Về
  • Bấm logfile

này chỉ cho tôi ở dưới cùng của nhật ký:

SEVERE [org.openide.util.RequestProcessor] 
java.lang.OutOfMemoryError: GC overhead limit exceeded 
    at java.util.HashMap.newNode(HashMap.java:1734) 
    at java.util.HashMap.putVal(HashMap.java:630) 
    at java.util.HashMap.put(HashMap.java:611) 
    at java.util.HashSet.add(HashSet.java:219) 
    at org.netbeans.lib.profiler.heap.DominatorTree.intersect(DominatorTree.java:279) 
    at org.netbeans.lib.profiler.heap.DominatorTree.computeOneLevel(DominatorTree.java:114) 
    at org.netbeans.lib.profiler.heap.DominatorTree.computeDominators(DominatorTree.java:64) 
    at org.netbeans.lib.profiler.heap.HprofHeap.computeRetainedSize(HprofHeap.java:537) 
    at org.netbeans.lib.profiler.heap.HprofHeap.computeRetainedSizeByClass(HprofHeap.java:594) 
    at org.netbeans.lib.profiler.heap.ClassDump.getRetainedSizeByClass(ClassDump.java:102) 
    at org.netbeans.modules.profiler.heapwalk.HeapFragmentWalker.computeRetainedSizes(HeapFragmentWalker.java:100) 
    at org.netbeans.modules.profiler.heapwalk.ClassPresenterPanel$1$1.run(ClassPresenterPanel.java:187) 
    at org.openide.util.RequestProcessor$Task.run(RequestProcessor.java:1393) 
[catch] at org.openide.util.RequestProcessor$Processor.run(RequestProcessor.java:2003) 

Theo mặc định, 64 của tôi bit Java VM Heapsize sẽ bị giới hạn ở 25% bộ nhớ máy tính của tôi (hoặc thậm chí là giới hạn nội trang VisualVM thấp hơn nhiều). Để giải quyết vấn đề này cho nỗ lực tiếp theo của tôi, tôi wil thử lại bắt đầu VisualVM như thế này:

jvisualvm.exe -J-Xmx16g 

Sau này các bản ghi cho thấy lúc khởi động:

Heap memory usage: initial 24,0MB maximum 14563,6MB 
+1

Tôi thấy rằng jvisualvm đã bỏ qua cờ dòng lệnh mx từ dòng lệnh, vì nó đã được kéo trong một giá trị mặc định của -Xmx256m từ% JDK_HOME% \ lib \ visualvm \ etc \ visualvm.conf. Xem https://stackoverflow.com/questions/9570921/how-do-i-provide-jvm-arguments-to-visualvm –