Tag: 堆堆

Java堆越慢越慢

我有一个在(大)图上运行的Java程序。 因此,它使用了大量的堆空间(~50GB,约占主机上物理内存的25%)。 有一次,程序(重复)从图中选择一个节点并用它进行一些计算。 对于某些节点,此计算需要比预期更长的时间(30-60分钟,而不是预期的几秒钟)。 为了分析这些操作以找出需要花费大量时间的内容,我创建了一个测试程序,它只创建大图的一小部分,然后在其中一个节点上运行相同的操作原计划。 因此,与原始程序相比,测试程序显然只使用非常少的堆空间。 事实certificate,在原始程序中花费48分钟的操作可以在测试程序中在9秒内完成。 这真让我困惑。 第一个想法可能是较大的程序花了很多时间在垃圾收集上。 所以我打开了VM垃圾收集器的详细模式。 据此,在48分钟内没有完整的垃圾收集,年轻一代只有大约20个收集,每个收集不到1秒。 所以我的问题是还有什么可以解释时间的巨大差异? 我不太了解Java如何在内部组织堆。 对于具有大量活动对象的大型堆,是否需要更长的时间? 可能是在这样的设置中对象分配需要更长的时间,因为在堆中找到足够的位置需要更长的时间吗? 或者VM是否会对堆进行任何内部重组,这可能需要花费很多时间(显然除了垃圾收集之外)。 我正在使用Oracle JDK 1.7,如果这非常重要的话。

特定于线程的堆分配

是否有可能使一些线程子集(例如来自特定的ThreadPool)从自己的堆中分配内存? 例如,大多数线程都是从常规共享堆分配的,很少有工作线程从各个堆分配(每个线程1:1)。 目的是确保在共享环境中安全执行代码 – 典型的worker是无状态的并且在单独的线程上运行,处理一个请求不应该消耗超过4MB的堆。 更新#1 Re:但为什么你担心“安全执行”和不可预测的堆消耗增加? 关键是在我的进程中安全托管任意第三方Java代码。 有一点是由于第三方代码中的错误导致我的整个过程没有“内存不足”。 更新#2 Re:从限制每个线程的内存使用量来看,在Java中语言是不可能的 根据我的调查,在我发布这个问题之前,我的意见是一样的,我只是希望我错过了一些东西。 我现在看到的唯一可能的用例替代解决方案是…… 1) 我的java线程需要多少内存? – 跟踪某些调控器线程中的线程内存使用情况并终止坏线程 2) 在我自己的JVM上运行Java代码 – 是的,这是可能的。 你可以下载一个JVM开源实现,修改它…… 🙂