2011-08-26 15 views
6

Tôi muốn lọc những lớp nào đang được định dạng bằng cpu trong Java VisualVm (Phiên bản 1.7.0 b110325). Đối với điều này, tôi đã thử theo Profiler -> Settings -> CPU-Settings để thiết lập "Profile chỉ lớp học" để gói của tôi theo thử nghiệm, mà không có hiệu lực. Sau đó, tôi đã cố gắng loại bỏ tất cả các lớp học java. * Và sun. * Bằng cách đặt chúng trong "Không phải lớp hồ sơ", cũng không có tác dụng.Có các lớp lọc cho công việc định dạng cpu trong Java VisualVM không?

Đây có phải đơn giản là lỗi không? Hay tôi đang thiếu một cái gì đó? Có cách giải quyết nào không? Ý tôi là khác hơn:

  • trả tiền cho một hồ sơ tốt hơn
  • làm lấy mẫu bằng tay (xem One could use a profiler, but why not just halt the program?)
  • chuyển sang xem Gọi Tree, đó là không tốt vì chỉ có quan điểm Profiler mang lại cho tôi tỷ lệ phần trăm của CPU tiêu thụ cho mỗi phương pháp.

Tôi muốn thực hiện điều này chủ yếu để lấy tỷ lệ phần trăm chính xác của CPU đã tiêu thụ cho mỗi phương pháp. Đối với điều này, tôi cần phải loại bỏ các phép đo gây phiền nhiễu, ví dụ: cho sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run() (khoảng 70%). Nhiều người dùng dường như gặp sự cố này, xem ví dụ:

+0

Mục đích của bạn là làm cho mã chạy nhanh nhất có thể? hoặc chỉ để có được một số tỷ lệ phần trăm, bất kể ý nghĩa của chúng là gì? "Thời gian" như thường được sử dụng, rất mơ hồ. –

+0

Vâng, mục tiêu chính của tôi là làm cho mã chạy nhanh hơn. Tôi cũng muốn có ước tính về số lượng mã nên thay đổi. Vì vậy, tôi muốn có được một cái nhìn tổng quát về tất cả các điểm nóng và mức độ nghiêm trọng của chúng. Tôi nghĩ rằng kết quả của VisualVm sẽ được chấp nhận cho điều này mặc dù sử dụng thời gian tường - nếu chỉ có vài mặt trời. * Và java. * Lớp học sẽ không mess up tất cả các số liệu thống kê. – DaveFar

Trả lời

10

Lý do bạn thấy sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run() trong tiểu sử là bạn đã chọn tùy chọn Tiểu sử mới Runnables được chọn.

Ngoài ra, nếu bạn chụp nhanh phiên lược tả, bạn có thể xem toàn bộ callstack cho bất kỳ phương pháp điểm nóng nào - theo cách này bạn có thể điều hướng từ phương pháp run() xuống phương pháp logic ứng dụng của riêng mình. được tạo bởi tùy chọn Cấu hình mới Runnables.

+0

Cảm ơn JB (+5), tôi sẽ kiểm tra tùy chọn đó vào thứ hai - nghe như giải pháp :) Tôi đã chụp nhanh, cho tôi cái nhìn Call Tree, điều này không tốt vì chỉ có khung nhìn Profiler mang lại cho tôi tỷ lệ phần trăm tiêu thụ CPU cho mỗi phương pháp. Bởi vì đệ quy, callstack của tôi là quá phức tạp để có được thông tin hiệu suất hợp lý từ nó. – DaveFar

+0

Cảm ơn JB, vô hiệu hóa tùy chọn "Hồ sơ mới Runnables" đã làm các trick. – DaveFar

+2

Vui lòng lưu ý các hậu quả của việc vô hiệu hóa tùy chọn nói trên. Với tùy chọn được bật, bạn sẽ nhận được thông tin về tất cả các chủ đề/runnables mới được bắt đầu tự động. Với tùy chọn đó được tắt, bạn phải chắc chắn cung cấp danh sách đầy đủ các phương pháp gốc. –

0

OK, vì mục tiêu của bạn là làm cho mã chạy nhanh nhất có thể, hãy để tôi đề xuất cách thực hiện. Tôi không có chuyên gia về VisualVM, nhưng tôi có thể cho bạn biết những gì hoạt động. (Chỉ có một vài profilers thực sự cho bạn biết những gì bạn cần biết, đó là - mà dòng mã của bạn đang ở trên ngăn xếp một phần lành mạnh của đồng hồ treo tường thời gian.)

