【问题标题】:impact of threads in wait state on memory in java processjava进程中处于等待状态的线程对内存的影响
【发布时间】:2013-10-22 15:28:55
【问题描述】:

我试图确定找出处于等待状态的线程对 java 进程(更具体地说是内存而不是 cpu)的影响的最佳方法。任何可以帮助我弄清楚它们的影响的建议(可能通过 jvisualvm/jconsole 等)将不胜感激。

更新: 当前线程数是几百个处于等待状态 - 大约 500。我正在尝试找出检查它是否可以/将对老年代的 GC 产生任何潜在影响的最佳方法。

【问题讨论】:

  • “影响”是什么意思?他们什么都不做,他们只是在等待……?
  • 也许,如果它等待一段时间,它的一些堆栈/数据/代码可能会被分页,就像进程中的任何用户可交换分配一样。你为什么要问,有什么具体的吗?

标签: java multithreading


【解决方案1】:

线程的内存使用在概念上可以分为:

  • 线程堆栈(我相信默认为 2MB,但可以使用 -Xss VM 选项更改和/或在线程构造函数中指定)

  • java 线程对象和关联对象(位于 VM 堆中)。对于给定的实现几乎是恒定的。只有几 KB。

  • 本机开销 - 管理线程所需的内核内存。应该可以忽略不计(几 KB)。

  • 由线程管理的用户数据(可通过其线程对象或局部变量访问的数据)。可能会有很大差异。

前三个元素很容易衡量(它们在虚拟机实例中几乎是恒定的,随线程数线性扩展),最后一个元素完全取决于线程代码/数据。

由于堆栈大小通常在很大程度上决定了每个线程的成本(与内核开销和线程对象相比),等待线程的内存影响可以简化为它的堆栈大小。

对于虚拟内存系统,这只是虚拟影响(分配的地址空间),而不一定是分配的物理内存量(永远不会为未使用的堆栈空间分配物理内存页面)。当您创建许多线程时,32 位系统会很快耗尽地址空间(例如:1000 个线程乘以 2MB 堆栈大小 = 2GB)。

【讨论】:

  • 感谢您的响应 - 处于等待状态的线程数大约为 500+,我正在尝试弄清楚这是否可能影响老年代的 GC。
【解决方案2】:

我正在尝试确定找出处于等待状态的线程对 java 进程(更具体地说是内存而不是 cpu)的影响的最佳方法

单个线程的影响将非常小。每个线程都被分配了一定数量的堆栈空间内存,这些内存是在堆外分配的。我相信对于 64 位机器,这通常是 512k 或 1M。这可以使用-XX:ThreadStackSize=YYY JVM 参数进行自定义,其中YYY 是以千字节为单位的堆栈大小。

堆上还有Thread对象本身以及JVM保存的各种记帐数据。当然,线程拥有的任何对象也需要考虑在内。

您唯一担心此空间的情况是您计划拥有 1000 个线程或内存限制非常有限。

【讨论】:

  • 感谢您的响应 - 处于等待状态的线程数大约为 500+,我正在尝试弄清楚这是否可能影响老年代的 GC。
  • 线程内存在 GC 之外,根本不会影响它@alihaider。
  • 谢谢 - 我的意思是如果线程持有一个(强)引用,以及该对象在老一代中是否可以被 GC(除非我有大脑冻结 - 它不会,但我可能是错的)。
  • 哦,我明白了。如果线程长时间运行,则可能是这种情况。但是,如果它需要该对象,则您无能为力。积极地将对象设置为null 并在这些暂停的线程内调用collection.clear() 可能有助于@alihaider。
猜你喜欢
  • 2018-01-17
  • 2014-01-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多