【问题标题】:Java thread memory calculationJava线程内存计算
【发布时间】:2021-07-08 03:19:45
【问题描述】:

是否可以计算每个线程的内存消耗?假设我将任务分为 4 个线程,那么我想知道每个线程消耗了多少内存?我需要它来了解我的线程的平均和峰值内存使用情况。

【问题讨论】:

  • 我认为不可能计算每个线程的内存消耗。线程通常从共享内存中消耗。因此线程不拥有任何特定的内存。如果任何线程在具有变量的作用域上工作,内存分析器将帮助您获取该信息。
  • @papaya 我认为这是可能的。至少是一个近似值。如果您知道线程是什么,您就知道它创建了多少对象。可以创建对象大小。静态实例的内存和 JVM 开销可以计入第一个线程。
  • @AndiCover 确实如此,就像我在回答中所说的那样,只有当线程开始从共享内存关联/使用时才会出现问题。除此之外,使用内存分析器非常简单。由于 OP 没有提到 JVM 版本等。这可能会有所帮助。 docs.oracle.com/javase/6/docs/jre/api/management/extension/com/…
  • @AndiCover 你可以记录它创建了哪些对象以及它们的内存占用,但这并没有说明线程使用了哪些对象。正如木瓜正确所说,堆内存是共享​​>内存第一个使用"foo"的线程将是字符串对象的创建者,所有其他线程将使用相同的对象,即使创建者有停止使用它,甚至当创建者不再存在时。线程之间可以进行任意对象交换,这些对象通常是持久化的对象,临时本地对象最先被垃圾回收
  • @AndiCover 怎么能做到这一点?

标签: java multithreading memory memory-management


【解决方案1】:

正如其他人所指出的,大多数对象都存在于heap 上。该堆内存在线程之间共享。所以没有办法确定哪些线程负责堆的大小。

但线程确实有自己的内存块:堆栈。

堆栈大小

我记得甲骨文的 Ron Pressler 在 2020 年的演讲......

常规线程

每个线程都为其stack分配了一定数量的内存。由于当前基于 OpenJDK 的 Java 实现中的线程被一对一映射到宿主 OS 的线程,因此堆栈大小被任意设置为类似兆的东西。如果需要,可能会分配更多内存,但不会减少。

虚拟线程

使用Project Loom 中提出的虚拟线程 (fibers) 使情节变厚。

Project Loom 为 Java 并发工具添加了新功能。作为其中的一部分,虚拟线程被多对一映射到主机操作系统线程(也称为平台/内核线程)。 JVM 将管理这些虚拟线程而不是操作系统,当它的代码阻塞时“停放”一个虚拟线程,以便通过分配给“真实”平台/内核线程的执行时间让另一个虚拟线程有时间运行。调度“真正的”平台/内核线程以在 CPU 内核上实际完成工作由主机操作系统控制,无论是否使用 Project Loom(至少在基于 OpenJDK 的 Java 实现中)。

➥ 作为虚拟线程的 JVM 管理的一部分,每个虚拟线程的堆栈开始时会小得多。每个堆栈都会根据需要增长和收缩(!)。

由于对 CPU 和内存的高效利用,虚拟线程显着“便宜”。所以我们可以运行更多。在通用硬件上甚至可以实现数百万个虚拟线程。

【讨论】:

  • Project Loom 允许虚拟线程解决任意的Executor 实现,例如ThreadPoolExecutor。所以这是一个多对多的关系。
  • 非常感谢您的解释。现在我了解了 Java 如何管理线程的内存。
【解决方案2】:

总结我的评论,线程使用共享内存。因此,除了保留的堆栈内存(在 jvm 启动期间设置)之外,没有线程拥有它自己的任何数据。

由于您关注的是线程在运行 jvm 时消耗的确切堆大小,因此您可以简单地使用像 visualvm 这样的内存分析器来查看线程创建的类和对象并假设消耗大小。

您还可以ThreadLocal 变量来定义属于特定线程的对象。这还可以帮助您获得每个线程的确切内存消耗。

您也可以查看ThreadMXBean,但在最新的 jvm 中不再提供此功能。

【讨论】:

  • 我想我就是这么说的。再读一遍?
  • 是的,你做到了。我错过了,我的错。
  • 非常感谢您的回答。我了解了线程使用的共享内存。关于 ThreadLocal,如何计算内存消耗?如果我打电话给运行时。获取运行时间()。 freeMemory() 到那个 ThreadLocal,它会显示整体的可用内存对吗?
猜你喜欢
  • 2016-08-23
  • 2017-09-24
  • 1970-01-01
  • 2016-09-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多