【问题标题】:Why does this Java program cause a memory leak?为什么这个 Java 程序会导致内存泄漏?
【发布时间】:2016-02-26 20:54:01
【问题描述】:

此代码会导致 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){

            }
        }
    }
}

【问题讨论】:

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

标签: java linux javafx memory-leaks windows-7


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2011-06-25
    • 1970-01-01
    • 1970-01-01
    • 2022-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多