加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – GC应用程序运行缓慢之后

发布时间:2020-12-15 02:17:33 所属栏目:Java 来源:网络整理
导读:我有一个在JVM上运行的应用程序(游戏). 游戏的更新逻辑(运行60次/秒)完成,大约25%使用它的“时间片”(1/60秒),然后休眠剩下的75%.但是当GC收集器运行时,它会上升到75-200%,并在其余的执行中保持不变. 游戏使用大约70Mb的堆并且增长大约1-2mb / s.当GC运行
我有一个在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的了解有限.

附:作为附注,通常更新()在GC后75%结束.当我得到200%的数字时使用VSync.

解决方法

What do you think. Are my theories plausible,

第一种理论似乎是合理的,但第二种理论则不然.

can anything be done about them

您可以通过以下方式改进:

>增加最大堆大小.
>切换到低暂停收集器.
>基于分析应用程序结果的性能优化.
>试图降低垃圾产生率.

or do I need to switch to C or C++?

C和C会给你更多可预测的行为,因为没有什么可以移动物体.如果您具备相应的技能并付诸努力,您应该能够在C和C中获得更好的性能,尤其是在进行图形/渲染时.但是,这些都是很大的“如果”.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读