JavaFX - 内存消耗

时间:2017-07-12 09:07:28

标签: memory javafx

我有一个庞大的JavaFX应用程序,主要使用FXML文件来创建视图,我注意到内存使用率很高但是暂时忽略了它。调查后我发现每个视图都消耗了很多,但是,在关闭表单后,垃圾收集器完成了这项工作并释放了使用的内存。 例如,滚动抛出一个大约有的表视图。 1000个元素[附加屏幕截图],内存使用量从350 MB增加到780 MB,

Table View Table View Memory Consumption

在滚动时会发生同样的情况,抛出一个列表视图,显示表视图的相同数据:

List View List View Memory Consumption

问题是,这是正常的吗?或者我可能做错了什么

更新

对于表格视图,我正在执行以下操作来生成列:

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);
    }

1 个答案:

答案 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;"); } }; 是多少?节点是否显示?