2011-08-17 37 views
31

Trong cấu hình Java, có vẻ như tất cả các con đường (miễn phí) ngày nay dẫn đến lược tả VisualVM đi kèm với JDK6. Nó trông giống như một chương trình tốt, và tất cả mọi người chào hỏi làm thế nào bạn có thể "đính kèm nó vào một quá trình chạy" như là một tính năng chính. Vấn đề là, dường như là cách duy nhất để sử dụng nó trên quy trình địa phương. Tôi muốn có thể bắt đầu chương trình của tôi trong hồ sơ và theo dõi toàn bộ thực thi của mình.Cấu hình toàn bộ chương trình Java Thực thi trong VisualVM

Tôi đã thử sử dụng tùy chọn -Xrunjdwp được mô tả trong how to profile application startup with visualvm, nhưng giữa hai phương thức vận tải (bộ nhớ chia sẻ và máy chủ), không hữu ích cho tôi. VisualVM dường như không có bất kỳ tích hợp với trước đây, và VisualVM từ chối kết nối với localhost hoặc 127.0.0.1, vì vậy sau này là không tốt. Tôi cũng đã thử chèn một đơn giản của System.in vào chương trình của tôi để chèn một tạm dừng trong thực hiện, nhưng trong trường hợp đó VisualVM khối cho đến khi đọc xong, và không cho phép bạn bắt đầu hồ sơ cho đến khi sau khi thực hiện đang được tiến hành. Tôi cũng đã thử xem xét the Eclipse plugin nhưng trang web có đầy đủ các liên kết đã chết và trình khởi chạy chỉ gặp sự cố NullPointerException khi tôi cố gắng sử dụng nó (điều này có thể không còn chính xác nữa).

Đến từ C, điều này dường như không phải là một nhiệm vụ đặc biệt khó khăn đối với tôi. Tôi chỉ thiếu một cái gì đó hoặc đây thực sự là một yêu cầu không thể? Tôi mở cho bất kỳ loại đề xuất nào, bao gồm việc sử dụng một trình lược tả khác (cũng miễn phí) và tôi không phản đối dòng lệnh.

+0

Đi theo câu hỏi mà bạn đã đề cập đến, bạn đã thử 'suspend = y', thay vì đăng 'suspend = n'? Bạn sẽ không cần phải đọc từ 'System.in' nếu đó là trường hợp. –

+0

Có, nhưng không quan trọng. Tôi không thấy bất kỳ cách nào để kết nối chương trình với VisualVM, bất kể tham số 'suspend'. – kbolino

+0

Nên có một "đúng" ở đâu đó. Tất nhiên, VisualVM có thể xem quy trình. Vấn đề là nó không thể cấu hình nó. – kbolino

Trả lời

19

Cân nhắc sử dụng HPROF và mở tệp dữ liệu bằng công cụ như HPjmeter - hoặc chỉ đọc tệp văn bản kết quả trong trình chỉnh sửa yêu thích của bạn.

Command used: javac -J-agentlib:hprof=heap=sites Hello.java 

SITES BEGIN (ordered by live bytes) Fri Oct 22 11:52:24 2004 
      percent   live   alloc'ed stack class rank self accum  bytes objs  bytes objs trace name 
    1 44.73% 44.73% 1161280 14516 1161280 14516 302032 java.util.zip.ZipEntry 
    2 8.95% 53.67% 232256 14516 232256 14516 302033 com.sun.tools.javac.util.List 
    3 5.06% 58.74% 131504 2 131504  2 301029 com.sun.tools.javac.util.Name[] 
    4 5.05% 63.79% 131088 1 131088  1 301030 byte[] 
    5 5.05% 68.84% 131072 1 131072  1 301710 byte[] 

HPROF có khả năng trình bày sử dụng CPU, thống kê phân bổ heap, và theo dõi hồ sơ tranh chấp. Ngoài ra, nó cũng có thể báo cáo bãi chứa đầy đủ và trạng thái của tất cả các màn hình và chủ đề trong máy ảo Java .

+0

Cảm ơn, đó là chính xác những gì tôi đang tìm kiếm! – kbolino

+0

Bất cứ lúc nào, rất vui được giúp đỡ. –

11

Cách tốt nhất để giải quyết vấn đề này mà không sửa đổi ứng dụng của bạn, là không sử dụng VisualVM. Theo như các tùy chọn miễn phí khác có liên quan, bạn có thể sử dụng Eclipse TPTP hoặc Netbeans profiler hoặc bất kỳ thứ gì đi kèm với IDE của bạn.

