Java垃圾收集和原子事件/停止gc暂停中断一系列函数调用

时间:2013-03-26 11:24:05

标签: java performance garbage-collection jvm-hotspot

我有一个复杂的大型多线程应用程序,我正在引入新的功能。

我已经添加了对一块专业硬件的调用(通过供应商提供的JNI lib)。然而,在调用那个(非常快)函数之前,事先完成了一些工作来填充发送给它的数据结构。

然而,该应用程序的GC配置文件非常不稳定/不良,似乎这些人口步骤中的一些正被GC中断。这很重要,因为时间需要在第一个事件和切换到硬件资源之间保持不变或尽可能保持不变。

有没有办法说,“sychronise for GC”,这些操作是为了在停止世界GC暂停期间不会被阻止?

在RHL5.5上使用64位1.7 JDK

由于

4 个答案:

答案 0 :(得分:3)

如果事实上在完全垃圾收集过程中你遇到了问题,那么问题是如何降低这些完全垃圾收集扫描的频率。

首先,尝试分析触发这些完全扫描的情况,一般情况下堆空间是否正常运行?如果是这样,为什么你经常在堆上运行不足(某处有潜在的泄漏?)

此外,在较小(较快)的垃圾收集期间,物体从年轻一代(伊甸园和幸存者1)移动到幸存者2.如果它不适合幸存者2,他们将被转移到终身,如果有在终身教职的空间不够,你会触发全面的扫射。所以,如果你的年轻一代很大,并且你有一定数量的长时间运行的物体,这可能会引起问题。

在一天结束时,你必须分析它。描述您的应用程序,并确定您何时以及为何看到完整的垃圾收集,然后调整您的应用程序以减少它们的频率,或者可能确保您很少能够“控制”它们何时发生。

答案 1 :(得分:2)

GC行为不确定,因此无法确保同步。

我想到了三个选择:

  • 您是否正在创建大量对象来填充数据结构 每次通话?也许你可以重复使用它们来避免填充堆和GC 自动呼叫。
  • 使用更多预先分配的内存运行VM以隔离gc调用。
  • 当您的应用程序无害时,请自行致电System.gc()。 这个调用只是一个建议(JVM可以忽略它),但我会给它 试一试。

无论如何,满足您需求的最佳选择是使用真正的实时语言实现而不是Java

答案 2 :(得分:2)

为了完整起见,您还可以使用实现实时Java (RTSJ)的JVM。

在实时JVM中,您可以在 中断任何<的线程中执行时间敏感任务 strong> GC活动。不幸的是,目前没有很多可用的RT JVM。

答案 3 :(得分:2)

如果您正在构建新的时间敏感任务,并且无法使用该任务修复JVM的GC行为,则另一个选项是您可以将任务移动到单独的JVM。

进程间/机器通信意味着具有更高的最低性能,但在进行JNI通信的单独JVM实例中,您可以比在父进程中更自由地调整GC,从而更好地控制波动。