zoukankan      html  css  js  c++  java
  • java get all threadlocal from thread

    public void mytest() {
    long start = System.currentTimeMillis();
    Thread thread = Thread.currentThread();

    Field threadLocalsField = null;
    try {
    threadLocalsField = Thread.class.getDeclaredField("threadLocals");

    threadLocalsField.setAccessible(true);

    Class threadLocalMapKlazz = Class.forName("java.lang.ThreadLocal$ThreadLocalMap");
    Field tableField = threadLocalMapKlazz.getDeclaredField("table");
    tableField.setAccessible(true);

    Object table = tableField.get(threadLocalsField.get(thread));

    int threadLocalCount = Array.getLength(table);
    StringBuilder sb = new StringBuilder();
    StringBuilder classSb = new StringBuilder();


    int leakCount = 0;

    for (int i = 0; i < threadLocalCount; i++) {
    Object entry = Array.get(table, i);
    if (entry != null) {
    Field valueField = entry.getClass().getDeclaredField("value");
    valueField.setAccessible(true);
    Object value = valueField.get(entry);
    if (value != null) {
    classSb.append(value.getClass().getName()).append(", ");

    } else {
    classSb.append("null, ");
    }
    leakCount++;
    }
    }

    sb.append("possible ThreadLocal leaks: ")
    .append(leakCount)
    .append(" of ")
    .append(threadLocalCount)
    .append(" = [")
    .append(classSb.substring(0, classSb.length() - 2))
    .append("] ");

    log.warn(sb.toString());
    } catch (Exception e) {
    e.printStackTrace();
    }
    long end = System.currentTimeMillis();
    long cost = end - start;
    log.info("获取ThreadLocal耗时:{}", cost);



    结果: possible ThreadLocal leaks: 9 of 16 = [java.util.Collections$SynchronizedMap, null,
    java.lang.Boolean, java.lang.Boolean, null, java.lang.Integer, java.lang.Boolean, brave.propagation.TraceContext, null] 
  • 相关阅读:
    Java多线程-死锁
    Java多线程-BlockingQueue
    Java多线程-Object.wait()
    Java多线程-System.exit(0)的作用
    Java多线程-线程状态
    关于j = j++在循环中执行的问题
    ThreadLocal的学习
    Java多线程-ReentrantLock重入锁同步线程源码学习
    Java中为什么可以用一个char(两个字节)表示一个中文字符
    我对Java动态代理的理解
  • 原文地址:https://www.cnblogs.com/zhangzhi19861216/p/12152973.html
Copyright © 2011-2022 走看看