特定于线程的堆分配

是否有可能使一些线程子集(例如来自特定的ThreadPool)从自己的堆中分配内存? 例如,大多数线程都是从常规共享堆分配的,很少有工作线程从各个堆分配(每个线程1:1)。

目的是确保在共享环境中安全执行代码 – 典型的worker是无状态的并且在单独的线程上运行,处理一个请求不应该消耗超过4MB的堆。

更新#1 Re:但为什么你担心“安全执行”和不可预测的堆消耗增加?

关键是在我的进程中安全托管任意第三方Java代码。 有一点是由于第三方代码中的错误导致我的整个过程没有“内存不足”。

更新#2 Re:从限制每个线程的内存使用量来看,在Java中语言是不可能的

根据我的调查,在我发布这个问题之前,我的意见是一样的,我只是希望我错过了一些东西。

我现在看到的唯一可能的用例替代解决方案是……

1) 我的java线程需要多少内存? – 跟踪某些调控器线程中的线程内存使用情况并终止坏线程

2) 在我自己的JVM上运行Java代码 – 是的,这是可能的。 你可以下载一个JVM开源实现,修改它…… 🙂

查看Java非阻塞内存分配 – 线程通常已经从它们自己的分配块分配内存。 因此,如果关注速度,Sun已经为您完成了。

至于限制每个线程的内存使用量,在Java语言中它是不可能的。 在JVM和Java中是否可能(或有意义)平台是一个有趣的问题。 你当然可以像任何内存分析器那样做 ,但我担心管理系统很快就会超出应用程序本身。

没有。在Java中没有这个概念。 new分配的是一个“堆”。 Java分配是线程安全的。 为什么你认为制造更多堆将导致线程消耗更少的内存?

如果要控制线程中的内存使用量,请不要分配内容。

理论上,您可以为此目的创建可重用对象池,但性能几乎肯定会比显而易见的替代方案更差。

设计线程共享所有堆和其他内存区域。 只有堆栈是真正的线程本地,并且这个空间可以是有限的。

如果您有要在自己的内存中运行和/或可以停止的任务,则必须将它们作为单独的进程运行。