Java线程内存计算

标签 java multithreading memory memory-management

是否可以计算每个线程的内存消耗?假设我将任务分成 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/

相关文章:

spring - 一起使用 Spring @Scheduled 和 @Async

java - Hibernate 在连接到子表时寻找父字段名称

java - Hibernate 使用一级或二级缓存加载所有实体

java - 为什么这个 protected 成员在子类中不可见

Recast.AI 中的内存不会自动刷新

c - 如何从需要查找的标准输入管道数据中高效读取

java - 最小化 do ... while 循环中变量的范围 [Java] - 错误 : Symbol cannot be found

c++ - 并发写入 vector<bool>

.NET:如何让后台线程信号主线程数据可用?

swift - 在 cocoa 后台连续运行代码