我有一个JavaFX应用程序,显示一个带有多个选项卡的TabPane,就像一个普通的浏览器。
我通常在这些选项卡中加载一些网格。每次选择一个选项卡时,旧的选项卡内容就会被丢弃,新的选项卡就会被加载(从服务器上)。
问题是当你点击旧的选项卡时,必须等待它再次加载。我想要像现代浏览器一样拥有相同的行为,并保存我的应用程序中的内容。问题是,我不知道我的应用程序分配了多少内存,以及可以打开多少个选项卡。
基本上,我正在检查我还剩下多少内存(通过以下答案Java get available memory),如果我不够,我就释放所有选项卡内容。因此,我的应用程序能够使用800Mo的内存运行,但如果有人有6Go的内存,体验将更好。
在内存释放过程结束时,我手动调用垃圾回收器,因为我发现释放我的选项卡内容(允许它们被垃圾回收)不是立即的。我知道这很糟糕,但另一方面,我不依赖于垃圾回收器。如果没有调用,那也没关系,我的选项卡内容最终会被收集起来。以下是所谓的方法:
我通常在这些选项卡中加载一些网格。每次选择一个选项卡时,旧的选项卡内容就会被丢弃,新的选项卡就会被加载(从服务器上)。
问题是当你点击旧的选项卡时,必须等待它再次加载。我想要像现代浏览器一样拥有相同的行为,并保存我的应用程序中的内容。问题是,我不知道我的应用程序分配了多少内存,以及可以打开多少个选项卡。
基本上,我正在检查我还剩下多少内存(通过以下答案Java get available memory),如果我不够,我就释放所有选项卡内容。因此,我的应用程序能够使用800Mo的内存运行,但如果有人有6Go的内存,体验将更好。
在内存释放过程结束时,我手动调用垃圾回收器,因为我发现释放我的选项卡内容(允许它们被垃圾回收)不是立即的。我知道这很糟糕,但另一方面,我不依赖于垃圾回收器。如果没有调用,那也没关系,我的选项卡内容最终会被收集起来。以下是所谓的方法:
/**
* Before an action that may take some memory, we check how much memory we
* have left. If memory is short, we go through the Tab in order to release
* them if possible.
*/
public void verifyMemory() {
long allocatedMemory = (Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory());
long memoryLeft = Runtime.getRuntime().maxMemory() - allocatedMemory;
System.out.println(memoryLeft/1000000);
//We must release some memory
if (memoryLeft < MEMORY_TRESHOLD) {
LOGGER.warn("Memory treshold is hit, we must release memory");
for (Tab tab : getTabs()) {
if (tab instanceof MyTab) {
((MyTab) tab).destroyIfPossible();
}
}
System.gc();
}
}
你对我的解决方案有强烈的反对意见吗?或者有什么想法可以改进或帮助我实现目标吗?
SoftReference
了吗? - biziclop