正如标题所述,我一直在使用ControlsFX依赖项中提供的WorldMapView,但是遇到内存问题...
我的服务器发送每个在线用户的{纬度,经度}列表。我要做的是创建一个Location对象列表,并将其添加到WorldMapView的ListProperty中。
// Attributes
public static ScheduledExecutorService EXECUTOR = Executors.newScheduledThreadPool(1);
public static void main(String[] args){
launch(args);
}
@Override
public void start(Stage stage) throws Exception{
BorderPane contentPane = new BorderPane();
contentPane.setBackground(new Background(new BackgroundFill(Color.BLACK, null, null)));
WorldMapView worldMapView = new WorldMapView();
worldMapView.setCountryViewFactory((country) -> {
CountryView view = new CountryView(country);
Color fillColor = Color.BLACK;
view.fillProperty().set(Color.BLACK);
view.strokeProperty().set(fillColor);
view.strokeWidthProperty().set(1);
return view;
});
worldMapView.getLocations().add(new Location(0, 0));
worldMapView.setLocationViewFactory(location -> {
Circle circle = new Circle();
Color fillColor = Color.BLACK;
circle.setFill(fillColor);
circle.setRadius(8);
circle.setTranslateX(-4);
// translate to center node on location
circle.setTranslateY(-4);
// translate to center node on location
return circle;
});
contentPane.setCenter(worldMapView);
stage.setScene(new Scene(contentPane, 500, 500));
stage.show();
EXECUTOR.scheduleAtFixedRate(() -> {
List<Location> locations = IntStream.range(0, 50).boxed().map((value) -> {
return new Location(generateRandomDoubleInRange(60, -60), generateRandomDoubleInRange(120, -120));
}).collect(Collectors.toList());
Platform.runLater(() -> {
worldMapView.locationsProperty().clear();
worldMapView.locationsProperty().addAll(locations);
});
}, 0, 500, TimeUnit.MILLISECONDS);
}
我希望它在清除列表后能够清除Circle对象,但事实并非如此。似乎可以做到这一点,但是超时对象Circle并没有得到清理,最终程序使用了与允许的最大内存一样多的内存(尽管不会出错)。这需要一段时间(大约需要6分钟才能获得完整图片;使用我提供的代码)。 https://github.com/controlsfx/controlsfx/issues/1091我创建了一个问题报告,但老实说,它甚至可能不是bug,所以我决定来这里。
我还应该注意,我加快了时间,以便您更快地看到它。在我的普通程序中,我将更新设置为15秒左右。花费15秒钟才能看到GUI冻结,但最终确实会发生。