【发布时间】: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 有一些与线程和堆相关的东西,但那是关于延迟的。
标签: java heap-memory