0
此代碼導致NetBeans分析器無法看到的內存泄漏。 Windows上的泄漏並沒有那麼糟糕,並且似乎平穩,但是在運行時絕對會殺死Linux機器的內存。如果我註釋掉標籤上的setText方法,則內存不會泄漏。如果我打印到控制檯而不是將文本發送到標籤,則不會發生泄漏。這個Java程序爲什麼導致內存泄漏?
我認爲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通常不會清理垃圾。 – resueman
無限循環不能好... – Reimeus
@Reimeus:在生產中,這段代碼是使用執行程序服務和自行調用的runnable運行的。我試圖削減和簡化程序,使錯誤更容易找到。 –