Java сборщик мусора вызывает огромные лаги - PullRequest
0 голосов
/ 24 апреля 2019

Каждый раз, когда в консоли появляется следующее сообщение, я замечаю большое отставание в моей игре.

[GC (Allocation Failure) 
Desired survivor size 133693440 bytes, new threshold 7 (max 15)
[PSYoungGen: 916500K->130553K(918016K)] 1018868K->444063K(1232384K), 1.2505777 secs] [Times: user=1.87 sys=0.43, real=1.25 secs] 
[Full GC (Ergonomics) [PSYoungGen: 130553K->127049K(918016K)] [ParOldGen: 313509K->314172K(555008K)] 444063K->441222K(1473024K), [Metaspace: 9374K->9374K(1058816K)], 3.7134878 secs]

Я запускаю свою программу со следующими аргументами:

-Xms1024M
-Xmx2048M
-XstartOnFirstThread
-XX:+PrintGCDetails
-XX:+PrintClassHistogram
-XX:+PrintTenuringDistribution
-XX:+PrintGCApplicationStoppedTime

Есть ли возможность сократить время, необходимое ГХ? Как я могу увидеть класс объектов, которые собираются GC?

1 Ответ

1 голос
/ 25 апреля 2019

Самый эффективный способ сократить время, затрачиваемое на сборку мусора, - это просто уменьшить количество мусора.

Вы можете использовать профилировщик, такой как JvisualVM (поставляется с JDK), чтобы точно узнать, как ваша программа использует выделенную память и сколько времени затрачивается на сборку мусора.

В случае игровой программы, где вы собираетесь использовать постоянную частоту кадров: вам нужно реорганизовать свой код так, чтобы объекты использовались как можно чаще, а не создавали новые и позволяли они должны быть собраны позже (что приведет к заметным скачкам задержки, когда сбор мусора неизбежно необходим). (Вот почему, к сожалению, языки с управлением памятью, такие как Java, не являются лучшими для игр в частности.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...