JavaRush/Блог/Архив 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, 11:40
System.gc() не гарантирует вызова gc.
mSlicer
Уровень 32
29 апреля 2017, 12:59
Это я знаю))) и очень жаль кстати что не гарантирует))
Потестил программу свою на linux, там память вообще не жреться. На винде и линухе с обычным моником (full hd) тоже всё норм, но у меня моник 4к )))
vampirit
Уровень 40
28 апреля 2017, 06:43
ну это будут костыли, но использовать идею игр, задать фиксированные размеры и дать пользователю возможность выбирать…

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

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

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