我有一个在 JVM 上运行的应用程序(游戏)。
游戏的更新逻辑(运行 60 次/秒)以大约 25% 的“时间片”(1/60 秒)使用完成,然后在剩余的 75% 中休眠。但是当 GC 收集器开始运行时,它会上升到 75-200% 并在其余的执行过程中停留在那里。
游戏使用大约 70Mb 的堆并增长大约 1-2mb/s。当 GC 运行时,它会回到 70Mb,因此没有真正的内存泄漏。我将来会尝试降低这个数字,但在这个范围内应该不是问题。
我正在使用没有运行时参数或标志的 JVM 8,不确定哪个 GC 会给我。
我尝试将堆设置为不同的大小,但这不会影响这种现象。
关于为什么会这样,我有两种理论:
GC 无意中将我的堆碎片化,导致更新循环中的缓存垃圾。我的逻辑从数据接近性中受益匪浅,因为它循环并更新它。会不会是把一些数据洗牌到老区,而把一些数据留在年轻区(托儿所)?
突然的 GC 处理触发了我的操作系统,使其意识到我的主要更新进程不需要像当前那样多的 CPU 资源,从而降低了它的优先级。(但是,即使我跳过 thread.sleep() 以休眠未使用的 CPU 使用率,这种现象仍然存在。
你怎么看。我的理论是否合理,可以对它们做些什么,还是我需要切换到 C 语言?我对GC的了解有限。
PS 作为旁注,通常 update() 在 GC 后完成 75%。当我得到像 200% 这样的数字时,它是在使用 VSync 时。