我得到一个大的schedulefuture数据作为Future.get()的返回。我相信schedulefuture只能在get()完成时检索返回。所以它总是会生成一个"java.util.concurrent"。Java .lang.outofmemoryerror . Java堆空间错误
是否有任何替代的解决方案,我可以拆分我的返回部分,当我使用scheduleExecutorService?谢谢。
让任务将结果保存到磁盘,并让get()
方法返回结果写入的File
。
请注意,序列化不会帮助您避免内存问题,因为您首先要避免在内存中创建整个结果(传递它不会使用更多内存)。
您将需要使用"流"方法,其中一小部分数据在创建后立即写入磁盘。
同样地,结果的用户应该将数据流输入,处理内存中的一小部分,然后丢弃这部分(取消引用),然后再读取更多的数据。
为了方便,您也可以考虑使用一个临时文件:
File file = File.createTempFile("foo", "dat");
file.deleteOnExit(); // optional, but safer