2013-06-20 16 views
6

Chúng tôi có một máy chủ ứng dụng JBoss chạy trong bản cập nhật Java 6 45. Chúng tôi đang chạy vào OutOfMemoryErrors mà chúng tôi có nhiều khả năng giới thiệu bản thân. Chúng tôi muốn phân tích những thứ đó và muốn tạo ra một đống dữ liệu. Điều này không thành công với ngoại lệ bên dưới.Không thể tạo kết xuất đống do ReadVirtual không thành công

Lưu lượng truy cập tìm kiếm của Google và tìm kiếm không giúp được gì nhiều, có ai có ý tưởng về cách lấy một vùng lưu trữ từ máy này không?

Cảm ơn!

Martin

Trường hợp ngoại lệ là:

C:\>"d:\Program Files\Java\bin\"jmap -F "-dump:format=b,file=D:\heapdumps\20130620_085902_heap.dump" 1832 
Attaching to process ID 1832, please wait... 
Debugger attached successfully. 
Server compiler detected. 
JVM version is 20.45-b01 
Dumping heap to D:\heapdumps\20130620_085902_heap.dump ... 
Exception in thread "main" java.lang.reflect.InvocationTargetException 
     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
     at java.lang.reflect.Method.invoke(Method.java:597) 
     at sun.tools.jmap.JMap.runTool(JMap.java:179) 
     at sun.tools.jmap.JMap.main(JMap.java:110) 
Caused by: sun.jvm.hotspot.debugger.DebuggerException: Windbg Error: ReadVirtual failed! 
     at sun.jvm.hotspot.debugger.windbg.WindbgDebuggerLocal.readBytesFromProcess0(Native Method) 
     at sun.jvm.hotspot.debugger.windbg.WindbgDebuggerLocal.readBytesFromProcess(WindbgDebuggerLocal.java:485) 
     at sun.jvm.hotspot.debugger.DebuggerBase$Fetcher.fetchPage(DebuggerBase.java:76) 
     at sun.jvm.hotspot.debugger.PageCache.getPage(PageCache.java:178) 
     at sun.jvm.hotspot.debugger.PageCache.getInt(PageCache.java:96) 
     at sun.jvm.hotspot.debugger.DebuggerBase.readCInteger(DebuggerBase.java:355) 
     at sun.jvm.hotspot.debugger.DebuggerBase.readCompOopAddressValue(DebuggerBase.java:459) 
     at sun.jvm.hotspot.debugger.windbg.WindbgDebuggerLocal.readCompOopHandle(WindbgDebuggerLocal.java:332) 
     at sun.jvm.hotspot.debugger.windbg.WindbgAddress.getCompOopHandleAt(WindbgAddress.java:122) 
     at sun.jvm.hotspot.oops.Oop.getKlassForOopHandle(Oop.java:235) 
     at sun.jvm.hotspot.oops.ObjectHeap.newOop(ObjectHeap.java:378) 
     at sun.jvm.hotspot.oops.ObjectHeap.iterateLiveRegions(ObjectHeap.java:464) 
     at sun.jvm.hotspot.oops.ObjectHeap.iterate(ObjectHeap.java:249) 
     at sun.jvm.hotspot.utilities.AbstractHeapGraphWriter.write(AbstractHeapGraphWriter.java:51) 
     at sun.jvm.hotspot.utilities.HeapHprofBinWriter.write(HeapHprofBinWriter.java:416) 
     at sun.jvm.hotspot.tools.HeapDumper.run(HeapDumper.java:56) 
     at sun.jvm.hotspot.tools.Tool.start(Tool.java:221) 
     at sun.jvm.hotspot.tools.HeapDumper.main(HeapDumper.java:77) 
     ... 6 more 
+0

[lỗi này] (http://bugs.sun.com/view_bug.do ? bug_id = 6987812) có vẻ liên quan, tuy nhiên nó đã được đánh dấu là cố định ... – fge

+0

Vâng, đó là một trong các bài viết mà tôi tìm thấy trong Googling, nhưng nó không phải là một vấn đề trong một JDK 6u45 ... – SunSear

+0

Có lẽ bạn có thể thử, nếu có thể, để tái sản xuất với OpenJDK 6 và mở một lỗi cho chúng nếu nó có thể tái sản xuất? – fge

Trả lời

0

Hmm, tìm thấy câu trả lời trên một trang web khác và điều này dường như để làm việc. Chúng tôi hiện đang yêu cầu JVM để thực hiện một đống đổ khi nó gặp một OutOfMemoryError với các tùy chọn sau:

-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=./java_pid<pid>.hprof 

Như tìm thấy trên:

http://www.oracle.com/technetwork/java/javase/tech/vmoptions-jsp-140102.html

+1

Được rồi, tính năng này hoạt động tốt nếu bạn có quyền truy cập vào các thông số khởi động và nếu quá trình này chưa chạy. Tuy nhiên, tôi cũng đang tìm kiếm một giải pháp "thực sự" để loại bỏ Ngoại lệ. Thật không may, phần mềm được vận chuyển với phiên bản JRE cũ, đó là lý do tại sao việc cập nhật JRE không giúp ích gì. Bạn/ai cũng tìm cách khác? – Dani

0

Vui lòng kiểm tra dưới điểm,

  1. Chạy bảng điều khiển lệnh dưới dạng Quản trị viên
  2. phiên bản JDK (đối với lệnh jmap) và JRE (Môi trường chạy ứng dụng Java) phải giống nhau.
  3. Nếu có ngoại lệ với JDK/JRE 7try cùng với JDK/JRE 8

Thật sự tôi phải đối mặt với một số vấn đề trong jmap với JDK 7, nhưng khi tôi chuyển đến JDK 8, tôi đã có thể tạo ra thành công đống đổ sử dụng dưới lệnh

jmap -dump: file = d: \ heapdump \ myHeapDump.hprof -F

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