Подтвердить что ты не робот

Ошибка утечки памяти JavaFX 8 при спрямлении

У меня есть приложение JavaFX, которое минимизируется в лотке при нажатии кнопки X. Я отслеживаю приложение через VisualVM для тенденций в области памяти.

Странная часть - это когда приложение открыто или сводится к панели задач, память всегда возвращается обратно в исходную память. Однако, когда он сведен к минимуму в лоток (stage.hide(), systemTray.show()), память получает GCed, но в восходящем тренде (утечке).

В VisualVM пространство старого поколения продолжает расти, и как только он достигнет максимума через некоторое время, приложение будет не отвечать на запросы, а процессор скачет до 80%.

Я заметил, что , если я stage.show() в приложении, дважды щелкнув значок в трее и т.д., GC очистит все до нормального. Однако, если оставить его на длительные периоды, он просто не сможет GC старого поколения.

Сброс кучи показывает javafx.scene.Scene#7 и javafx.scene.Node[]#2 как наиболее сохраненное пространство. Оба не будут отображаться, если сцена не скрыта. По ссылкам, это показывает this[] -> dirtyNodes().

this     - value: javafx.scene.Node[] #2
<- dirtyNodes     - class: javafx.scene.Scene, value: javafx.scene.Node[] #2
 <- value     - class: javafx.scene.Node$ReadOnlyObjectWrapperManualFire, value:  
 javafx.scene.Scene #7

Что вызывает это и как я могу это решить?

4b9b3361

Ответ 1

Я так и не нашел и не ответил на это. Вместо этого я бы обнулял node на hide и восстанавливал его на вид. Для интенсивных динамических узлов/нескольких узлов я создал хэш-карту для хранения их в памяти.

Это стало привычкой для меня в javafx8, чтобы избавиться от всей графики и переназначить на скрытие и просмотр с хэш-карты. Дополнительная память и использование процессора незначительны на современных настольных компьютерах. Используя этот метод, у меня было 0 приложений для использования cpu и приложений с низкой памятью (~ 100 м), которые были запущены, когда они скрыты на win8/10.

Ответ 2

Java имеет функции Like Weak Reference: https://docs.oracle.com/javase/7/docs/api/java/lang/ref/WeakReference.html

Мягкая ссылка: https://docs.oracle.com/javase/7/docs/api/java/lang/ref/SoftReference.html

это позволяет вам конкретно настроить виртуальную машину → > что собирать мусор.

также существует Concurrency API http://winterbe.com/posts/2015/04/07/java8-concurrency-tutorial-thread-executor-examples/

который использует службу служб и пул потоков.

и для ограничений по памяти Приложения в java Программное обеспечение должно вызывать

System.gc() // garbage collector

на интервалах независимо от его автоматического вызова

Вы можете использовать класс Runtime для планирования балансировщика нагрузки для проекта https://docs.oracle.com/javase/7/docs/api/java/lang/Runtime.html

public Process exec(String command)


                throws IOException
//--------------------------------------------------------
    Executes the specified string command in a separate process.

public void gc()

//----------------------------------------------------------
Runs the garbage collector. Calling this method suggests that the Java virtual machine expends effort toward recycling unused objects in order to make the memory they currently occupy available for quick reuse. When control returns from the method call, the virtual machine has made its best effort to recycle all discarded objects
This is a convenience method. An invocation of the form exec(command) behaves in exactly the same way as the invocation exec(command, null, null). 

Threading всегда была проблемой для приложений с интенсивной памятью, а в JavaFX каждый компонент сцены - это потоки плотно, привязанные к Scene, но с реализацией, похоже, Loosely bound.

Если существует длительный срок, требуется более эффективное управление некоторыми из интенсивно работающих с процессором задач в Native side (JNI).  Кроме того, CLEAN-архитектура принесет пользу

https://www.google.co.in/webhp?sourceid=chrome-instant&rlz=1C1CHBF_enIN736IN736&ion=1&espv=2&ie=UTF-8#q=clean+code& *