代码之家  ›  专栏  ›  技术社区  ›  sehugg

内存中有很多threadlocalmap条目

  •  2
  • sehugg  · 技术社区  · 16 年前

    考虑一个非常大的Java VM,其中有很多线程运行一个Web服务器。

    现在考虑一个由 jmap -histo 看起来像这样:

      4:       5989163      191653216  java.lang.ThreadLocal$ThreadLocalMap$Entry
     10:         46786       49012000  [Ljava.lang.ThreadLocal$ThreadLocalMap$Entry;
     86:         23384        2619008  java.lang.Thread
    144:         46750        1122000  java.lang.ThreadLocal$ThreadLocalMap
    

    如果你做除法,结果是我们有256个 java.lang.ThreadLocal$ThreadLocalMap$Entry 每个线程。这个数字有点高,比我想象的要多,因为大多数线程局部变量不应该存储大量的值。当我使用Tomcat的线程本地泄漏检测功能时,我看不到它有这么多功能。

    有什么理由这些线程本地映射需要如此多内存?

    3 回复  |  直到 14 年前
        1
  •  1
  •   andersoj    16 年前

    你能找出线程局部映射中的值是什么吗?你到处找过吗 jhat 或者等同于看到他们在引用什么?

        2
  •  1
  •   sehugg    16 年前
        3
  •  0
  •   Stephen C    16 年前

    问题似乎是线程局部变量的实际数量,而不是它们包含的值。

    我怀疑您可能使用的threadlocal不正确。这个 ThreadLocal 对象应创建(一次)并分配给 static 变量,如中的示例所示 the javadoc .

    如果您创建 线程本地 对象在非静态变量的初始值设定项中,然后每次执行变量声明时都会在本地获取新的线程。如果您将它与线程池结合起来,那么您将得到许多无用的线程本地映射条目。

    推荐文章