后,我有一个JVM上运行的应用程序(游戏)。爪哇 - GC应用程序运行速度慢
游戏的更新逻辑(运行60次/秒)与它的“时间片”(1/60秒)的使用约25%完成后,然后睡掉剩下的75%。但是,当GC采集器运行时,它会上升到75-200%,并在其余的执行阶段停留在那里。
游戏采用约堆的70MB和长约1-2MB /秒。 GC运行时会回到70Mb,所以没有真正的内存泄漏。我将在未来尝试降低这个数字,但在这个范围内它不应该是一个问题。
我使用JVM 8没有运行时参数或标志,不知道哪个GC,这将使我。
我试过设置堆大小不同,但不影响此现象。
我有两个理论,为什么这可能是:
的GC无意碎片堆我在导致缓存捣毁的更新循环的方式。我已经从逻辑中获得了很大的收益,因为它通过循环并更新它。难道它会将一些数据转移到旧区域,同时保留一些在年轻人(苗圃)?
突然GC处理触发我的操作系统,使其认识到,因为它目前,降低其优先级我的主要更新胎面并不需要这么多的CPU资源。 (但是,现象持续,即使我跳过了Thread.Sleep()睡觉关闭未使用的CPU占用率。
你觉得什么是我的理论似是而非,可以被任何关于他们做,还是我需要切换到C语言?我的GC的知识是有限的。
PS作为一个侧面说明,一般更新()在75%GC后结束。使用垂直同步时,当我喜欢200%的数字它。
也许比较缓存未命中和相关的统计信息与'perf record'?还有,哪个JVM?哪个收藏家?哪些命令行标志? – the8472
谢谢,我在帖子中添加了一些信息。不知道你的意思是“pref记录”虽然... – Jake
https://perf.wiki.kernel.org/index.php/Tutorial#Sampling_with_perf_record,你应该启用GC日志记录来获取有关暂停时间的信息(请参阅如何做到这一点的JVM文档) – the8472