首页 > 解决方案 > Java线程内存计算

问题描述

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

标签: javamultithreadingmemorymemory-management

解决方案


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

但是线程确实获得了自己的内存块:堆栈。

堆栈大小

正如我在 2020 年 Oracle 的 Ron Pressler 的演讲中所记得的那样……</p>

常规螺纹

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

虚拟线程

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

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

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

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


推荐阅读