JavaFX 8内存泄漏与Service类

时间:2017-08-24 20:21:20

标签: java memory javafx service javafx-8

我有以下JavaFX 8代码。它的目的是每5秒更新一个StringProperty,其中包含正在使用的内存量的描述。我在UI中显示StringProperty的内容。

    // Step 1 -- create a DoubleProperty for the used memory
    final DoubleProperty usedMemoryInMb = new SimpleDoubleProperty();
    // Step 2 -- bind the text of the label to the property 
    final Label memoryUsedText = new Label ();
    final NumberFormat f = new DecimalFormat("###,##0.0");
    memoryUsedText.textProperty().bind(Bindings.createStringBinding(() -> "Memory Used: " + f.format(usedMemoryInMb.get()) + " MB", usedMemoryInMb) );
    // Step 3 -- create a JavaFX 8 Service that will periodically calculate the used memory
    ScheduledService<Double> usedMemoryService = new ScheduledService<Double>() {

        protected Task<Double> createTask() {
            return new Task<Double>() {
                @Override
                protected Double call() throws Exception {
                    long totalMemory = Runtime.getRuntime().totalMemory();
                    long freeMemory = Runtime.getRuntime().freeMemory();
                    double usedMemory = (double)(totalMemory - freeMemory) / (double)(1024 * 1024);
                    return usedMemory;
                }
            };
        }
    };
    // Step 4 -- tell the service to update our property whenever it runs.  We do not do this in the Task because this property is displayed and you can only update the display in the main JavaFX thread.
    usedMemoryService.setOnSucceeded(new EventHandler<WorkerStateEvent>() {

        @Override
        public void handle(WorkerStateEvent t) {
            usedMemoryInMb.set((Double) t.getSource().getValue());
        }
    });
    // Step 5 -- start the service to run every 5 seconds
    usedMemoryService.setPeriod(Duration.seconds(5));
    usedMemoryService.setRestartOnFailure(true);
    usedMemoryService.start();

当我运行用户界面时,我发现每隔5秒,报告的内存使用量就会增加超过3 Mb!我没有运行任何其他服务,但只是为了确保服务应该受到责备,我将其更改为每1秒运行一次。果然,每1秒,内存使用量增加相同的数量(仅超过3Mb)。

我有&#39; -verbose:gc&#39;打开选项以验证没有发生垃圾收集。 (无论如何,这会减少记忆,而不是增加记忆力。)

我无法看到我在Service中正在做什么,甚至会分配3Mb。我想(不确认)当GC确实发生时,大部分额外的内存将被释放。但是,令人不安的是看到内存增长如此之快,这有点扭曲了我想要实现的结果。

每次Service运行时,有人能告诉我我在做什么来使用这么多内存吗?

0 个答案:

没有答案