我有一个庞大的JavaFX应用程序,主要使用FXML文件来创建视图,我注意到内存使用率很高但是暂时忽略了它。调查后我发现每个视图都消耗了很多,但是,在关闭表单后,垃圾收集器完成了这项工作并释放了使用的内存。 例如,滚动抛出一个大约有的表视图。 1000个元素[附加屏幕截图],内存使用量从350 MB增加到780 MB,
在滚动时会发生同样的情况,抛出一个列表视图,显示表视图的相同数据:
问题是,这是正常的吗?或者我可能做错了什么更新
对于表格视图,我正在执行以下操作来生成列:
public static <T> TableColumn<T, T> generateGraphicColumn(String title, Callback<TableColumn<T, T>, TableCell<T, T>> callback) {
TableColumn<T, T> column = generateColumn(title, null);
column.setCellValueFactory(new Callback<TableColumn.CellDataFeatures<T, T>, ObservableValue<T>>() {
@Override
public ObservableValue<T> call(CellDataFeatures<T, T> param) {
SimpleObjectProperty<T> s = new SimpleObjectProperty<>();
s.setValue(param.getValue());
return s;
}
});
column.setCellFactory(callback);
return column;
}
public static <T> TableColumn<T, T> generateGraphicColumn(String title, Callback<TableColumn<T, T>, TableCell<T, T>> callback, double width) {
TableColumn<T, T> column = generateGraphicColumn(title, callback);
column.setMaxWidth(width);
column.setMinWidth(width);
return column;
}
public static <T,S> TableColumn<T, S> generateColumn(String title,
Callback<TableColumn.CellDataFeatures<T, S>, ObservableValue<S>> propertyValueFactory) {
TableColumn<T, S> column;
column = new TableColumn<>();
if (propertyValueFactory != null)
column.setCellValueFactory(propertyValueFactory);
column.setStyle(column.getStyle() + "-fx-alignment: BASELINE_CENTER;");
column.setText(title);
return column;
}
我使用上面的代码如下:
{ // status
TableColumn<Visit, Visit> column = TableViewUtilities.generateGraphicColumn(text("General.STATUS"),
new Callback<TableColumn<Visit, Visit>, TableCell<Visit, Visit>>() {
@Override
public TableCell<Visit, Visit> call(final TableColumn<Visit, Visit> param) {
final TableCell<Visit, Visit> cell = new TableCell<Visit, Visit>() {
@Override
public void updateItem(Visit item, boolean empty) {
super.updateItem(item, empty);
if (empty || getIndex() < 0) {
setGraphic(null);
setText(null);
return;
}
item = getTableView().getItems().get(getIndex());
Label label = new Label();
StackPane pane = new StackPane(label);
pane.setAlignment(Pos.CENTER);
label.setMaxWidth(10);
label.setMinWidth(10);
label.setMinHeight(30);
setText(item.getStatus().display());
String background = FXMLConstants .toHexString(ColorUtils.getVisitBackgroundColor(item));
pane.setStyle(String.format("-fx-background-color:%s;;", background));
setGraphic(pane);
setText(item.getStatus().display());
setStyle(getStyle() + "-fx-alignment: CENTER_LEFT;");
}
};
return cell;
}
}, 100);
column.setComparator(VisitCommonHelper.getCompByStatus());
tblVisits.getColumns().add(column);
}
答案 0 :(得分:3)
您正在为每个非空单元格更新创建新的 With webClient
.Headers.Add("Content-Type", Web.MimeMapping.GetMimeMapping("C:\filename.txt"))
.Headers.Add("Keep-Alive", "true")
.Headers.Add("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; .NET CLR 1.0.3705;)")
.Credentials = New Net.NetworkCredential("UserName", "password")
End With
和Label
,这可以解释为什么堆使用量上升但可能是垃圾收集。
您可以尝试通过缓存节点(StackPane
在您的案例中Label
)来解决问题 - 只创建一次:
StackPane
此外 - 如果您从未设置其文本,标签的用途是什么?细胞的final TableCell<Visit, Visit> cell = new TableCell<Visit, Visit>() {
private Label label;
private StackPane pane;
{
// This is the constructor of the anonymous class. Alternatively, you may choose to create the label and pane lazily the first time they're needed.
label = new Label();
pane = new StackPane(label);
pane.setAlignment(Pos.CENTER);
label.setMaxWidth(10);
label.setMinWidth(10);
label.setMinHeight(30);
}
@Override
public void updateItem(Visit item, boolean empty) {
super.updateItem(item, empty);
if (empty || getIndex() < 0) {
setGraphic(null);
setText(null);
return;
}
item = getTableView().getItems().get(getIndex());
setText(item.getStatus().display());
String background = FXMLConstants.toHexString(ColorUtils.getVisitBackgroundColor(item));
pane.setStyle(String.format("-fx-background-color:%s;;", background));
setGraphic(pane);
setText(item.getStatus().display());
setStyle(getStyle() + "-fx-alignment: CENTER_LEFT;");
}
};
是多少?节点是否显示?