2008-08-16 25 views
12

Tôi đang gọi API Java của nhà cung cấp và trên một số máy chủ, dường như JVM đi vào vòng lặp ưu tiên thấp sau khi đăng nhập vào API (CPU ở mức sử dụng 100%). Ứng dụng tương tự trên các máy chủ khác không thể hiện hành vi này. Điều này xảy ra trên WebSphere và Tomcat. Môi trường là khó khăn để thiết lập vì vậy rất khó để cố gắng làm một cái gì đó giống như lược tả trong Eclipse.Nếu bạn có một ứng dụng Java đang tiêu thụ CPU khi nó không làm bất cứ điều gì, làm thế nào để bạn xác định nó đang làm gì?

Có cách nào để cấu hình (hoặc một số phương pháp kiểm tra khác) một ứng dụng Java hiện có đang chạy trong Tomcat để tìm ra phương thức nào đang được thực thi trong khi nó ở trạng thái spinwait này không? Ứng dụng chỉ thực hiện một phương thức khi nó ở trạng thái này (phương thức của nhà cung cấp). Nhà cung cấp không thể nhân rộng hành vi (tất nhiên).


Cập nhật:

Sử dụng JConsole tôi đã có thể xác định xem ai được chạy và những gì họ đang làm. Tôi mất một vài giờ để tìm ra lý do tại sao nó đã làm nó. Vấn đề cuối cùng là lọ API của nhà cung cấp đang được sử dụng không khớp chính xác với cấu hình cơ sở dữ liệu mà nó đang sử dụng. Nó đã được mặc định để có truy tìm và theo dõi hiệu suất được kích hoạt trên các máy chủ đã có một chút sai khớp trong cấu hình. Tôi đã sử dụng một cái lọ khác và tất cả đều tốt.

Vì vậy, cảm ơn, Joshua, cho câu trả lời của bạn. JConsole cực kỳ dễ cài đặt và sử dụng để theo dõi một ứng dụng hiện có.

@Cringe - Tôi đã thực hiện một số thử nghiệm với một số tùy chọn bạn đã đề xuất. Tôi đã có một số vấn đề với việc thiết lập JProfiler, có vẻ tốt (nhưng đắt tiền). Về sau, tôi đã tiếp tục và thêm vào trình cắm thêm Profiler Eclipse và tôi sẽ xem qua các trình biên dịch nguồn mở khác nhau để so sánh các chức năng.

Trả lời

15

Nếu bạn đang sử dụng Java 5 trở lên, bạn có thể kết nối với ứng dụng của mình bằng cách sử dụng jconsole để xem tất cả các chuỗi đang chạy. jstack cũng sẽ làm một đống đổ rác. Tôi nghĩ rằng điều này sẽ vẫn làm việc ngay cả bên trong một container như Tomcat.

Cả hai công cụ được bao gồm với JDK5 và sau đó (tôi giả sử quá trình này cần phải được ít nhất Java 5, mặc dù tôi có thể là sai)

Cập nhật: Nó cũng đáng chú ý là bắt đầu với JDK 1.6 update 7 bây giờ có một hồ sơ đi kèm được gọi là VisualVM có thể được khởi chạy với 'jvisualvm'. Có vẻ như đây là số java.net project, vì vậy, thông tin bổ sung có thể có sẵn tại trang đó. Tôi đã không sử dụng này được nêu ra nhưng nó có vẻ hữu ích cho phân tích nghiêm trọng hơn.

Hy vọng rằng sẽ giúp

+0

++ Theo ý kiến ​​của tôi, việc chụp nhiều ảnh không chỉ là cách nhanh chóng để tìm ra thời gian, nó cũng là tốt nhất. –

2

Nếu đó là cho mục đích chuyên nghiệp và bạn có một số tiền để chi tiêu, cố gắng để có được bàn tay của bạn trên JProfiler. Nếu bạn chỉ muốn có một số thông tin chi tiết, hãy thử xem Eclipse Profiler Plugin. Tôi đã sử dụng nó nhiều lần, nhưng tôi không biết trạng thái hiện tại.

Dự án mới (?) Từ dự án nhật thực cũng có sẵn: http://www.eclipse.org/tptp/ (Xem this article). Không bao giờ sử dụng nó, vì vậy tôi không thể nói nếu nó là giá trị nỗ lực.

Ngoài ra còn có một danh sách rất tốt của profilers mã nguồn mở có sẵn tại http://www.manageability.org/blog/stuff/open-source-profilers-for-java

6

Đối mặt với cùng một vấn đề tôi đã sử dụng YourKit profiler. Trình tải của nó không kích hoạt trừ khi bạn thực sự kết nối với nó (mặc dù nó mở một cổng để nghe các kết nối).Các profiler chính nó có một tốt đẹp "có được số lượng thời gian dành cho mỗi phương pháp" trong khi làm việc ở chế độ ít gây khó chịu.

