walter_huang_2017 2017-10-24 13:19 采纳率: 0%
浏览 1983

jetty线程出现堆积,处理不过来现象,求分析和解决半封闭

"jetty-server-127" #173 prio=5 os_prio=0 tid=0x00007f4f4005a000 nid=0xf580 waiting on condition [0x00007f4e301c0000]
java.lang.Thread.State: WAITING (parking)
at sun.misc.Unsafe.park(Native Method)
- parking to wait for (a java.util.concurrent.SynchronousQueue$TransferStack)
at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)
at java.util.concurrent.SynchronousQueue$TransferStack.awaitFulfill(SynchronousQueue.java:458)
at java.util.concurrent.SynchronousQueue$TransferStack.transfer(SynchronousQueue.java:362)
at java.util.concurrent.SynchronousQueue.take(SynchronousQueue.java:924)
at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1067)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1127)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
at com.kugou.thread.Threads$RunnableThread.run(Threads.java:244)

Locked ownable synchronizers:
- None

"jetty-server-126" #172 prio=5 os_prio=0 tid=0x00007f4f38003000 nid=0xf57f waiting on condition [0x00007f4e302c1000]
java.lang.Thread.State: WAITING (parking)
at sun.misc.Unsafe.park(Native Method)
- parking to wait for (a java.util.concurrent.SynchronousQueue$TransferStack)
at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)
at java.util.concurrent.SynchronousQueue$TransferStack.awaitFulfill(SynchronousQueue.java:458)
at java.util.concurrent.SynchronousQueue$TransferStack.transfer(SynchronousQueue.java:362)
at java.util.concurrent.SynchronousQueue.take(SynchronousQueue.java:924)
at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1067)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1127)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
at com.kugou.thread.Threads$RunnableThread.run(Threads.java:244)

Locked ownable synchronizers:
- None

"jetty-server-125" #171 prio=5 os_prio=0 tid=0x00007f4f3403d000 nid=0xf57e waiting on condition [0x00007f4e303c2000]
java.lang.Thread.State: WAITING (parking)
at sun.misc.Unsafe.park(Native Method)
- parking to wait for (a java.util.concurrent.SynchronousQueue$TransferStack)
at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)
at java.util.concurrent.SynchronousQueue$TransferStack.awaitFulfill(SynchronousQueue.java:458)
at java.util.concurrent.SynchronousQueue$TransferStack.transfer(SynchronousQueue.java:362)
at java.util.concurrent.SynchronousQueue.take(SynchronousQueue.java:924)
at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1067)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1127)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
at com.kugou.thread.Threads$RunnableThread.run(Threads.java:244)

Locked ownable synchronizers:
- None

vi -c 1 mynew.log
2.lang.Thread.State: WAITING (parking)017-10-24 20:57:01
Full thread dump Java HotSpot(TM) 64-Bit Server VM (25.40-b25 mixed mode):

"Attach Listener" #26239 daemon prio=9 os_prio=0 tid=0x00007f4fbc001000 nid=0xeb30 waiting on condition [0x0000000000000000]
java.lang.Thread.State: RUNNABLE

Locked ownable synchronizers:
- None

"jetty-server-127" #173 prio=5 os_prio=0 tid=0x00007f4f4005a000 nid=0xf580 waiting on condition [0x00007f4e301c0000]
java.lang.Thread.State: WAITING (parking)
at sun.misc.Unsafe.park(Native Method)
- parking to wait for (a java.util.concurrent.SynchronousQueue$TransferStack)
at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)
at java.util.concurrent.SynchronousQueue$TransferStack.awaitFulfill(SynchronousQueue.java:458)
at java.util.concurrent.SynchronousQueue$TransferStack.transfer(SynchronousQueue.java:362)
at java.util.concurrent.SynchronousQueue.take(SynchronousQueue.java:924)
at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1067)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1127)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
at com.kugou.thread.Threads$RunnableThread.run(Threads.java:244)

Locked ownable synchronizers:
- None

"jetty-server-126" #172 prio=5 os_prio=0 tid=0x00007f4f38003000 nid=0xf57f waiting on condition [0x00007f4e302c1000]
java.lang.Thread.State: WAITING (parking)
at sun.misc.Unsafe.park(Native Method)
- parking to wait for (a java.util.concurrent.SynchronousQueue$TransferStack)
at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)
at java.util.concurrent.SynchronousQueue$TransferStack.awaitFulfill(SynchronousQueue.java:458)
at java.util.concurrent.SynchronousQueue$TransferStack.transfer(SynchronousQueue.java:362)
at java.util.concurrent.SynchronousQueue.take(SynchronousQueue.java:924)
at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1067)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1127)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
at com.kugou.thread.Threads$RunnableThread.run(Threads.java:244)

