是否可以计算每个线程的内存消耗?假设我将任务分成 4 个线程,那么我想知道每个线程消耗了多少内存?我需要它来了解我的线程的平均和峰值内存使用情况。
最佳答案
正如其他人所指出的,大多数对象都存在于 heap 上。 .该堆内存在线程之间共享。所以没有办法确定哪些线程负责堆的大小。
但是线程确实获得了自己的内存块:堆栈。
堆栈大小
正如我在 2020 年 Oracle 的 Ron Pressler 的演讲中所记得的那样……
常规线程
每个线程都被分配了一定数量的内存用于其stack。 .由于当前基于 OpenJDK 的 Java 实现中的线程被一对一映射到宿主操作系统的线程,因此堆栈大小被任意设置为类似兆的东西。如果需要,可以分配更多内存,但不会减少。
虚拟线程
在 fibers 中提出的虚拟线程 (Project Loom) 使情节变厚。 .
Project Loom 为 Java 并发设施添加了新功能。作为其中的一部分,虚拟线程被多对一映射到主机操作系统线程(也称为平台/内核线程)。 JVM将管理这些虚拟线程而不是操作系统,当它的代码阻塞时“停放”一个虚拟线程,以便通过分配给“真实”平台/内核线程的执行时间让另一个虚拟线程有时间运行。调度“真实”平台/内核线程以在 CPU 内核上实际完成工作由主机操作系统控制,无论是否使用 Project Loom(至少在基于 OpenJDK 的 Java 实现中)。
➥ 作为虚拟线程的 JVM 管理的一部分,每个虚拟线程的堆栈开始时会小得多。并且每个堆栈都会根据需要增长和收缩(!)。
由于 CPU 和内存的这种高效使用,虚拟线程显着地“便宜”。所以我们可以运行更多。在通用硬件上甚至可以实现数百万个虚拟线程。
关于Java线程内存计算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67068623/