微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Java线程内存计算

如何解决Java线程内存计算

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

解决方法

正如其他人所指出的,大多数对象都位于 heap 上。该堆内存是跨线程共享的。所以无法确定哪些线程负责堆的大小。

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

堆栈大小

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

常规线程

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

虚拟线程

情节因fibers中提出的虚拟线程(Project Loom)而变粗。

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

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

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

,

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

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

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。