Locked ownable synchronizers:
- None

"jetty-server-125" #171 prio=5 os_prio=0 tid=0x00007f4f3403d000 nid=0xf57e waiting on condition [0x00007f4e303c2000]
java.lang.Thread.State: WAITING (parking)
at sun.misc.Unsafe.park(Native Method)
- parking to wait for (a java.util.concurrent.SynchronousQueue$TransferStack)
at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)
at java.util.concurrent.SynchronousQueue$TransferStack.awaitFulfill(SynchronousQueue.java:458)
at java.util.concurrent.SynchronousQueue$TransferStack.transfer(SynchronousQueue.java:362)
at java.util.concurrent.SynchronousQueue.take(SynchronousQueue.java:924)
at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1067)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1127)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
at com.kugou.thread.Threads$RunnableThread.run(Threads.java:244)

Locked ownable synchronizers:
- None

  • 写回答

1条回答 默认 最新

  • 你知我知皆知 2024-08-07 02:19
    关注

    以下回答参考 皆我百晓生券券喵儿 等免费微信小程序相关内容作答,并由本人整理回复。

    Jetty服务器出现线程堆积问题可能由多种原因引起,包括但不限于资源竞争、死锁或并发控制不当等。以下是一些可能导致此类问题的原因及其相应的解决方案:

    原因及解决方案

    1. 资源竞争(如共享数据结构)

    • 检查:确保所有用户对共享资源的访问都是安全的。
    • 改进:使用更安全的数据结构(如读写锁)以限制同时访问。
    public class SharedData {
        private int data;
    
        public synchronized void set(int value) {
            this.data = value;
        }
    
        public synchronized int get() {
            return this.data;
        }
    }
    

    2. 死锁

    • 检查:确认线程之间是否存在相互依赖关系导致的死锁。
    • 改进:使用更为复杂的同步机制,如信号量、队列或条件变量。
    import java.util.concurrent.TimeUnit;
    import java.util.concurrent.atomic.AtomicInteger;
    
    class DeadlockDetector {
        AtomicInteger count = new AtomicInteger();
    
        public void lockAndUnlock() throws InterruptedException {
            while (count.incrementAndGet() != 1) {
                Thread.sleep(1);
            }
            System.out.println("Lock acquired");
            TimeUnit.SECONDS.sleep(1); // Simulate a long operation
            System.out.println("Unlocking...");
            count.decrementAndGet();
        }
    }
    
    // Usage:
    DeadlockDetector detector = new DeadlockDetector();
    detector.lockAndUnlock(); // Prints "Lock acquired", then sleeps, then prints "Unlocking..."
    

    3. 并发控制不当

    • 检查:确认线程间的同步是否正确实现。
    • 改进:优化线程同步策略,例如使用可重入锁、锁池或者使用更高级的并发框架。
    import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
    
    public class MyThreadPool extends ThreadPoolTaskExecutor {
    
        @Override
        protected void beforeExecute(Runnable r, Runnable runnable) {
            super.beforeExecute(r, runnable);
            if (r instanceof MyRunnable) {
                ((MyRunnable)r).setPriority(Thread.MAX_PRIORITY);
            }
        }
    }
    

    4. 过度负载

    • 调整:根据实际需求调整服务器端口和最大并发连接数。
    • 监控:使用日志或性能监控工具跟踪系统负载。
    private static final Logger logger = LoggerFactory.getLogger(MyServer.class);
    
    public void startServer() {
        try {
            server = new Server(port);
            server.setHandler(new MyRequestHandler());
            server.start();
            logger.info("Server started on port {}", port);
        } catch (Exception e) {
            logger.error(e.getMessage(), e);
        }
    }
    

    注意事项

    • 解决线程堆积问题时,请始终确保遵循最佳实践,包括使用合适的同步策略、避免阻塞操作以及定期清理不再使用的线程。
    • 在复杂系统中进行调试和优化是一个挑战,可能会涉及到大量的代码修改。在实施任何重大变更之前,最好先进行充分的测试和验证。

    希望这些信息能帮助您找到解决问题的方法。如果您有特定的代码示例,可以提供给我,我将能够为您提供更具体的建议。

    评论

报告相同问题?