2012-07-05 32 views
9

Tôi có ứng dụng dựa trên Java EE chạy trên tomcat và tôi thấy rằng đột nhiên ứng dụng bị treo sau khi chạy trong vài giờ.Phân tích kết xuất chuỗi của một quá trình java

tôi thu thập các bãi chứa thread từ các ứng dụng ngay trước khi nó bị treo và đặt nó trong TDA để phân tích:

enter image description here

TDA (Chủ đề Dump Analyzer) đưa ra thông điệp sau cho màn hình trên:

A lot of threads are waiting for this monitor to become available again. 
This might indicate a congestion. You also should analyze other locks 
blocked by threads waiting for this monitor as there might be much more 
threads waiting for it. 

Và đây là stacktrace của thread nêu trên:

"MY_THREAD" prio=10 tid=0x00007f97f1918800 nid=0x776a 
      waiting for monitor entry [0x00007f9819560000] 
    java.lang.Thread.State: BLOCKED (on object monitor) 
    at java.util.Hashtable.get(Hashtable.java:356) 
    - locked <0x0000000680038b68> (a java.util.Properties) 
    at java.util.Properties.getProperty(Properties.java:951) 
    at java.lang.System.getProperty(System.java:709) 
    at com.MyClass.myMethod(MyClass.java:344) 

Tôi muốn biết trạng thái "waiting for monitor entry" có nghĩa là gì? Và cũng sẽ đánh giá cao bất kỳ con trỏ nào để giúp tôi gỡ lỗi vấn đề này.

+4

tôi sẽ bộ nhớ cache tra cứu các thuộc tính hệ thống hơn là gọi chúng lặp đi lặp lại như thế này. Bạn không cần phải gọi System.getProperty() nhiều hơn khoảng một chục lần trong suốt vòng đời của ứng dụng. tức là bạn nên mã hóa nó để không phải là cổ chai. –

+0

hmm .. điểm tốt Peter! – peakit

Trả lời

1

Màn hình = đồng bộ hóa. Bạn có rất nhiều chủ đề cố gắng để có được khóa trên cùng một đối tượng.

Có lẽ bạn nên chuyển từ việc sử dụng một Hashtable và sử dụng một HashMap

+0

Nếu bạn thấy tôi không sử dụng trực tiếp 'Hashtable'. Nó đến từ cuộc gọi của tôi tới 'System.getProperty()'. Có một phiên bản không chặn của 'System.getProperty()'? Cảm ơn! – peakit

1

này có nghĩa là chủ đề của bạn đang cố gắng để thiết lập một khóa (trên Hashtable), nhưng một số chủ đề khác đã được truy cập vào nó và đã thiết lập một khóa . Vì vậy, nó chờ đợi cho khóa để phát hành. Kiểm tra xem các chủ đề khác của bạn đang làm gì. Đặc biệt là chuỗi với tid = "0x00007f9819560000"

+0

Điều thú vị là tôi KHÔNG thấy bất kỳ chuỗi nào có 'tid = 0x00007f9819560000' trong tệp kết xuất chuỗi. Bất kỳ ý tưởng? – peakit

+0

Mmmmh, có thể là khóa bảng giám sát VM rồi. Nhìn thấy mã, nó sẽ khó khăn. Về cơ bản, Hashtable đang được cạnh tranh giữa hai luồng. Một tùy chọn có thể là thay thế Hashtable bằng HashMap (vì HashMap không phải là luồng an toàn). Tôi biết bạn đang sử dụng Thuộc tính nhưng chỉ cần sao chép vào bản đồ và sử dụng bản đồ sau đó. Vì vậy, bạn sẽ thấy nó thổi lên trên ganh đua (ConcurrentModificationException có lẽ), hoặc nó bắt đầu làm việc vì khóa thậm chí không cần thiết. – mprivat

5

Một trong các chủ đề của bạn có được một đối tượng màn hình (một khóa độc quyền trên một đối tượng). Điều đó có nghĩa là thread đang thực thi mã được đồng bộ hóa và vì bất kỳ lý do gì bị kẹt ở đó, có thể chờ các luồng khác. Nhưng các chủ đề khác không thể tiếp tục thực hiện vì chúng gặp phải một khối đồng bộ và yêu cầu khóa (đối tượng giám sát), tuy nhiên chúng không thể nhận được nó cho đến khi nó được giải phóng bởi luồng khác. Vì vậy ... có lẽ bế tắc.

2

Hãy tìm kiếm chuỗi này từ toàn bộ chủ đề đổ

- khóa < 0x00007f9819560000>

Nếu bạn có thể tìm thấy nó, thread là bế tắc với chủ đề "tid = 0x00007f97f1918800"

+0

có bobon, tôi đã tìm kiếm trong toàn bộ chuỗi kết xuất cho chuỗi này và không thể tìm thấy bất kỳ tham chiếu nào khác cho id này ngoài chuỗi được đánh dấu trong câu hỏi. – peakit

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