有没有办法在内存中保留巨大的Java变量以节省加载时间?

时间:2016-04-05 10:10:54

标签: java memory intellij-idea

我正在使用IntelliJ,我正在内存中加载大量文件。每次运行应用程序时都需要花费一些时间来加载它们。

有没有办法在运行之间将它们保存在内存中?

2 个答案:

答案 0 :(得分:2)

  

有没有办法在运行之间将[加载的文件]保留在内存中?

总之,没有。

您可以做的最好的事情是优化加载时间,或者重新构建应用程序,以便它不需要加载所有文件。

以下是建议:

  • 不是将所有数据加载到JVM的内存中,而是将其存储在传统或“nosql”数据库中(在光盘上或内存中 1

  • 重构应用程序/分区问题,以便您不需要同时在内存中的所有内容。

  • 懒洋洋地加载文件。

  • 通过内存映射缓冲区访问文件中的信息,并避免将其全部转换为堆对象。

这些想法都不是直截了当的。我无法预测哪些(如果有的话)会有效...没有更多关于你想要做什么的信息。

1 - 也就是说,在单独的数据库服务器的内存中。当然,当您启动/重新启动内存数据库服务器时,他们必须从光盘加载数据,但您可以让许多应用程序JVM以串行或同时方式与数据库通信。 < / p>

答案 1 :(得分:0)

一种解决方案是将应用程序重构为两个较小的应用程序,这些应用程序通过环回相互通信。其中一个应用程序可以负责提供文件,另一个应用程序可以使用它们。提供文件的应用程序可以使用字节数组保存在文件的内存高速缓存中,直到达到某个内存限制。

然后,您可以根据需要重新启动使用它们的应用程序,而无需重新启动提供(和缓存)文件的应用程序。

您甚至不必将应用程序拆分为两个。例如,Linux确实在内存中缓存文件。因此,调整文件系统缓存会有所帮助,因此尽可能多的文件存储在内存中。需要考虑很多配置选项。您希望文件驻留在缓存中多长时间?文件相对于最大缓存大小有多大?以下问题的答案对此有所启发:

https://unix.stackexchange.com/questions/30286/can-i-configure-my-linux-system-for-more-aggressive-file-system-caching

可能还需要仔细检查您正在使用的JVM实现,只是为了确保它不会绕过缓存并强制读取硬盘驱动器,尽管我非常怀疑这种情况会发生。