2010-05-11 30 views
7

Tại nơi làm việc chúng tôi thấy rằng trên một số trường hợp (đặc biệt là những người chậm), chúng tôi có một hành vi khác nhau, có được khi khởi động lại.Chúng ta có thể xem các đối tượng trong bộ nhớ JVM không?

Chúng tôi đoán bộ nhớ cache không được khởi tạo chính xác hoặc có thể là sự cố đồng thời ... Dù sao nó không thể sinh sản trong bất kỳ ENV nào khác ngoài sản xuất.

Chúng tôi thực sự không có logger để kích hoạt ... nó là một thành phần cũ ...

Vì vậy tôi muốn biết nếu có các công cụ có thể giúp chúng ta nhìn thấy các objets khác nhau hiện diện trong bộ nhớ JVM để kiểm tra nội dung của bộ nhớ cache ...

Cảm ơn bạn!

Edit:

Tôi không có quyền truy cập vào các máy chủ sản xuất trực tiếp, máy chủ ứng dụng của chúng tôi là WebLogic 10, tôi không có một con trỏ đến đối tượng, nhưng tôi biết loại đối tượng bộ nhớ cache ..

Edit2:.

máy chủ của chúng tôi đang chạy trên jre 1.5, là nó có thể sử dụng jmap? không thể tìm thấy nó trong một jdk5 :( Ngoài ra, gỡ lỗi từ xa có thể là tốt đẹp, nhưng chúng ta không thể vì những lý do an ninh ...

Edit3:

Trên thực tế jhat + VisualVM là ok đối với tôi, tôi tìm thấy đối tượng của tôi trong dump nhưng tôi không thể đọc hashmap (đối tượng chứa khoảng 60000 mặt hàng) đúng cách ... Có một công cụ để đọc một concurrenthashmap một cách thân thiện? i cần phải tìm giá trị của một khóa (hoặc sự tồn tại của nó trong bản đồ) mà không cần duyệt các bản ghi 60k theo cách thủ công Thực ra tôi đã đọc trên diễn đàn MAT eclipse rằng nó cũng không thể với ...

Chỉnh sửa4: Sau một số trải nghiệm tôi thực sự thích các công cụ như VisualVM. Cũng sử dụng YourKit. Có một số tính năng hữu ích như OQL để tìm các trường hợp phù hợp bạn cần xem ...

+0

Tôi không biết cách để truy cập đối tượng mà không có một số loại tham chiếu con trỏ/biến. – aperkins

Trả lời

6

Điều này về cơ bản là mở rộng những gì Will nói. Tôi đã đạt được thành công lớn nhờ quản trị viên của chúng tôi thực hiện một loạt các hệ thống sản xuất của chúng tôi, mặc dù với thông báo trước rằng máy chủ cụ thể bạn đang bán phá giá sẽ không đáp ứng cho đến khi kết xuất hoàn tất. Sau đó lấy tệp đó và sử dụng plugin Eclipse MAT để xem nó. Nếu bạn không thích Eclipse, Netbeans và plugin VisualVM đơn giản cũng có thể được sử dụng. Điều này có thể tạo ra một số tập tin lớn mặc dù, bạn có thể cần phải chạy trên một hệ thống 64 bit.

+1

+1 cho VisualVM – ykaganovich

+0

+1 cho Eclipse MAT - imo trình hiển thị heap mạnh mẽ nhất (miễn phí) trên mạng. Rất khuyến khích và có các plugin tuyệt vời để xem xét heap theo những cách thú vị (ví dụ: bộ sưu tập điền%)! –

3

Bạn có quyền truy cập vào tay cầm/con trỏ tới các đối tượng không? Nếu có, bạn có thể kích hoạt nó trong chế độ gỡ lỗi và xem nó trong một trình gỡ rối như Eclipse. Điều này sẽ cho phép bạn kiểm tra các biến và tương tự.

Ngoài ra, bạn có thể viết một nhật ký nhỏ phản ánh qua lớp học và ghi lại những gì đang diễn ra. Tất cả điều này giả định bạn có một vị trí nơi bạn có thể bắt đầu bước vào mã, hoặc có thể nhận được một tham chiếu đến các giá trị được lưu trữ.


chỉnh sửa: Như tôi đã lưu ý trong nhận xét của mình, tôi không biết cách truy cập vào đối tượng mà không có tham chiếu hoặc liên kết tham chiếu nào đó. Ví dụ, đối tượng có được đóng gói trong một đối tượng khác không?Nếu vậy, bạn có thể làm một cái gì đó như sau:

Class<?> objectClass = myPointer.getClass(); 
Field[] objectFields = objectClass.getDeclaredFields(); 
for (Field field : objectFields) { 
    field.setAccessible(true); 
    //Or whatever you would need to do to get the information you need 
    System.out.println(field.get(myPointer).toString()); 
} 

Bạn cũng có thể làm điều gì đó như:

Field targetField = objectClass.getDeclaredField("myFieldName"); 
targetField.setAccessible(true); 
MyOldObjectType target = (MyOldObjectType)targetField.get(myPointer); 
//do whatever you need to do here 

Lưu ý rằng tất cả các phản ánh phương pháp ném ngoại lệ, vì vậy bạn sẽ cần phải xử lý những người như thích hợp. Ngoài ra, setAccessible(true) có nghĩa là bạn có thể truy cập các trường và phương thức riêng tư trên đối tượng. Đây là EXTREMELY DANGEROUS - Chỉ sử dụng nó nếu bạn hoàn toàn phải làm vậy.

+0

Tôi không nghĩ rằng một trình gỡ lỗi giống như hiện tại trong Eclipse là một lựa chọn bởi vì "nó không thể sinh sản trong bất kỳ env nào khác ngoài sản xuất." –

+1

@Andrew Hubbs: Tôi đã đích thân sử dụng gỡ lỗi Eclipse trong môi trường sản xuất - bạn phải khởi động hệ thống ở chế độ gỡ lỗi và thiết lập nó thành kết nối từ xa. Có những lựa chọn ở đó - nó không phải là dễ dàng, nhưng nó là có thể. – aperkins

+0

máy chủ của chúng tôi không ở trong cùng một thành phố, tôi không biết liệu họ có thể bắt đầu một weblog sản xuất ở chế độ gỡ lỗi hay không và không biết liệu họ có cho tôi quyền truy cập thông qua đường hầm hay không ... –

4

Đó là khá dễ dàng để chạy jmap để đổ một COUNT trong tổng số các trường hợp đối tượng, nhưng tôi không biết nếu đó là những gì bạn thực sự quan tâm.

Bạn cũng có thể sử dụng jmap để làm một đống đổ của toàn bộ đống, và với điều đó (và jhat), bạn có thể thấy đối tượng RELATIONSHIPs (tức là đối tượng trỏ đến cái gì), nhưng không nhất thiết phải đối tượng CONTENTS.

Chắc chắn dữ liệu có trong vùng lưu trữ, không hiển thị "nhấp chuột".

Một số profilers chuyên nghiệp mà tôi cho rằng sẽ cho phép bạn quan sát các đối tượng trong một đống lưu trữ.

Nếu bạn muốn thêm một số thiết bị cụ thể vào ứng dụng để cung cấp nội dung cụ thể bạn đang tìm kiếm, được kích hoạt bởi mã tùy chỉnh, JMX hoặc bất kỳ thứ gì.

+0

+1 - Tôi không biết về vùng heap. Điều đó sẽ thực sự hữu ích một hoặc hai tháng trước cho tôi :) – aperkins

+0

Chúng tôi sử dụng java 1.5 Có thể sử dụng jmap trên 1,5 jre không? Tôi đã tìm thấy jmap chỉ trên jdk6 và nó không thể làm việc với jre địa phương của tôi 1,5 ... –

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