java - Java线程内存计算
问题描述
是否可以计算每个线程的内存消耗?假设我将任务分成 4 个线程,那么我想知道每个线程消耗了多少内存?我需要它来了解我的线程的平均和峰值内存使用情况。
解决方案
正如其他人所指出的,大多数对象都存在于堆上。该堆内存在线程之间共享。所以没有办法确定哪些线程负责堆的大小。
但是线程确实获得了自己的内存块:堆栈。
堆栈大小
正如我在 2020 年 Oracle 的 Ron Pressler 的演讲中所记得的那样……</p>
常规螺纹
每个线程都为其堆栈分配了一定数量的内存。由于当前基于 OpenJDK 的 Java 实现中的线程被一对一映射到宿主操作系统的线程,因此堆栈大小被任意设置为类似兆的东西。如果需要,可以分配更多内存,但不会减少。
虚拟线程
使用Project Loom中提出的虚拟线(纤维)使情节变厚。
Project Loom 为 Java 并发设施添加了新功能。作为其中的一部分,虚拟线程被多对一映射到主机操作系统线程(又名平台/内核线程)。JVM将管理这些虚拟线程而不是操作系统,当它的代码阻塞时“停放”一个虚拟线程,以便通过分配给“真实”平台/内核线程的执行时间让另一个虚拟线程有时间运行。“真正的”平台/内核线程在 CPU 内核上实际完成工作的调度由主机操作系统控制,无论是否使用 Project Loom(至少在基于OpenJDK的 Java 实现中)。
➥ 作为虚拟线程的 JVM 管理的一部分,每个虚拟线程的堆栈开始时会小得多。并且每个堆栈都会根据需要增长和收缩(!)。
由于 CPU 和内存的这种高效使用,虚拟线程显着地“便宜”。所以我们可以运行更多。在通用硬件上甚至可以实现数百万个虚拟线程。
推荐阅读
- java - android中有什么方法可以让我在android中同时播放两个音频?一个在我的应用程序上,一个在另一个后台应用程序上
- gramex - 401 无效令牌/handler.xsrf_token 与 cookie 不匹配
- names - 对同一个表或数组使用不同名称的原因是什么?
- iframe - 如何接受带有赛普拉斯的 iframe 触发的窗口确认
- javascript - JQuery在功能中禁用单页滚动
- python-3.x - 如何在一帧中同时调整多个不同尺寸的图像?
- java - 如何在 pom.xml 中指定 python 文件版本?
- mongodb - 将 Mongo Atlas 与 Spring boot 连接时出现问题(我已经尝试了所有 stackoverflow 解决方案)
- django - Django按日期范围过滤,如果日期中没有记录,则返回其中的虚拟记录,而不会死在循环中
- amazon-s3 - 使用 aws java sdk 在 amazon s3 glacier 中创建一个新文件夹