我的 Glassfish 服务器上运行了几个由@TimerService
实例实现的后台任务。这些服务的目标是从文件中提取数据并将该数据插入数据库。
我最初尝试在 JPA 中执行此操作,但系统很容易停滞不前,我现在已将进程转换为响应速度更快的 JDBC。但是,沿途的某个地方仍然存在巨大的内存泄漏,我无法确定。
每个文件都以管理自己的事务的方法提取(1 个文件 = 1 个事务)。我认为一旦这种方法最终确定所有变量松散范围并被 GC'ed,但事实并非如此。经过很短的时间,我正在经历OutOfMemoryException
。
我想知道 Glassfish 是否、如何以及为什么会保留对我的变量(它们是非常重的对象)的引用。我可以应用哪些设置或方法来最大程度地减少这些内存泄漏?
作为参考,我正在使用库存的 Glassfish 设置并进行了一些修改:
-XX:+CMSPermGenSweepingEnabled
-XX:+CMSClassUnloadingEnabled
-XX:MaxPermSize=256m
–XmX1024m