Освобождение памяти при закрытии веб-браузера javafx
У меня проблема с простым приложением, использующим JavaFX, которое открывает веб-страницу при нажатии на элемент списка.
Это действительно простое приложение, которое, тем не менее, использует около 100 Мб памяти только для отображения списка задач. Когда я открываю одну из задач списка во встроенном браузере, предоставленном JavaFX, используемая память резко увеличивается до ~400 МБ, что огромно для такой простой программы.
Проблема возникает, когда я закрываю окно браузера, так как память не освобождается. Осталось около 350 мб.
Поскольку у нас есть проблемы с производительностью этого приложения, я пытаюсь найти способ уменьшить потребление памяти.
Вы знаете способ освободить память после закрытия окна браузера? Работает ли он так же, как и для вкладок (JavaFX сохраняет ссылку на последнюю закрытую вкладку, как описано здесь: Закрытие вкладок JavaFX не освобождает память от ArrayLists и TableViews на этой вкладке)?
Вот класс, который содержит браузер:
public class CustomBrowser extends Region {
final WebView browser = new WebView();
final WebEngine webEngine = browser.getEngine();
private Application application;
private int loaded;
public CustomBrowser(final String url, int width, int height, boolean debug, final Application application) {
this.application = application;
if(application.config.isProxyWebview()){
System.setProperty("http.proxyHost",application.config.getProxyHost());
System.setProperty("http.proxyPort",String.valueOf(application.config.getProxyPort()));
}
Authenticator.setDefault(new CustomAuthenticator(application.config.getProxyUsername(),application.config.getProxyPassword()));
init(url, width, height, debug, application, true);
}
public CustomBrowser() {
super();
}
private void init(String url, int width, int height, boolean debug, final Application application, final boolean autoclose) {
//apply the styles
getStyleClass().add("browser");
// process page loading
browser.setPrefWidth(width);
browser.setPrefHeight(height);
webEngine.getLoadWorker().stateProperty().addListener(
new ChangeListener<State>() {
@Override
public void changed(ObservableValue<? extends State> ov,
State oldState, State newState) {
// System.out.println("onChange : oldState="+oldState+" - newState="+newState);
if (newState == State.SUCCEEDED) {
loaded++;
if(loaded==2 && autoclose){
application.refreshAll();
Stage stage = (Stage) getScene().getWindow();
stage.close();
}
// JSObject win = (JSObject) webEngine.executeScript("window");
// win.setMember("app", new JavaApp());
}
}
}
);
// load the home page
webEngine.load(url);
//add components
getChildren().add(browser);
if(debug){
TextField copyableUrl = new TextField(url);
copyableUrl.setEditable(false);
copyableUrl.getStyleClass().add("copyable-label");
getChildren().add(copyableUrl);//new Label(url)
}
}
public CustomBrowser(final String url, int width, int height, boolean debug, final Application application, final boolean autoclose) {
init(url, width, height, debug, application, autoclose);
}
public String getUserAgent(){
application.LOGGER.info("User Agent : {}", webEngine.getUserAgent());
return webEngine.getUserAgent();
}
// JavaScript interface object
public class JavaApp {
public void exit() {
Platform.exit();
}
}
}