怎样分析 JAVA 的 Thread Dumps

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了怎样分析 JAVA 的 Thread Dumps相关的知识,希望对你有一定的参考价值。

参考技术A 你好,
当你使用 java.lang.Thread 创建线程,你可以通过创建参数给该线程定义个约定俗成的名字。

  public Thread(Runnable target, String name);
  public Thread(ThreadGroup group, String name);
  public Thread(ThreadGroup group, Runnable target, String name);
  public Thread(ThreadGroup group, Runnable target, String name, long stackSize);
  当你使用 java.util.concurrent.ThreadFactory 创建线程的时候,你可以通过生成你自己的线程工厂来命名它,如果你不需要特别的功能性,你可以使用 MyThreadFactory 作为以下描述:

  import java.util.concurrent.ConcurrentHashMap;
  import java.util.concurrent.ThreadFactory;
  import java.util.concurrent.atomic.AtomicInteger;

  public class MyThreadFactory implements ThreadFactory
  private static final ConcurrentHashMap<String, AtomicInteger> POOL_NUMBER =
  new ConcurrentHashMap<String, AtomicInteger>();
  private final ThreadGroup group;
  private final AtomicInteger threadNumber = new AtomicInteger(1);
  private final String namePrefix;

  public MyThreadFactory(String threadPoolName)

  if (threadPoolName == null)
  throw new NullPointerException("threadPoolName");
  
  POOL_NUMBER.putIfAbsent(threadPoolName, new AtomicInteger());

  SecurityManager securityManager = System.getSecurityManager();
  group = (securityManager != null) ? securityManager.getThreadGroup() :
  Thread.currentThread().getThreadGroup();

  AtomicInteger poolCount = POOL_NUMBER.get(threadPoolName);

  if (poolCount == null)
  namePrefix = threadPoolName + " pool-00-thread-";
   else
  namePrefix = threadPoolName + " pool-" + poolCount.getAndIncrement() + "-thread-";
  
  

  public Thread newThread(Runnable runnable)
  Thread thread = new Thread(group, runnable, namePrefix + threadNumber.getAndIncrement(), 0);

  if (thread.isDaemon())
  thread.setDaemon(false);
  

  if (thread.getPriority() != Thread.NORM_PRIORITY)
  thread.setPriority(Thread.NORM_PRIORITY);
  

  return thread;
  
  
  使用 MBean 获取更多的细节信息
  你可以使用 MBean 来获取 ThreadInfo 对象。你也可以获取更加多通过 thread dumps 不能获取的信息。通过使用 ThreadInfo。

  ThreadMXBean mxBean = ManagementFactory.getThreadMXBean();
  long[] threadIds = mxBean.getAllThreadIds();
  ThreadInfo[] threadInfos =
  mxBean.getThreadInfo(threadIds);

  for (ThreadInfo threadInfo : threadInfos)
  System.out.println(
  threadInfo.getThreadName());
  System.out.println(
  threadInfo.getBlockedCount());
  System.out.println(
  threadInfo.getBlockedTime());
  System.out.println(
  threadInfo.getWaitedCount());
  System.out.println(
  threadInfo.getWaitedTime());
  
  你可以使用方法 ThreadInfo 来提取阻塞线程或者是等待线程花费的时间。并利用这一点,你也可以得到那些处于非活动状态的时间异常长的线程列表。本回答被提问者和网友采纳

以上是关于怎样分析 JAVA 的 Thread Dumps的主要内容,如果未能解决你的问题,请参考以下文章

如何分析java Thread DUMP

Android多线程分析之二:Thread的实现

如何分析java thread dump

性能分析之-- JAVA Thread Dump 分析综述

java Thread源码分析

如何分析Thread Dump