我正在使用一个应用程序,它需要每秒对1000个对象进行去分类,对postgres数据库进行验证,然后使用SQS重新序列化要发送到下一个进程的数据。我一直在观察的是,经过一个小时左右的时间,我开始从连接池中获得大量的数据库连接。我认为这是由于我的堆空间最大化所导致的垃圾收集时间过长。 GC每隔几秒运行一次,导致明显滞后。似乎java无法跟上需要创建/销毁的对象的数量,并且一旦初始堆分配耗尽并且GC需要更频繁地开始运行并且更积极地一切都会崩溃。
需要创建/销毁具有高吞吐量的大量对象的应用程序的最佳实践是什么?
当机器处于错误状态时,这是jstat的输出:
S0C S1C S0U S1U EC EU OC OU MC MU CCSC CCSU YGC YGCT FGC FGCT GCT
780288.0 800768.0 0.0 0.0 3015680.0 3015680.0 9313280.0 9312970.9 55680.0 54500.5 6272.0 6013.2 470 101.671 390 6241.164 6342.835
780288.0 800768.0 0.0 0.0 3015680.0 3015680.0 9313280.0 9312970.9 55680.0 54500.5 6272.0 6013.2 470 101.671 390 6241.164 6342.835