WAITING at sun.misc.Unsafe.park(Native Method)

122,918

Solution 1

unsafe.park is pretty much the same as thread.wait, except that it's using architecture specific code (thus the reason it's 'unsafe'). unsafe is not made available publicly, but is used within java internal libraries where architecture specific code would offer significant optimization benefits. It's used a lot for thread pooling.

So, to answer your question, all the thread is doing is waiting for something, it's not really using any CPU. Considering that your original stack trace shows that you're using a lock I would assume a deadlock is going on in your case.

Yes I know you have almost certainly already solved this issue by now. However, you're one of the top results if someone googles sun.misc.unsafe.park. I figure answering the question may help others trying to understand what this method that seems to be using all their CPU is.

Solution 2

From the stack trace it's clear that, the ThreadPoolExecutor > Worker thread started and it's waiting for the task to be available on the BlockingQueue(DelayedWorkQueue) to pick the task and execute.So this thread will be in WAIT status only as long as get a SIGNAL from the publisher thread.

Solution 3

I had a similar issue, and following previous answers (thanks!), I was able to search and find how to handle correctly the ThreadPoolExecutor terminaison.

In my case, that just fix my progressive increase of similar blocked threads:

  • I've used ExecutorService::awaitTermination(x, TimeUnit) and ExecutorService::shutdownNow() (if necessary) in my finally clause.
  • For information, I've used the following commands to detect thread count & list locked threads:
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
Share:
122,918
Konrad Pawlus
Author by

Konrad Pawlus

I am IT manager, CTO, always passionate about software craftsmanship. Successfully delivered SaaS products from scratch to $17 mln ARR global solutions. Scaled IT team from 1 up to 75 people. Stil know how to code 😉 I have 9 years of experience building SALESmanago – 3rd largest European Marketing Automation Platform as VP of Engineering/CTO. Scaling from 2 to 260 employees, of which 75 in IT, from 0 to 45 000 transactions/s. Always thinking business first! Additionally as an investor and consultant I am involved in ExMetrix – one of most innovative AI startup in Poland. Prior to founding SALESmanago I worked 2 years at Sabre, where I quickly jumped from senior level Developer to 20 people team manager. Working with tech debt, always delivering, even when it was said some things are impossible. Before Sabre I spent 4 years of Java challenges in two Irish startups in Dublin. Delighted with Ireland’s startup culture, longing Irish attitude and atmosphere. Graduated from one of best polish Universities – AGH while working full time at innovative fintech Startups. In meantime launching at least two own projects – which failed – but there were reasons behind. konrad[at]pawlus.io http://www.linkedin.com/in/konradpawlus

Updated on October 02, 2020

Comments

  • Konrad Pawlus
    Konrad Pawlus over 3 years

    One of my applications hangs under some period of running under load, does anyone know what could cause such output in 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)
    

    I am seeing this a lot in jstack output when it hangs.

    I heavily using Spring @Async & maps, synchronized maps & ehcache.

    What is interesting this only happens on one of app instances. Two others are running perfectly fine. What else I could investigate to get more details in such case?

    I found this post https://stackoverflow.com/questions/23992787/parking-to-wait-for-0xd8cf0070-a-java-util-concurrent-locks-abstractqueueds but it is not very useful in my case.

  • Harold L
    Harold L about 8 years
    And it is parked because this thread is part of a thread pool for an ExecutorService, and it is waiting for some task to be put on the work queue via methods like ExecutorService.submit(...).
  • Nithin Satheesan
    Nithin Satheesan over 3 years
    Could it also indicate it's waiting for a response from a connection? Like a backend call?
  • dsollen
    dsollen over 3 years
    @NithinSatheesan that seems plausible. best way to know is to look at the stack trace and see who is calling it.
  • Nithin Satheesan
    Nithin Satheesan over 3 years
    @dsollen The stack trace is same as in the post here. It just starts at Thread.run and ends at Unsafe.park.