Một cách khác là phát hiện tải CPU (qua JNI, vì vậy bạn cần thư viện bên ngoài) trong chuỗi "watchdog" có mức độ ưu tiên cao nhất và bắt đầu ghi nhật ký tất cả luồng khi CPU đủ cao đủ dài thời gian. Bạn có thể thấy this article khai sáng.

+0

Các liên kết rất hữu ích. Tôi ước bạn có thể tăng gấp đôi câu trả lời cho phiếu bầu :) –

0

Vì lợi ích đầy đủ: mặc dù công ty của tôi ngày càng ít tiêu chuẩn hóa trên Eclipse, chúng tôi sử dụng Netbeans (6 trở lên) với số included, free profiler hàng ngày. Nó hoạt động tốt hơn so với các plugin TPTP Eclipse (kiểm tra lần cuối 3 tháng trước) và cho chúng tôi nó loại bỏ bất kỳ nhu cầu cho một profiler thương mại như JProfiler, mà là tuyệt vời, nhưng nhanh chóng trở thành không cần thiết.

0

VisualVM phải là profiler từ netbeans là độc lập. Tôi đã thử TPTP cho eclipse nhưng visualVm có vẻ như là một lựa chọn đẹp hơn nhiều!

1

Sử dụng hồ sơ. Có, họ chi phí tiền bạc, và sử dụng chúng đôi khi có thể là một chút khó xử, nhưng họ cung cấp cho bạn rất nhiều bằng chứng thực sự hơn là phỏng đoán.

Con người thường gặp khó khăn khi đoán xem tắc nghẽn hiệu suất ở đâu. Nó chỉ có vẻ là một cái gì đó bộ não của chúng tôi không được xây dựng để làm rất tốt. Nó có vẻ hiển nhiên, bạn có thể có những ý tưởng tuyệt vời về vấn đề này là gì, nhưng thế giới thực thường hóa ra là làm điều gì đó khác biệt. Và tối ưu hóa sai phần mã có nghĩa là, tốt nhất, rất nhiều công việc cho lợi ích tối thiểu. Thường thì nó làm cho mọi thứ chậm hơn, và đôi khi nó phá vỡ mọi thứ hoàn toàn. Vì vậy, trước khi bạn thực hiện bất kỳ thay đổi nào vì mục đích tối ưu hóa, bạn nên luôn luôn có bằng chứng thực sự từ một công cụ chính xác hoặc khác.

Như đã đề cập, cả JProfiler và YourKit đều khá tốt và không quá đắt. Lần cuối cùng tôi nhìn, cả hai đều có bản demo miễn phí.

2

Nếu JConsole không thể sử dụng bạn có thể

  • báo chí CTRL +BREAK trong môi trường Windows
  • gửi kill -3 <process id> dưới Linux

để có được một bài viết đầy đủ Dump. Điều này không ảnh hưởng đến hiệu suất và luôn có thể được chạy trong sản xuất.

+0

++ Thực hiện một vài lần này, tôi nghĩ, thực sự là cách tốt nhất để chẩn đoán các vấn đề về hiệu năng. Tôi không có vấn đề với các công cụ, miễn là kỹ thuật của họ thực sự hoạt động. Tuy nhiên, tôi đã không nhìn thấy bất kỳ profiler mà thực sự làm điều này. Không có thay thế cho cái nhìn sâu sắc bạn có thể nhận được từ nghiên cứu một số mẫu ngẫu nhiên stack. –

2

JRockit Mission Control Latency Analyzer.

Trình phân tích độ trễ đi kèm với JRockit cho bạn biết JVM đang làm gì khi không làm gì cả. Trong phiên bản mới nhất, bạn có thể thấy thời gian chờ cho:

  • Java chờ/bị chặn/ngủ/chưa sử dụng.
  • File I/O
  • Mạng I/O
  • cấp phát bộ nhớ
  • GC tạm dừng
  • latencies JVM, e.tạo mã g và tải lớp học
  • Đình chỉ chủ đề

Công cụ sẽ cung cấp cho bạn theo dõi ngăn xếp khi độ trễ xảy ra. Bạn có thể xem dữ liệu độ trễ theo nhiều cách khác nhau (dấu vết tổng hợp, dưới dạng biểu đồ, trong biểu đồ chuỗi, v.v.). Công cụ này cũng cho phép bạn xem các chuyển tiếp giữa các luồng, ví dụ khi một luồng thông báo cho một luồng khác.

latency analyzer http://blogs.oracle.com/hirt/WindowsLiveWriter/The.0LatencyAnalyserMigratedfromtheoldBE_7246/latency_graph_2.png

Các chi phí không đáng kể và không giống như nhiều công cụ khác, nó có thể được sử dụng trong một môi trường sản xuất. blog post này cung cấp cho bạn một giới thiệu ngắn gọn và chương trình có thể được tải xuống here.

Tự do sử dụng để phát triển!

+0

Tôi sẽ phải dùng thử. – bruceatk

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