我在使用JavaFX的简单应用程序时遇到问题,该应用程序在单击列表元素时打开网页。
这是一个非常简单的应用程序,但它只使用大约100 Mb的内存来显示任务列表。 当我在JavaFX提供的嵌入式浏览器中打开列表中的一个任务时,使用的内存大幅增加到~400Mb,这对于这样简单的程序来说是巨大的。
当我关闭浏览器窗口而未释放内存时,会出现问题。它仍然在350 MB左右。
由于我们遇到了此应用程序的性能问题,我试图找到一种方法来减少内存消耗。
关闭浏览器窗口后,您知道一种释放内存的方法吗?它是否与制表符的工作方式相同(JavaFX保留了最后一个关闭制表符的引用,如下所述:Closing JavaFX tabs doesn't release memory from ArrayLists and TableViews in that tab)?
这是包含浏览器的类:
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();
}
}
}