Datalizer堆内存不足出现无响应的现象

文雅科技术支持客服发表于:2021年09月01日 11:37:20更新于:2022年01月05日 15:01:43

产品名: Dr.Sum Datalizer

版本: Ver5.x、Ver4.x、Ver3.x


<现象>

  • 客户端 

    执行大数据量的汇总表或报表下载时,出现页面无响应的现象。用户页面和维护页面无法打开,或者点击[登录]按钮没有反应。

  • 服务器

    CPU使用率高,可能会出现OutOfMemory错误。


<原因>

Datalizer 是一个基于 Java 的 Web 应用程序,它在“堆内存”上运行,堆内存是 Java 虚拟机上的内存空间。

执行Datalizer的汇总表的过程也是在这个堆内存中进行的。具体处理流程如下:

1.当汇总定义文件执行时,Datalizer Server 接收执行请求。

2.根据汇总定义的内容生成 SELECT 语句并发布到 Dr.Sum Server。

3.Dr.Sum Server 选择数据。

4.将SELECT结果返回给Datalizer Server,Datalizer Server会生成一个报表。

5.将生成的报表返回给客户端,并输出到屏幕或文件(CSV、Excel、PDF)。


步骤【4】的处理是在Datalizer Server分配的堆内存中执行的,但是当堆内存的空闲空间不足时,使用的内存通过 Java 执行垃圾回收(以下称“GC”)来释放。

在GC执行过程中,CPU负载较高,导致服务器机器自身响应速度变慢。

如果即使在执行 GC 后也无法确保所需的内存,则无法继续处理,并且后续处理也可能失败或无法正常运行。 


现象发生时的对策

  • 确认日志中是否输出了“OutOfMemoryError”,这是GC释放堆内存后的错误。 如果输出此错误,则后续处理很可能无法正常执行,因此请重新启动所有 Datalizer Server 服务。

  • 如果未输出OutOfMemoryError,则可能是集计的处理和GC释放内存的处理仍在进行。 在这种情况下,集计可能会过段时间完成,但是在GC处理的时点,CPU 使用率会很高,响应会很慢。 另外,虽然当前没有输出 OutOfMemoryError ,但在后续处理进行中GC无法分配内存,可能会输出。 如果一段时间后该处理还没有完成,或者如果您想立即改善响应,请重新启动 Datalizer Server 服务。

  • 如果服务无法停止的话,请使用任务管理器或OS 命令来强制终止Datalizer 任务。

无论哪种情况,当您重新启动 Datalizer Server 时,所有进程都会被破坏,并且正在实行的集计处理也会被全部取消。


<回避方法>

  • 1.明细报表减少一些非必要的项目,减少出力的列数。

  • 2.设置检索条件,分文件下载。例如时间、分类等项目。

  • 3.通过【按钮操作控制】的设置,实现已点图标(CSV、Excel、PDF)无效化,避免多次请求。

   设置画面:[统计表共用设定]-[设定]-[共用系统设置]-[按钮操作控制]

  • 4.可以增加堆内存的容量,看下载速度是否有改善。

   具体设定步骤如下:

  ①在SMS左侧的菜单中单击[系统管理]-[设定]-[堆设置],从[进程一览]中选择目标服务。

  ②输入内存容量 (MByte) 到[设置大小],然后单击[设定]按钮。

   ※更改后需要重新启动服务才能生效。

增加堆内存的容量,在某些情况下可以改善性能,但实际需要多少堆内存很难计算。因为它取决于要获取的数据的长度、布局中排列的行/列数以及统计结果的数量。因此,建议逐渐增加当前的内存设置量,比如1GB→2GB,然后是4GB→8GB。如果还是无法正常动作,请在可以使用可能的空闲内存范围内考虑继续增加。