2011-12-01 3 views
1

내 회사에서 작업중인 응용 프로그램의 성능이 향상되었다고 이야기했습니다. 이 응용 프로그램은 XML 파싱을 많이하는 예약 된 작업을 포함합니다. 특정 시간에 이러한 작업이 많이 발생하면 응용 프로그램이 느려지 게됩니다. 스레드 최고점에서 수집 한 스레드 덤프를보고 무엇을 볼 수 있습니까? 문제는 .. 그런 종류의 운동에 익숙하지 않아서 나는 그 중 많은 부분을 이해할 수 없었다. 아래는 쓰레기 더미에서 발췌 한 것입니다.모니터에서 대기중인 스레드

"JMSThread(5)-7635" daemon prio=10 tid=0x000000004fb5b800 nid=0x71e in Object.wait() [0x0000000048de8000] 
    java.lang.Thread.State: TIMED_WAITING (on object monitor) 
    at java.lang.Object.wait(Native Method) 
    - waiting on <0x00002aaabf41fe38> (a java.lang.Object) 
    at EDU.oswego.cs.dl.util.concurrent.BoundedLinkedQueue.poll(BoundedLinkedQueue.java:253) 
    - locked <0x00002aaabf41fe38> (a java.lang.Object) 
    at EDU.oswego.cs.dl.util.concurrent.PooledExecutor.getTask(PooledExecutor.java:723) 
    at org.jboss.util.threadpool.MinPooledExecutor.getTask(MinPooledExecutor.java:106) 
    at EDU.oswego.cs.dl.util.concurrent.PooledExecutor$Worker.run(PooledExecutor.java:747) 
    at java.lang.Thread.run(Thread.java:619) 
    Locked ownable synchronizers: 
    - None 


JMSThread(5)-7634" daemon prio=10 tid=0x000000004ed5c800 nid=0x716 in Object.wait() [0x0000000044eb2000] 
    java.lang.Thread.State: TIMED_WAITING (on object monitor) 
    at java.lang.Object.wait(Native Method) 
    - waiting on <0x00002aaabf41fe38> (a java.lang.Object) 
    at EDU.oswego.cs.dl.util.concurrent.BoundedLinkedQueue.poll(BoundedLinkedQueue.java:253) 
    - locked <0x00002aaabf41fe38> (a java.lang.Object) 
    at EDU.oswego.cs.dl.util.concurrent.PooledExecutor.getTask(PooledExecutor.java:723) 
    at org.jboss.util.threadpool.MinPooledExecutor.getTask(MinPooledExecutor.java:106) 
    at EDU.oswego.cs.dl.util.concurrent.PooledExecutor$Worker.run(PooledExecutor.java:747) 
    at java.lang.Thread.run(Thread.java:619) 
    Locked ownable synchronizers: 
    - None 

동일한 개체에 대해 잠금 및 대기중인 항목이 여러 개 있습니다. 아무도 그들이 무슨 뜻인지 이해할 수 있습니까? 이것은 어떤 문제를 나타 냅니까 ??

답변

5

이 항목은 BoundedLinkedQueue이 비어 있지 않도록 대기중인 스레드가 있음을 나타냅니다. 다시 말해서, 노동자들은 누군가가 그들에게 무언가를 줄 것을 기다리고 있습니다. 응용 프로그램의 아키텍처에 대해 더 많이 알지 못하면 이것이 문제를 나타내는 지 여부를 말할 수 없습니다.

이러한 스레드가 사용 중일 것으로 예상되는 경우 작업자를 대기열에 추가해야하는 사람이 직원을 바쁘게 할만큼 신속하게 추가하지 않는 이유를 조사해야합니다.

+0

이 스레드는 JMS 대기열에서 수신 대기하는 MDB 인스턴스입니까? (예, 내 응용 프로그램이 비동기 처리를 위해 JMS 대기열에 요청을 넣음) – wantobegeek

1

두 가지 가능한 설명이 있습니다. 1. 제작자가 대기열에 물건을 넣을만큼 빠르지 않아서 소비자가 무언가를 얻을 때까지 기다려야합니다. 이는 특정 상황에서 생산자가 천천히 진행됨을 나타냅니다. 2. 대기열에 문제가 있고 생성자가 대기열에서 작업을 가져 오는 동안 잠금을 너무 길게 잡습니다.

두 번째 사항에 대해서는 해결책이있을 수 있습니다. 이 모양에서 BoundedQueue 구현을 사용하여 Object on Sync on을 호출하여 스레드 안전을 강화합니다. concurrency 패키지에 제공된 BlockingQueue 중 하나를 사용할 수 있는지 확인하는 것이 좋습니다 (예 : LinkedBlockingQueue). 이러한 대기열도 제한 될 수 있지만 멀티 스레딩 환경에서 잘 작동하도록 설계되었습니다.

관련 문제