有效使用Java堆内存

时间:2017-05-08 18:57:46

标签: java multithreading out-of-memory heap-memory

我想问的确切问题已经回答here。我仍然只想探索更多的可能性(如果有的话)。

场景:我的应用程序是基于线程的以数据为中心的Web应用程序,用户在运行时决定数据量。用户可以请求一些数据操作,这会触发多个线程,每个线程传输自己的数据。有时,数据选择会使应用程序崩溃,因为OutOfMemoryError是在Java堆中分配新对象的空间不足。当有多个用户同时使用该应用程序并且大多数用户请求大数据操作时,这种情况(OutOfMemoryError)更有可能发生。

问题:有没有办法可以防止整个应用程序崩溃?我可以限制在内存中提取的数据量但是有没有比这更好的方法?即使在限制每个用户的数据量之后,多个并发用户也可以生成OutOfMemoryError。一个用户可以被搁置或退出而不是全部存活。

1 个答案:

答案 0 :(得分:1)

我一直经历以下几点:

  • 流式传输大数据。与Accept-Inflate上的GZIPOutputStream结合使用(可能作为servlet过滤器)。这可以对文件系统和数据库完成。还存在(基于URL的)XML管道,其中可以流式传输部分XML。

这降低了内存成本,可能会限制流(明确放慢速度。

  • PDF生成:优化PDF,重复图像只存储一次,合理的字体使用(理想情况下是PDF字体,否则嵌入字体)。

  • Office文档:OpenOffice或Microsofts xlsx / docx变体。

在您的情况下:

让每个进程都可以组合并将结果流式传输到一个输出流:任务的分支管道。如果可以使用相同的参数调用此类任务,从而生成相同的数据,则可以使用参数化URL并缓存结果。

我知道这个答案可能不合适。