JavaRush /Java блог /Архив info.javarush /Обжорство программы на JavaFX.
mSlicer
32 уровень
Москва

Обжорство программы на JavaFX.

Статья из группы Архив info.javarush
Кто нибудь делал программу на JavaFX? Заметил одну неприятную особенность, когда начинаешь менять размеры окна программы (Stage), то программа начинает не хило жрать память, может доходить до 900 мегабайт если очень много хаотично менять размер. Вызов сборщика мусора ничего не даёт, так как он не вызывается по ходу. Если даже Stage закрывается, то все равно висит в пямяти... На иностранных формумах нашел подобную проблему, и никто не знает как вручную чистить память хотя бы при закрытии Stage. Может быть кто-то из админов, исходя из своего опыта, знает как чистить? Единственное, что мне пришло в голову, это исользовать Thread.Sleep(50) в перехватчике событий мыши -setOnMouseDragged, это влияет на плавность, совсем немгого, но жрет прилично меньше оперативки. Программа visualVM показывает, что память занята int[] и byte[]. Картинку прикладываю. root.setOnMousePressed(new EventHandler() { public void handle(MouseEvent event) { if (event.getX() > primaryStage.getWidth() - 20 && event.getX() < primaryStage.getWidth() && event.getY() > primaryStage.getHeight() - 20 && event.getY() < primaryStage.getHeight()) { resizebottom = true; dx = primaryStage.getWidth() - event.getX(); dy = primaryStage.getHeight() - event.getY(); } else { resizebottom = false; xOffset = event.getSceneX(); yOffset = event.getSceneY(); } System.gc(); } }); root.setOnMouseDragged(new EventHandler() { public void handle(MouseEvent event) { if (!resizebottom) { primaryStage.setX(event.getScreenX() - xOffset); primaryStage.setY(event.getScreenY() - yOffset); } else { try { Thread.sleep(50); X = event.getX() + dx; Y = event.getY() + dy; // условие, чтобы нельзя было уменьшить окно до сколько угодно if(X>300){ primaryStage.setWidth(X); } if(Y>250){ primaryStage.setHeight(Y); } //InterruptedException } catch ( Exception e) { e.printStackTrace(); } } System.gc(); } }); Обжорство программы на JavaFX. - 1
Комментарии (3)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Exidnus Уровень 38
28 апреля 2017
System.gc() не гарантирует вызова gc.
vampirit Уровень 40
28 апреля 2017
ну это будут костыли, но использовать идею игр, задать фиксированные размеры и дать пользователю возможность выбирать…

Либо просто запретить менять размер окна.

Сам с JavaFX подружился всего недельку назад.

Но причем тут сборщик мусора? У вас на скрине есть колонка с количеством живых объектов, он тоже увеличивается с той же скоростью?