import javafx.application.Application;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Menu;
import javafx.scene.control.MenuBar;
import javafx.scene.control.MenuItem;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;
import java.lang.ref.WeakReference;
import java.util.ArrayList;
import java.util.Arrays;

public class App extends Application {

    private static final ArrayList<WeakReference<MenuItem>> uncollectedMenuItems = new ArrayList<>();

    private static void clearNullMenuItems() {
        uncollectedMenuItems.removeIf(ref -> ref.get() == null);
    }

    private static void launchNewStage(Stage stage) {
        MenuItem menuItem = new MenuItem("Restart Stage");
        menuItem.setOnAction(actionEvent -> {
            launchNewStage(new Stage());
            stage.close();
        });
        uncollectedMenuItems.add(new WeakReference<>(menuItem));
        MenuBar menuBar = new MenuBar(new Menu("MENU", null, menuItem));
        Button button = new Button("Call GC and Print MenuItems");
        button.setOnAction(actionEvent -> {
            System.gc();
            clearNullMenuItems();
            System.out.println(Arrays.toString(uncollectedMenuItems.toArray()));
        });
        StackPane root = new StackPane(menuBar, button);
        StackPane.setAlignment(menuBar, Pos.TOP_CENTER);
        stage.setTitle("JFX-Test");
        stage.setMinWidth(400.0);
        stage.setMinHeight(300.0);
        stage.setScene(new Scene(root));
        stage.show();
    }

    @Override
    public void start(Stage primaryStage) {
        launchNewStage(primaryStage);
    }

    public static void main(String[] args) {
        launch();
    }
} 