У меня есть приложение JavaFX, которое отображает TabPane с несколькими вкладками, как обычный браузер.Бесплатный сборщик памяти и мусора
Обычно я загружаю некоторые сетки внутри этих вкладок. Каждый раз, когда выбрана вкладка, старая вкладка содержит, а новая вкладка загружается (с сервера).
Проблема заключается в том, когда вы нажимаете на старую вкладку, вам нужно подождать, прежде чем она будет загружена снова. Я хочу иметь то же поведение, что и современный браузер, и сохранять содержимое в своем приложении. Проблема в том, что я не знаю, сколько памяти было отдано моему приложению, и сколько вкладок можно открыть.
В основном, что я делаю, это проверка того, сколько памяти у меня осталось (следуя этому ответу 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();
}
}
Есть ли у вас сильный совет против моего решения? Или любые идеи, которые могли бы улучшить или помочь мне достичь моей цели?
Да, нет гарантии, что это вызвано при вызове ... System.gc(); –
Да, это не гарантировано. Хотя, это будет работать в большинстве случаев. –
Вещь, я не полагаюсь на нее. Если это называется, это лучше, если нет, это тоже не проблема. Вот почему я позволил себе называть это. – Maxoudela