Nếu bạn có thể sửa đổi ứng dụng của mình, để tạm dừng trạng thái của nó trong khi bạn thiết lập trình lược tả trong VisualVM, bạn hoàn toàn có thể làm như vậy, bằng cách sử dụng plugin Eclipse VisualVM. Tôi không chắc chắn lý do tại sao bạn đang nhận được NullPointerException, vì nó xuất hiện để làm việc trên máy trạm của tôi. Bạn sẽ cần định cấu hình plugin bằng cách cung cấp đường dẫn đến mã nhị phân jvisualvm và đường dẫn của JDK; điều này được thực hiện bằng cách truy cập hộp thoại cấu hình VisualVM tại Windows -> Preferences -> Run/Debug -> Launching -> VisualVM Configuration (như thể hiện trong hình bên dưới).

Eclipse VisualVM plugin

Bạn cũng sẽ cần phải cấu hình ứng dụng của bạn để bắt đầu với các phóng VisualVM, thay vì mặc định JDT launcher.

Tất cả các lần khởi chạy ứng dụng từ Eclipse, bây giờ sẽ dẫn đến việc VisualVM theo dõi JVM cục bộ mới tự động, miễn là VisualVM đã chạy. Nếu bạn không có VisualVM đang chạy, thì plugin sẽ khởi chạy VisualVM, nhưng nó cũng sẽ tiếp tục chạy ứng dụng.

Suy ra từ câu trước, rõ ràng là ứng dụng tạm dừng trong phương thức main() trước khi thực hiện bất kỳ quá trình xử lý nào là khá hữu ích. Tuy nhiên, đó không phải là lý do chính để tạm ngưng ứng dụng. Rõ ràng, VisualVM hoặc plugin Eclipse của nó không cho phép tự động khởi động CPU hoặc bộ nhớ profilers. Điều này có nghĩa là các trình lược tả này sẽ phải được bắt đầu bằng tay, do đó cần phải tạm dừng ứng dụng. Ngoài ra, cần lưu ý rằng việc thêm cờ: -Xrunjdwp:transport=dt_socket,address=8000,server=y,suspend=y để khởi động JVM sẽ không giúp bạn trong trường hợp VisualVM, để tạm ngưng ứng dụng và thiết lập các trình biên dịch.Những lá cờ này có ý nghĩa để giúp bạn trong trường hợp các trình biên dịch có thể thực sự kết nối với cổng mở của JVM, sử dụng giao thức JDWP. VisualVM không sử dụng giao thức này và do đó bạn sẽ phải kết nối với ứng dụng bằng cách sử dụng JDB hoặc trình gỡ lỗi từ xa; nhưng điều đó sẽ không giải quyết được vấn đề liên quan đến cấu hình profiler, như VisualVM (ít nhất là của Java 6 cập nhật 26) không cho phép bạn cấu hình các profilers trên một quá trình bị đình chỉ vì nó chỉ đơn giản là không hiển thị tab Profiler.

+0

Tôi không biết vấn đề là gì vì nó thậm chí không cho tôi một dấu vết ngăn xếp cho NPE. Trong mọi trường hợp, tôi đã tìm kiếm một giải pháp tự động hơn, và tiếc là VisualVM dường như không có tác dụng. – kbolino

+1

Không định cấu hình plugin (đúng cách) sẽ dẫn đến khả năng tái tạo 'NullPointerException'. Trên hệ thống của tôi, với thiết lập 'JDK Home' và 'VisualVM Executable' trống, bất kỳ cấu hình chạy nào sử dụng trình khởi chạy VisualVm sẽ thất bại. –

3

Lời khuyên với -Xrunjdwp không chính xác. Nó chỉ cho phép trình gỡ rối và với suspend=y nó chờ trình gỡ lỗi đính kèm. Vì VisualVM không phải là trình gỡ rối, nó không giúp bạn. Tuy nhiên việc chèn System.in hoặc Thread.sleep() sẽ tạm dừng khởi động và cho phép VisualVM đính kèm vào ứng dụng của bạn. Hãy nhớ đọc Profiling with VisualVM 1Profiling with VisualVM 2 để hiểu rõ hơn về cài đặt hồ sơ. Cũng lưu ý rằng thay vì lược tả, bạn có thể sử dụng tab 'Sampler' trong VisualVM, phù hợp hơn cho việc lược tả toàn bộ việc thực thi chương trình java. Như đã đề cập, bạn cũng có thể sử dụng NetBeans Profiler, hỗ trợ trực tiếp hồ sơ của việc khởi động ứng dụng.

3

Điều này hiện có thể thực hiện với startup profiler plugin thành VisualVM.

+1

Startup Profiler cho biết nó chạy với VisualVM 1.3.6 và không thể tải với VisualVM 1.8.0. Vì vậy, ít nhất với các phiên bản hiện tại, điều này không hoạt động. –

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