development

sun.misc.Unsafe.park (기본 방법)에서 대기 중

big-blog 2020. 11. 26. 19:05
반응형

sun.misc.Unsafe.park (기본 방법)에서 대기 중


내 응용 프로그램 중 하나가 부하 상태에서 실행되는 동안 중단됩니다. 누구든지 jstack에서 이러한 출력을 유발할 수있는 원인을 알고 있습니까?

"scheduler-5" prio=10 tid=0x00007f49481d0000 nid=0x2061 waiting on condition [0x00007f494e8d0000]
   java.lang.Thread.State: WAITING (parking)
        at sun.misc.Unsafe.park(Native Method)
        - parking to wait for  <0x00000006ee117310> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
        at java.util.concurrent.locks.LockSupport.park(LockSupport.java:186)
        at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2043)
        at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:1085)
        at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:807)
        at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1043)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1103)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
        at java.lang.Thread.run(Thread.java:722)

나는 이것이 멈출 때 jstack 출력에서 ​​많이 본다.

저는 Spring @Async 및 맵, 동기화 된 맵 및 ehcache를 많이 사용합니다.

흥미로운 점은 앱 인스턴스 중 하나에서만 발생합니다. 다른 두 명은 완벽하게 작동합니다. 이 경우 더 자세한 정보를 얻기 위해 조사 할 수있는 다른 사항은 무엇입니까?

이 게시물 https://stackoverflow.com/questions/23992787/parking-to-wait-for-0xd8cf0070-a-java-util-concurrent-locks-abstractqueueds를 찾았 지만 제 경우에는 그다지 유용하지 않습니다.


unsafe.park는 특정 아키텍처 코드를 사용한다는 점을 제외하면 thread.wait와 거의 동일합니다 (따라서 '안전하지 않은'이유). unsafe는 공개적으로 제공되지 않지만 아키텍처 특정 코드가 상당한 최적화 이점을 제공하는 Java 내부 라이브러리 내에서 사용됩니다. 스레드 풀링에 많이 사용됩니다.

따라서 귀하의 질문에 답하기 위해 스레드가 수행하는 모든 작업은 무언가를 기다리고 있으며 실제로 CPU를 사용하지 않습니다. 원래 스택 추적이 잠금을 사용하고 있음을 보여주는 것을 고려하면 귀하의 경우 교착 상태가 진행되고 있다고 가정합니다.

예, 지금까지이 문제를 거의 확실히 해결 한 것으로 알고 있습니다. 그러나 누군가가 sun.misc.unsafe.park를 googles하면 당신은 최고의 결과 중 하나입니다. 나는 질문에 답하는 것이 다른 사람들이 모든 CPU를 사용하는 것처럼 보이는이 방법을 이해하는 데 도움이 될 수 있다고 생각합니다.


스택 추적에서 ThreadPoolExecutor> Worker 스레드가 시작되었고 작업을 선택하고 실행하기 위해 BlockingQueue (DelayedWorkQueue)에서 작업을 사용할 수있을 때까지 기다리고 있다는 것이 분명합니다. 게시자 스레드의 SIGNAL입니다.


비슷한 문제가 있었고 이전 답변 (감사합니다!)에 따라 ThreadPoolExecutor 터미널을 올바르게 처리하는 방법을 검색하고 찾을 수있었습니다.

제 경우에는 유사한 차단 스레드의 점진적 증가를 수정합니다.

  • 나는 finally 절에서 ExecutorService::awaitTermination(x, TimeUnit)ExecutorService::shutdownNow()(필요한 경우)를 사용했습니다.
  • 정보를 위해 다음 명령을 사용하여 스레드 수를 감지하고 잠긴 스레드를 나열했습니다.

    ps -u javaAppuser -L | wc -l

    jcmd`ps -C java -o pid =`Thread.print >> threadPrintDayA.log

    jcmd`ps -C java -o pid =`Thread.print >> threadPrintDayAPlusOne.log

    cat threadPrint * .log | grep "pool-"| wc -l


에서 저수준 프로그래밍을위한 진입 게이트가 필요한 경우 Java강제로

  • JNI일부를 알아야 C language하며 특정 플랫폼과 밀접하게 연결된 코드로 빠르게 이어질 것입니다.
  • sun.misc.Unsafe그러나이 Java대안은 권장되지 않지만 Java API를 사용하는 플랫폼의 저수준 프로그래밍에 대한 또 다른 대안 있습니다.

파크 / 언 파크

UnsafeJVM이 스레드를 컨텍스트 전환하는 데 사용 하는 API 에는 두 가지 매력적인 방법이 있습니다 . 스레드가 어떤 조치를 기다리고있을 때 JVM은 클래스 park()메소드를 사용하여이 스레드를 차단할 수 있습니다 Unsafe.

Object.wait()방법 과 매우 유사 하지만 기본 OS 코드를 호출 하므로 일부 아키텍처 특성을 활용하여 최상의 성능을 얻습니다.

스레드가 차단되고 다시 실행 가능하도록 만들어야하는 경우 JVM은이 unpark()메서드를 사용합니다 . 특히 스레드 풀을 사용하는 애플리케이션에서 스레드 덤프에서 이러한 메서드 호출을 자주 볼 수 있습니다.

여기 , 여기에서 자세히 알아 보세요.

참고 URL : https://stackoverflow.com/questions/24241335/waiting-at-sun-misc-unsafe-parknative-method

반응형