2011-10-11 3 views
0

나는 멀티 스레딩이 사용되는 프로젝트에 참여하고있다. 모든 전화에 대해 약 4-5 개의 스레드가 생성됩니다 (이 시스템은 택시 콜 센터 용으로 개발되었습니다). 여기서 문제는 JMS 큐의 정보를 읽은 후 새로운 스레드가 발생하지 않아야한다는 것입니다. 이 문제는 임의로 발생합니다. StackOverflow에서 내가로드 인젝션 (load injection)을 권고 받았던 earlier posted similar question.자바에서 멀티 쓰레딩 문제

로드 인젝션에 대해 조사한 결과 사용자 액세스를 제어하는 ​​콜 플로우에서 내 시스템에 액세스하므로 내 개발 서버에서 테스트를 수행 할 수 없습니다. 나는 JVM 튜닝과 스레드 풀링에 대해 공부하면서 시간을 보냈다. 이 특정 시스템 프로세스는 약 14K-15K 통화/일에 가까워지고 피크 시간에는 4-5 개의 스레드를 호출 할 때마다 대기열이 매우 높습니다 (대기열에서 대기중인 400-500 개의 호출이 발생할 수 있음). 로그에서 OutOfMemoryError와 같은 것을 보지 못했습니다. 스레드의 생성을 멈출 수있는 다른 이유가 있습니까?

내 JVM conf는 xms : 128m입니다. Xmx : 1024m 환경은 Windows Server 32 비트, 4GB RAM입니다.

threadstacksize 도움을 포함하면 아무런 방해없이 스레드를 생성 할 수 있습니까?

또한 스레드 풀링의 실현 가능성을 연구 중입니다. 고정 된 양의 스레드를 생성하는 동안 시스템 전체 성능에 영향을 미치는지 여부를 연구해야합니다.

+0

OS가 동시에 활성화 할 수있는 스레드의 양을 제한하는 것은 불가능하지 않습니다. 이 문제가 어떻게 JVM에 영향을 미치는지 확신 할 수 없으므로 (예 : 사용자 코드에서이 한도를 숨기려면 어떤 조치를 취한 경우) 대답에 넣지 마십시오. – Romain

+0

스레드 풀 경로로 이동하는 것이 좋습니다. http://download.oracle.com/javase/6/docs/api/java/util/concurrent/Executors.html#newFixedThreadPool(int) – Qwerky

답변

0

스레드를 만드는 것은 매우 비싼 작업입니다. 및 많은 시스템 리소스를 사용합니다. 가장 중요한 점은 각 스레드가 스택에 많은 메모리가 필요하다는 것입니다 (기본적으로 512KB). 과도하게 새 스레드를 작성하면 모든 종류의 문제가 발생합니다. JVM은 일반적으로 운영 체제, -XX:ThreadStackSize 설정 및 여유 메모리에 따라 수천 개의 스레드 만 지원할 수 있습니다.

스레드 풀링으로 성능이 저하되지 않아 성능이 향상됩니다. 그러니 분명히 그렇게해야합니다. 스레드 풀 크기가 너무 작 으면 생동력 문제가있을 수 있지만 튜닝하기 쉽습니다.

+0

동의합니다. 한계에 관한. 그러나 OS가 처리중인 활성 스레드의 양을 알아낼 수있는 방법이 있습니다. – AKV

+0

[JProfiler] (http://www.ej-technologies.com/products/jprofiler/overview.html) 또는 [visualvm] (http://visualvm.java.net/) –

0

어쩌면 아키텍처 변경으로 문제를 해결할 수 있습니다. 효율성 때문에 스레드 풀링을 시도했지만 혼자서는 문제를 해결할 수 없습니다. 스폰 된 모든 스레드가 실제로 필요하면 (단일 리소스를 놓고 경쟁하는 여러 스레드가 영향을 미침) 및 풀의 크기를 조정할 경우 을 재검토해야 할 수 있습니다. 풀 크기를 조정하십시오. 실행자을 보면 약간의 변경 사항이 도움이 될 수 있습니다.

+0

과 같은 프로파일 러를 고려하십시오. 이 프로젝트가 다른 누군가에 의해 개발 된 것처럼 아키텍처를 재구성합니다. 나는 그가 그만 둘 때 그에게서 떠 맡았다. 그리고 현재 생산 단계에 있습니다. 내 문제가 붙어있는 것을 보았습니다. 어떤 방법으로이 문제를 해결해야합니다. – AKV