2015-05-22 25 views
10

Trong Java 8 Cập nhật 45 tuổi, thêm các tùy chọn này cho java gọi:Điều gì gây ra thời gian quay và đồng bộ hóa lâu dài trong Java?

-XX:+PrintGCApplicationStoppedTime 
-XX:+PrintSafepointStatistics 
-XX:PrintSafepointStatisticsCount=1 

chỉ cho tôi thống kê như thế này:

vmop [threads: total initially_running wait_to_block] [time: spin block sync cleanup vmop] page_trap_count 
3679.229: no vm operation [ 72 1 2 ] [ 6016 0 6016 0 0 ] 1 
2015-05-22T11:25:27.519+0200: Total time for which application threads were stopped: 6.0168551 seconds, Stopping threads took: 6.0164099 seconds 

Vấn đề ở đây là thời gian dài cho Stopping threads. Trong ví dụ này, nó là 6 giây mà đã là một vấn đề cho ứng dụng của chúng tôi, nhưng tôi đã thấy thời gian thậm chí lớn hơn, trong một ví dụ (không có đăng nhập đầy đủ, mặc dù) lên đến gần một phút.

Thao tác VM (ở đây: no vm operation) thay đổi. Tôi cũng đã thấy, ví dụ RevokeBias, G1IncCollectionPause hoặc GCG_Operation. Ngoài ra, page_trap_count dường như không liên quan. Tôi đã thấy các ví dụ mà nó là 0, và những người khác mà nó là 2. Nhất quán, mặc dù, là thời gian luôn luôn được phản ánh trong các giá trị của spinsync.

Tôi đang tìm kiếm giải thích chi tiết về các giá trị thời gian spinsync, nhưng chủ yếu là tôi quan tâm đến lý do tại sao điều này xảy ra và những gì tôi có thể làm. Tôi không biết bất cứ điều gì 'ác' trong cấu hình của chúng tôi. Có rất nhiều lõi chán và bộ nhớ không sử dụng trên máy, chúng tôi đang chạy Java tinh khiết (không có JNI), và chúng tôi không biết về bất kỳ sự đồng bộ hóa quá mức nào trong mã của chúng tôi.

+0

Bạn có thể cung cấp thêm chi tiết về trường hợp sử dụng cụ thể của bạn để mọi người có thể biết cách trợ giúp. –

+0

Trên thực tế, tôi thấy điều này không chỉ với một trong các ứng dụng của chúng tôi, nhưng tôi thấy nó trên bảng. Vì vậy, không thực sự là một trường hợp sử dụng cụ thể. Nếu tôi biết những gì cần tìm, tôi có thể đi săn tìm những điểm tương đồng. Tôi nghi ngờ, tuy nhiên, nhiều người có cùng một vấn đề nhưng vẫn chưa nhận thấy. Việc ghi nhật ký 'Ngừng luồng đã lấy:' điều đó chỉ tôi đến nó là khá mới. – malamut

Trả lời

2

Vấn đề ở đây là ứng dụng của bạn phải mất một thời gian dài để đạt được điểm an toàn. Đầu ra Stopping threads biểu thị thời gian giữa JVM đưa ra yêu cầu an toàn cho đến khi tất cả các luồng đã đạt đến điểm an toàn.

Giá trị sync hiển thị cùng một điều - đó là thời gian cần thiết cho tất cả các chuỗi để đạt được safeponit.

Giá trị spinblock biểu thị thời gian cần cho các chuỗi blockedspinning (mã thực thi) để đến điểm an toàn.

Biết được điều này, chúng tôi có thể kết luận rằng vấn đề của bạn là một sợi đang bận quay và không thể tiếp cận điểm an toàn trong vài giây.

Chính xác tại sao điều này xảy ra khó nói. Một ví dụ, như minh họa trong câu hỏi this và câu trả lời của nó là trình biên dịch JIT có thể biên dịch các vòng nặng mà không cần kiểm tra an toàn.

Bạn có thể thử chạy JVM của mình với các tùy chọn -XX:+SafepointTimeout -XX:SafepointTimeoutDelay=500. Điều đó sẽ hết thời gian chờ đồng bộ hóa sau 500 ms và in thông tin về (các) luồng không đạt được điểm an toàn.

+0

Cảm ơn bạn! Tôi sẽ thử điều này và báo cáo lại. – malamut

+0

Các tùy chọn bổ sung sẽ thực sự cung cấp cho tôi tên chủ đề (không có ngăn xếp, nhưng có vẻ như hiện tại không có cách nào để lấy nó). Có một cái nhìn tại một trong những ứng dụng trưng bày vấn đề, các chủ đề là cùng một phần lớn thời gian. Có vẻ như một số công việc khó khăn để tìm ra vấn đề thực tế, nhưng bây giờ tôi biết bắt đầu từ đâu, và câu hỏi chắc chắn đã được trả lời! – malamut

+0

@malamut Bây giờ bạn đã biết luồng, có thể các bãi luồng thông thường ('jstack ') có thể hữu ích. Họ chờ đợi cho một safepoint quá vì vậy nó có thể được khó khăn để nói cho vấn đề ngay cả với sự giúp đỡ này. Tôi rất muốn nghe những gì vấn đề là một khi bạn đã xác định nó. Đó là một câu hỏi thú vị. –

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