为什么这个Java程序会导致内存泄漏?

为什么这个Java程序会导致内存泄漏?,java,linux,javafx,memory-leaks,windows-7,Java,Linux,Javafx,Memory Leaks,Windows 7,此代码导致NetBeans探查器无法看到的内存泄漏。漏洞在Windows上并没有那么严重,看起来很平稳,但在运行Linux机器时绝对会占用内存。如果我注释掉标签上的setText方法,内存就不会泄漏。如果我打印到控制台而不是将文本发送到标签,则不会发生泄漏 我认为setText()方法出于某种原因保留了旧值 import javafx.application.Platform; import javafx.embed.swing.JFXPanel; import javafx.geometry.

此代码导致NetBeans探查器无法看到的内存泄漏。漏洞在Windows上并没有那么严重,看起来很平稳,但在运行Linux机器时绝对会占用内存。如果我注释掉标签上的setText方法,内存就不会泄漏。如果我打印到控制台而不是将文本发送到标签,则不会发生泄漏

我认为setText()方法出于某种原因保留了旧值

import javafx.application.Platform;
import javafx.embed.swing.JFXPanel;
import javafx.geometry.Orientation;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.layout.FlowPane;
import javafx.stage.Stage;

/**
 *
 * @author admin
 */
public class Sandbox {


    Label theLabel;
    boolean isUpdating = false;
    int count = 0;

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        new Sandbox();
    }   

    public Sandbox(){

        new JFXPanel(); // this will prepare JavaFX toolkit and environment
        FlowPane root = new FlowPane(Orientation.VERTICAL);

        Platform.runLater(new Runnable() {
            @Override
            public void run() {
                Scene scene = new Scene(root, 600, 600);
                Stage stage = new Stage();
                stage.setScene(scene);
                stage.show();
            }
        });

        theLabel = new Label();
        root.getChildren().add(theLabel);

        while(true){
            try{
                count ++;
                if(isUpdating == false){
                    isUpdating = true;
                    Platform.runLater(new Runnable(){
                        public void run(){
                            theLabel.setText("TEST:" + count); //The culprit
                            isUpdating = false;
                        }
                    });
                }
                Thread.sleep(0);
            }catch(InterruptedException ex){

            }
        }
    }
}

JavaFX似乎与默认Linux驱动程序(Noveau)存在问题。在我为我的系统安装了正确的图形驱动程序(NVidia Quatro K2200)后,内存泄漏消失了

你确定它实际上是在泄漏内存,而不仅仅是使用所有可用的东西吗?JVM通常不会清理垃圾,除非它必须这样做。这种无限循环不可能是好的…@Reimeus:在生产环境中,这段代码是使用执行器服务和调用自身的runnable运行的。我试图缩小并简化程序,使错误更容易找到。@resueman:Netbeans探查器显示内存堆保持在100MB左右,但系统监视器显示内存的使用速度为每秒50MB左右。您是否使用计划执行器服务,哪一个定期执行runnable,还是只将其排队一次?您用来执行runnable的方法是什么?