Đo duy nhất tôi từng bận tâm là một số đồng hồ bấm giờ trên toàn bộ thời gian, hoặc cách khác, nếu mã có một cái gì đó giống như một tốc độ khung hình, số khung hình mỗi giây. Tôi không cần bất kỳ loại phân tích chính xác nào nữa, bởi vì nó là một đầu mối từ xa nhất cho những gì đang lãng phí thời gian (và thường xuyên không liên quan), khi có một cách rất trực tiếp để định vị nó.

Nếu bạn không muốn làm random-pausing, tùy thuộc vào bạn, nhưng nó đã được chứng minh là hoạt động và here's an example of a 43x speedup.

Về cơ bản, ý tưởng là bạn nhận được một số lượng mẫu nhỏ (như 10), được lấy theo thời gian đồng hồ treo tường ngẫu nhiên. Mỗi mẫu bao gồm (hiển nhiên) một danh sách các trang cuộc gọi, và có thể là một trang không gọi ở cuối. (Nếu mẫu là trong I/O hoặc ngủ, nó sẽ kết thúc trong cuộc gọi hệ thống, mà chỉ là tốt. Đó là những gì bạn muốn biết.)

Nếu có một cách để tăng tốc mã của bạn (và gần như chắc chắn là), bạn sẽ thấy nó như là một dòng mã xuất hiện trên ít nhất một trong các mẫu ngăn xếp. Xác suất nó sẽ xuất hiện trên bất kỳ một mẫu nào giống hệt với phần thời gian mà nó sử dụng. Vì vậy, nếu có trang web cuộc gọi hoặc dòng mã khác sử dụng một khoảng thời gian lành mạnh và bạn có thể tránh thực hiện nó, thời gian tổng thể sẽ giảm theo phần đó.

Tôi không biết tất cả các hồ sơ, nhưng tôi biết rằng có thể cho bạn biết đó là Zoom. Những người khác có thể làm điều đó. Chúng có thể nhiều hơn, nhưng chúng không hoạt động nhanh hơn hoặc tốt hơn phương pháp thủ công khi mục đích của bạn là tối đa hóa hiệu suất.

+0

Xin lưu ý rằng trong JVM nó có thể xảy ra rằng một phương pháp sẽ không bao giờ xuất hiện trên dấu vết ngăn xếp ngay cả khi được thực hiện khá thường xuyên. Lý do cho việc này là cách JVM cho phép lấy dấu vết ngăn xếp - một dấu vết ngăn xếp của một luồng chỉ có thể được thực hiện trên trạm kiểm soát mà JIT có thể không được chèn vào mỗi phương thức duy nhất. –

+0

Bạn hoàn toàn là "nhà truyền giáo tạm dừng ngẫu nhiên", Mike :) Cảm ơn mọi người đã trả lời, tôi sẽ upvoted nếu tôi không đưa ra một liên kết đến bạn mô tả kỹ thuật đó. Tôi đã thử nó, nhưng vì đệ quy, callstack khá phức tạp. Chế độ xem tiểu sử sẽ chia nhỏ nó thành các phương thức có phần trăm thời gian chạy, vì vậy các điểm nóng dễ nhìn hơn nhiều. Thứ hai, chế độ xem tiểu sử hiển thị tất cả các điểm nóng và mức độ nghiêm trọng của chúng. Điều này cho một cái nhìn tổng quan tốt về những gì và bao nhiêu điều chỉnh đã được thực hiện. Bạn có đồng ý không? – DaveFar

+0

@DaveBall: Nó không phải về các điểm nóng và đo lường. Có ngăn xếp cuộc gọi là phức tạp, và có đệ quy. Mặc dù vậy, hãy xem bạn có thể chọn tất cả và sao chép nó ra một trình soạn thảo hay không. Sau đó nghiên cứu nó và xem bạn có thể trả lời câu hỏi đơn giản không "Nó đang trong quá trình làm gì vào lúc đó và tại sao nó lại làm nó?" Sau đó, làm điều đó một lần nữa chỉ một vài lần. Điều đó sẽ cho bạn thấy lý do tại sao nó dành thời gian, và nó sẽ cho bạn thấy những gì bạn nên tập trung vào. Đừng bị bò bởi đệ quy hoặc một chồng phức tạp. Bất kỳ dòng mã bạn nhìn thấy trên 2 mẫu trong số 3 là chi phí cho bạn (2 + 1)/(3 + 2) = 60% trung bình. Săn bắn tốt. –

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