繁体   English   中英

AIX服务器中的IBM Java堆内存问题

[英]IBM java Heap memory issue in AIX server

我在AIX服务器IBM Java中遇到了一些堆内存问题。

首先说明问题,下面是C#代码调用的Java方法,Java代码返回数组列表。 即报告对象的运行方法给出了数组列表。 然后,C#代码会将数组列表写入文件。 这是现有的框架。

public List runReport( Integer ifeId, List params ) throws ReferenceCoreException
    {
        ReportInterface report=new ReportInterface();
        // sanity check
            // run the report
            // MED: need a way of getting this session's data source
            return report.run( HibernateSession.getDataSource(), ifeObj, params);
        }
        catch ( Exception e )
        {
            throw new ReferenceCoreException( e );
        }
}

每当我们进行堆转储时,它就会显示内存已满。 即Xmx是8 GB,堆转储也说7.9 GB已满。

我的问题是:一旦返回数组列表,理想情况下应该由GC清除它。 如果不能,则可以添加finally块并使报表对象为null,如下所示?

public List runReport( Integer ifeId, List params ) throws ReferenceCoreException
    {
        ReportInterface report=new ReportInterface();
        // sanity check
            // run the report
            // MED: need a way of getting this session's data source
            return report.run( HibernateSession.getDataSource(), ifeObj, params 
              );
        }
        catch ( Exception e )
        {
            throw new ReferenceCoreException( e );
        }
    Finallay
       {
        report=null;
      }
  }

我认为,如果我们将报表对象设置为null,则应断开报表对象与run方法返回的数组列表之间的连接,并且GC可以回收数组列表堆内存。 这是正确的吗? 如果我的理解错了,请纠正我。

还建议一旦report.run方法将数组列表返回给C#,是否还有其他方法可以清除数组列表?

同样为什么AIX服务器IBM Java不会抛出内存不足错误,而Java进程却只是挂了呢?

report是方法局部变量,方法离开后立即变为符合GC的条件。

显式设置null与方法返回时隐式发生的操作相同。

这个问题可能也有帮助

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM