Java - 在方法VS中创建新对象,将其声明为类成员

时间:2018-04-16 10:10:45

标签: java performance memory javafx jvm

假设我们有一个方法可以删除ListView中的所有项目,然后添加Label以及用户指定的文本:( 标签用作示例,它可以通过任何对象

示例A保留较小的变量范围,但在每个方法调用上创建一个新的Object:

public void populateListView() {
   listView.getItems().clear();
   Label label = new Label("some string from user");
   listView.getItems().add(label);
}

示例B具有更宽的变量范围,但在类加载时仅创建一次Object。此外,不是创建新的Label,而是使用相同的Label引用。

public class MyClass{
    private Label label = new Label();

    public void populateListView() {
        listView.getItems().clear();
        label.setText("some string from user");
        listView.getItems().add(label);
    }
}

我们可以看到,在示例A中,第一行清除了listView的所有对象引用。

这是否意味着,在新方法调用中,前一个方法调用中创建的Label将被垃圾收集(以及有多快)?

换句话说,考虑到我们多次调用每个方法,示例B在内存分配方面会更有效吗?如果是的话,考虑'始终保持最小的范围'哪个例子应该被选择以及为什么?

1 个答案:

答案 0 :(得分:2)

应避免过早优化,因为它会降低代码质量 此外,如果你有一个内存问题,很可能它是主要原因,因为Label不是一个重物(对象本身,而不是它的渲染),你不会创建成千上万的方法。
因此,让垃圾收集器完成其工作并通过将变量范围缩小到严格要求(示例A)来保持清晰的代码。

如果稍后您在运行时遇到内存问题,请对应用程序进行概要分析(例如使用JVisualVM)来发现罪魁祸首(很可能不是这个)。