为什么将对象初始化为null不会取消引用java中的对象?

时间:2014-02-06 08:43:52

标签: java memory memory-management memory-leaks

我正在使用一个应用程序,我已经实现了观察者模式,它将在模型中更改滑块值。 我有一个名为clear的按钮,它将清除窗口并在删除监听器之前将观察者设置为null。所以在此之后我使用探查器进行了内存映射。但我害怕发现对象仍在那里。 在我的第二个exp中,在使观察者为null之前,我首先删除所有的侦听器,然后将其设为null,并且我从分析器中发现该对象现在由垃圾收集器收集。 下面我提供了此代码的片段。很高兴看到这一点。

  controls = new Createcontrols();
        Scene scene = new Scene(new Group());

        stage.setTitle("Table View Sample");
        stage.setWidth(300);
        stage.setHeight(500);

        final VBox vbox = new VBox();
        vbox.setSpacing(5);
        vbox.setPadding(new Insets(10, 0, 0, 10));
        controlbox = controls.creatControls();
        vbox.getChildren().add(controlbox);
        final Button clear = new Button("clear");
        vbox.getChildren().add(clear);
        EventHandler deletehnadler=     new EventHandler<ActionEvent>(){

            @Override
            public void handle(ActionEvent arg0) {
                // TODO Auto-generated method stub
                vbox.getChildren().clear();
                // controls.dispose();
                controls=null;                   
            }      
          };

Createcontrol class:

package com.nxp.designpattern.observer;

import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.geometry.Insets;
import javafx.scene.control.Button;
import javafx.scene.control.Slider;
import javafx.scene.layout.VBox;

public class Createcontrols implements ObserverInterface {

    private Slider slider;
    private static int counter;
    private Subject m_subject;
    private Button next_button;
    private Button previous_buttButton;
    private EventHandler<ActionEvent> nexteventhandler;
    private EventHandler<ActionEvent> prevhandler;

    public Createcontrols() {
        m_subject = new Subject();
        ObserverImpl.getObserverImpl().addListener(this);

    }

    public VBox creatControls() {
        final VBox vbox = new VBox();
        vbox.setSpacing(5);
        vbox.setPadding(new Insets(10, 0, 0, 10));
        next_button = new Button("next");
        previous_buttButton = new Button("Previous");

        slider = new Slider();
        vbox.getChildren().add(next_button);
        vbox.getChildren().add(previous_buttButton);
        vbox.getChildren().add(slider);
        nexteventhandler = new EventHandler<ActionEvent>() {

            @Override
            public void handle(ActionEvent arg0) {
                // TODO Auto-generated method stub
                counter += 10;
                m_subject.setValue(counter);
            }
        };
        next_button.addEventHandler(ActionEvent.ACTION, nexteventhandler);
        prevhandler = new EventHandler<ActionEvent>() {

            @Override
            public void handle(ActionEvent arg0) {
                // TODO Auto-generated method stub
                counter -= 10;
                m_subject.setValue(counter);
            }
        };
        previous_buttButton.addEventHandler(ActionEvent.ACTION, prevhandler);
        return vbox;
    }

    @Override
    public void changeinvalue(int value) {
        slider.setValue(value);

    }

    void dispose() {
        next_button.removeEventHandler(ActionEvent.ACTION, nexteventhandler);
        // nexteventhandler=null;
        previous_buttButton.removeEventHandler(ActionEvent.ACTION, prevhandler);
        // prevhandler=null;
        ObserverImpl.getObserverImpl().removeListener(this);
    }
}

1 个答案:

答案 0 :(得分:1)

“在我的第二个exp中,在使观察者为null之前,我先删除所有的侦听器,然后将其设为null” 这是问题/解决方案。变量只是一个指针,将其设置为null不会对实际对象执行任何操作,并且侦听器仍然具有引用,因此它永远不会被垃圾回收。您必须删除所有引用。