特定于线程的堆分配

时间:2012-01-17 11:18:38

标签: java heap heap-memory

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

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

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

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

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

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

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

1)How much memory does my java thread take? - 跟踪某些调控器线程中的线程内存使用情况并终止坏线程

2)Run Java code on my own JVM - 是的,这是可能的。您可以下载JVM开源实现,修改它......:)

3 个答案:

答案 0 :(得分:4)

签出Java nonblocking memory allocation - 线程通常已经从他们自己的分配块中分配内存。因此,如果速度令人担忧,Sun就会为您做到这一点。

至于限制每个线程的内存使用量,在Java语言中它是不可能的。在JVM和Java中是否可能(或有意义)平台是一个有趣的问题。你当然可以这样做the same way as any memory profiler does,但我担心管理系统很快就会超过应用程序本身。

答案 1 :(得分:2)

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

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

理论上,你可以为这样的目的创建可重用对象池,但性能几乎肯定会比明显的替代方案更差。

答案 2 :(得分:2)

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

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

相关问题