线程专用堆分配

9
是否可能使一些子线程(例如来自特定线程池)从自己的堆中分配内存?例如,大多数线程都从常规共享堆中分配,而少量工作线程则从各自的堆(每个线程1:1)中分配。
意图是确保在共享环境中安全执行代码 - 典型的工作程序无状态且正在单独的线程上运行,一个请求的处理不应消耗超过4MB的堆。
更新#1 关于“安全执行”和堆消耗的不可预测增加,您为什么担心?
重点在于在我的进程中安全托管任意第三方Java代码。其中一点是避免因第三方代码中的错误而导致整个进程的“内存不足”。
更新#2 有关限制每个线程的内存使用情况,在Java语言中不可能实现
根据我在发布此问题之前调查的结果,我的看法是一样的,我只是希望我错过了什么东西。
目前,我所能看到的唯一可能的替代解决方案是...

1) 我的Java线程占用了多少内存? - 在一些管理线程中跟踪线程内存使用情况并终止不良线程。

2) 在自己的JVM上运行Java代码 - 是的,这是可能的。您可以下载一个JVM开源实现,进行修改... :)


1
不,线程背后的整个理念就是尽可能轻量级,所以它们共享同一堆;如果允许它们这样做,同步也会更加困难。但是你为什么担心“安全执行”和堆消耗的不可预测增加呢? - Viruzzo
2
典型的JVM实现使用线程本地分配缓冲区(TLABs),其中每个线程都有自己的小区域,可以进行小型分配而不需要太多的线程安全开销。但这并不能解决可用性问题。RTSJ涉及线程和堆的一些内容,但那只是关于延迟的。 - Tom Hawtin - tackline
3个回答

5
请查看Java非阻塞内存分配 - 线程通常已经从自己的分配块中分配内存。因此,如果速度是问题,Sun已经为您解决了。
至于限制每个线程的内存使用情况,在Java语言中是不可能的。在JVM和Java平台上是否可能(或有意义)是一个有趣的问题。当然,您可以像任何内存分析器一样进行操作,但恐怕管理系统很快就会超越应用程序本身。

2

不,Java中没有这个概念。有一个“堆”,new从中分配内存。Java的内存分配是线程安全的。你为什么认为创建更多的堆会导致线程消耗更少的内存呢?

如果你想控制线程的内存使用量,就不要分配东西。

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


2

设计上,线程共享堆和其他内存区域。只有栈是真正的线程本地空间,而此空间可能会受限。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接