Java 关于消除堆空间问题的研究?

Java 关于消除堆空间问题的研究?,java,memory,memory-management,jvm,jvm-crash,Java,Memory,Memory Management,Jvm,Jvm Crash,我们正在构建一个可以加载任何jar文件并运行统计模型的平台。我现在面临的问题是,一些模型运行太大,无法适应我们的平台,导致内存堆不足错误。我知道已经对此进行了研究,但我再也找不到了。本质上,谷歌应用引擎是如何做到这一点的?有人听说过任何基于磁盘的堆空间吗?您可以使用命令行开关来增加堆空间(通常高达2GB) 如果这还不够,那么您需要仔细调整应用程序的内存使用情况,这需要更多关于其设计的信息。基于磁盘的堆空间很小,通常称为虚拟内存,将数据从磁盘移到内存和从内存移回的过程称为交换。过去30年中设计的任

我们正在构建一个可以加载任何jar文件并运行统计模型的平台。我现在面临的问题是,一些模型运行太大,无法适应我们的平台,导致内存堆不足错误。我知道已经对此进行了研究,但我再也找不到了。本质上,谷歌应用引擎是如何做到这一点的?有人听说过任何基于磁盘的堆空间吗?

您可以使用命令行开关来增加堆空间(通常高达2GB)


如果这还不够,那么您需要仔细调整应用程序的内存使用情况,这需要更多关于其设计的信息。

基于磁盘的堆空间很小,通常称为虚拟内存,将数据从磁盘移到内存和从内存移回的过程称为交换。过去30年中设计的任何操作系统都可以做到这一点。它不仅适用于堆,还适用于堆栈、程序内存本身等。尽管速度非常慢,而且现代内存价格通常是不必要的。

您可以使用这些参数指定堆大小

java-Xms1024m-Xmx2048m


第一个是初始尺寸,第二个是最大尺寸。如果没有RAM支持此堆大小,则操作系统将自动执行分页/交换以适应此内存大小。当然,这显然要慢一些。

我假设您已经尽可能地扩展了堆(考虑到物理内存、处理器体系结构、JVM和操作系统的限制)


除此之外,答案是,据我所知,没有JVM实现基于磁盘的堆空间。然而,这并不是一个完全荒谬的想法。曾经有一个学术团体(大部分)研究“正交持久性”问题,即对象在内存和持久性存储之间透明迁移。不幸的是,有一些基本问题使得这项技术。。。很难。(例如,对持久性存储进行垃圾收集,使用多线程应用程序获取逻辑上一致的检查点,以及处理代码更改。)总之,结果是研究领域已经安静下来。

我想我应该提到,我们已经为我们的参考模型调整了JVM。但是,由于这是一个平台,我们不能保证用户加载的任何JAR都不会占用堆空间。这就是为什么我对GAE的解决方案特别感兴趣。我相信他们已经推出了自己的JVM,但除此之外,我没有任何细节。我们的参考模型使用2GB堆运行文件,但我可以很容易地看到下一个模型使用了更多的堆。这太糟糕了。我记得以前我们发现了一些研究论文,但现在我似乎找不到了。我想这是一条死胡同。