线程特定的堆分配
Posted
技术标签:
【中文标题】线程特定的堆分配【英文标题】:Thread-specific heap allocation 【发布时间】:2012-02-12 04:53:36 【问题描述】:是否可以让一些线程子集(例如来自特定线程池)从自己的堆中分配内存?例如。大多数线程从常规共享堆中分配,少数工作线程从单个堆中分配(每个线程 1:1)。
目的是确保代码在共享环境中的安全执行 - 典型的工作线程是无状态的并且在单独的线程上运行,处理一个请求不应消耗超过 4MB 的堆。
更新 #1 Re:但是你为什么担心“安全执行”和堆消耗的不可预测的增加?
重点是在我的进程中安全托管任意 3rd 方 java 代码。有一点是因为第 3 方代码中的错误,我的整个过程不会出现“内存不足”。
更新 #2 Re: 关于限制每个线程的内存使用,在 Java 语言中这是不可能的
根据我在发布此问题之前的调查,我的看法是一样的,我只是希望我遗漏了一些东西。
就我现在看到的用例而言,唯一可能的替代解决方案是......
1) How much memory does my java thread take? - 跟踪某些调控器线程中的线程内存使用情况并终止坏线程
2) Run Java code on my own JVM - 是的,这是可能的。你可以下载一个 JVM 开源实现,修改它... :)
【问题讨论】:
不,线程背后的整个想法是尽可能轻量级,因此它们共享同一个堆;如果他们允许,它也会使同步变得更加困难。但是你为什么担心“安全执行”和堆消耗的不可预测的增加呢? 典型的 JVM 实现使用线程本地分配缓冲区 (TLAB),其中每个线程都有自己的小区域来进行小分配而没有太多线程安全开销。不过,这并没有解决可用性问题。 RTSJ 有一些与线程和堆相关的东西,但那是关于延迟的。 【参考方案1】:没有。 Java中没有这个概念。 new
分配了一个“堆”。 Java 分配是线程安全的。为什么你认为创建更多堆会导致线程消耗更少的内存?
如果你想控制线程中的内存使用,不要分配东西。
理论上,您可以为此目的创建可重用对象池,但性能几乎肯定会比明显的替代方案差。
【讨论】:
【参考方案2】:查看Java nonblocking memory allocation — 线程通常已经从它们自己的分配块中分配内存。因此,如果您担心速度,Sun 已经为您做到了。
由于限制每个线程的内存使用,在 Java 语言中这是不可能的。在 JVM 和 Java 中是否可能(或有意义)该平台是一个有趣的问题。你当然可以the same way as any memory profiler does,但我担心管理系统很快就会超过应用程序本身。
【讨论】:
【参考方案3】:线程按设计共享所有堆和其他内存区域。只有栈是真正的线程本地的,并且这个空间是可以限制的。
如果您有想要在自己的内存中运行和/或可以停止的任务,则必须将它们作为单独的进程运行。
【讨论】:
以上是关于线程特定的堆分配的主要内容,如果未能解决你的问题,请参考以下文章