Java垃圾收集器导致大量滞后

时间:2019-04-24 18:39:35

标签: java garbage-collection

每次,当控制台中出现以下消息时,我都会注意到游戏中存在很大的滞后。

[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所需的时间?如何查看由GC收集的对象的类?

1 个答案:

答案 0 :(得分:1)

减少垃圾收集时间的最有效方法就是减少垃圾量。

您可以使用JvisualVM之类的事件探查器(JDK附带)来确切地查看您的程序如何使用分配给它的内存以及在垃圾回收上花费了多少时间。

在游戏程序中,您要获得一致的帧速率:您将希望重构代码,以便尽可能多地重用对象,而不是创建新对象并允许它们将在以后收集(每当不可避免地需要收集垃圾时,都会导致明显的滞后峰值)。 (不幸的是,这就是为什么像Java这样的内存管理语言并不是最适合游戏的原因。)