Java线程内存计算

Java线程内存计算,java,multithreading,memory,memory-management,Java,Multithreading,Memory,Memory Management,是否可以计算每个线程的内存消耗?假设我将任务分成4个线程,那么我想知道每个线程消耗了多少内存?我需要它从我的线程中了解平均和峰值内存使用情况。总结我的评论,线程使用共享内存。因此,除了保留堆栈内存(在jvm启动期间设置)之外,没有线程拥有自己的任何数据 由于在运行jvm时,您将重点放在线程消耗的确切堆大小上,因此您可以简单地使用内存分析器来查看线程创建的类和对象,并假设消耗大小 还可以使用变量定义属于特定线程的对象。这还可以帮助您获得每个线程的确切内存消耗 您还可以查看,但是这在最新的JVM中不

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

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

由于在运行jvm时,您将重点放在线程消耗的确切堆大小上,因此您可以简单地使用内存分析器来查看线程创建的类和对象,并假设消耗大小

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


您还可以查看,但是这在最新的JVM中不再可用。

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

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

堆栈大小 我还记得Oracle的Ron Pressler在2020年的演讲中

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

虚拟线程 使用中建议的虚拟线程()使绘图变厚

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

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


由于CPU和内存的高效使用,虚拟线程的“成本”显著降低。所以我们可以运行更多。在普通硬件上甚至可以实现数百万个虚拟线程。

我认为不可能计算每个线程的内存消耗。线程通常使用共享内存。因此线程不拥有任何特定内存。如果有任何线程在带有变量的作用域上工作,内存分析器将帮助您获得这些信息。@papaya我认为这是可能的。至少是一个近似值。如果你知道线程是什么,你就知道它创建了多少个对象。可以创建对象大小。静态实例的内存和JVM开销可以计算到第一个线程中。这是真的,正如我在回答中所说,只有当线程开始从共享内存关联/消耗时,问题才会出现。除此之外,使用内存探查器也非常简单。由于OP没有提到JVM版本等,这可能会有所帮助@您可以记录它创建的对象及其内存占用情况,但这并不能说明线程使用的对象。正如papaya正确地说的,堆内存是一个共享内存。使用
“foo”
的第一个线程将是string对象的创建者,所有其他线程将使用同一个对象,即使创建者停止使用它,或者创建者不再存在。线程之间可以进行任意对象交换,这些对象通常是将持久化的对象,临时本地对象是第一个成为垃圾的对象collected@AndiCover怎么能这么做?我想我确实说过。再读一遍?是的,你读了。我错过了,我的错误。非常感谢你的回答。我想到了线程使用的共享内存。关于ThreadLocal,如何计算内存消耗?如果我调用运行时。getRuntime()。freeMemory()对于该ThreadLocal,它将显示总的可用内存,对吗?Project Loom允许虚拟线程在任意
执行器
实现上进行处理,如
ThreadPoolExecutor
。所以这是一种多对多的关系。非常感谢你的解释。现在我了解了Java如何管理线程的内存。