- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我有一个在 JVM 上运行的应用程序(游戏)。
游戏的更新逻辑(每秒运行 60 次)在使用了大约 25% 的“时间片”(1/60 秒)后结束,然后 hibernate 剩下的 75%。但是当 GC 收集器开始运行时,它会上升到 75-200%,并在剩下的执行过程中保持在那里。
游戏使用了大约 70Mb 的堆,并以大约 1-2mb/s 的速度增长。当 GC 运行时,它会回到 70Mb,因此没有真正的内存泄漏。以后我会尽量降低这个数字,但在这个范围内应该问题不大。
我使用的 JVM 8 没有运行时参数或标志,不确定哪个 GC 会给我。
我已经尝试将堆设置为不同的大小,但它不会影响这种现象。
关于为什么会这样,我有两种理论:
GC 无意中以一种导致更新循环中缓存垃圾的方式对我的堆进行碎片化。我的逻辑在循环遍历并更新数据时从数据邻近性中受益匪浅。会不会是把一些数据shuffle到old area,同时把一些数据留在young(the nursery)?
突然的 GC 处理触发了我的操作系统,使其意识到我的主要更新进程不需要像当前那样多的 CPU 资源,从而降低了它的优先级。 (但是,即使我跳过 thread.sleep() 以 hibernate 未使用的 CPU 使用率,该现象仍然存在。
你怎么看。我的理论是否合理,是否可以对其进行任何处理,或者我是否需要切换到 C 语言?我对 GC 的了解有限。
附言作为旁注,通常 update() 在 GC 后完成 75%。当我使用 VSync 时,我得到了 200% 这样的数字。
最佳答案
不再有效:
我做了一个测试,完全毁了我的架构。我有这个,这是应用程序的瓶颈:
class Physics{
Vec2 centre;
Rec hitbox;
Vec2 speed;
Vec2 acc;
...
public void update(){ //critical method
centre.doThings();
hitbox.doThings();
etc...
}
}
并将其更改为仅使用原语:
class Physics{
double centreX,centreY;
double x1,x2,y1,y2;
double speedX,speedY;
double accX,accY;
...
public void update(){ //critical method
implementation of methods above...
etc...
}
}
这是因为,至少,java 保证类原始成员按照声明的顺序存储在堆的类头之下。虽然对对象的引用可以是堆另一端的地址。
这与压缩 GC 一起给了我一个很好的提升,我认为这是缓存命中率的增加。它摧毁了我的架构,但这是我愿意付出的代价。
现在游戏稳定运行在15%,现在我把自己的帖子标记为答案。
编辑:那只是一个糊涂人的胡言乱语。以上只给了我一个小的性能提升 - 其余的是由于应用程序中的错误,因此不能证明体系结构更改的合理性。不过,压缩 GC 有所帮助。
关于java - GC 应用程序运行缓慢后,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40671352/
我最近从 Indigo“升级”到了 Luna(Oracle OEPE 安装)。请注意围绕“升级”一词的引用。 不幸的是,事情很慢。 我使用的项目是一个 Maven 多模块项目。构建工作区操作大约需要
如果我的 JavaScript 事件似乎都不是网页性能问题的原因,我该如何诊断网页性能问题? 我有一个使用jqGrid的网络应用程序。单击网格会导致 2-3 秒的卡住,然后发生任何事情(包括点击任何单
从 appengine 访问我的应用程序时,我经常收到以下错误。有人可以知道这是什么原因吗? 原因:com.google.apphosting.api.DeadlineExceededExceptio
出于某种原因,我的 curl 调用非常慢。这是我使用的代码。 $postData = "test" $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $
Stackdriver 测试我的网站启动速度慢 我们使用 cloudflare 作为我们的站点 CDN 提供商。我们使用 stackdriver 从外部测试站点可用性,我们将时间检查间隔设置为 1 分
在插入/更新许多行时,我知道SQLite的“问题”,但事实并非如此。 我正在更新包含约250条记录的表中的ONE一行(由PK索引)中的ONE字段。查询通常需要200毫秒左右的时间。听起来很少,但很大。
我们的 Mongo 数据库会定期(有时每天一次)变慢约 30-40 分钟。在此缓慢时期,访问数据库的 API 会遇到每 5-10 分钟就会出现一次的高延迟峰值。 查看 mongod 日志文件,这两
这个问题已经在这里有了答案: 已关闭8年。 Possible Duplicate: C# WinForm Application - UI Hangs during Long-Running Oper
我最近将我的 Java Liquibase 版本从 3.5.3 升级到 3.6.3 我有一个非常繁重的环境,其中有很多数据库和表(我使用的是 Oracle)。 在这种环境下,我试图执行一个巨大的变更日
在我的项目中,为了整洁起见,模块被组织在子目录中。 我的项目目录层次结构: $ ls -R .: configure.in Makefile.am Makefile.cvs src
我正在 Debian 上使用存储库中的软件包运行 Gitlab。大多数时候Gitlab运行速度非常快,但是在较长的空闲时间后Gitlab非常慢甚至超时(错误502)。有一次我在远程 git 访问上也遇
这可能是菜鸟的错误,所以请原谅我。我在高处和低处寻找解决方案,但没有结果-因此,我想在此添加第一篇文章:-) 我有两个域类,一个称为Domain,一个称为Page。如下代码所示,域中有许多页面。 cl
我是 React 的新手,在使用 onChange 时遇到了问题在大数据列表中生成的输入字段上的方法。 如 parentcomponent是数据的拥有者,我提供了handleUpdate()子组件 (
我们使用 Webpack DefinePlugin 为不同的渲染模式生成输出包。因此,例如,我们的 webpack 配置将返回 [{ entry: { mode1: "./in
我在页面顶部有一个带有菜单的标题元素。当我向下滚动时,标题会动画到较低的高度。当我向上滚动并到达顶部时,标题会以动画方式显示为原始大小。 但它的工作并不完美。有时,事情发生之前需要两秒钟。特别是当我向
我今天在我的文本编辑器(Sublime)中写了一些正则表达式,试图快速找到特定的源代码段,这需要有点创意,因为有时函数调用可能包含更多函数调用。例如,我正在寻找 jQuery 选择器: $("div[
ParentSadly 我没有通过搜索“laggy/slow mouse wheel-scrolling in Rich Edit control”和类似的句子找到答案。 我创建了一个丰富的编辑控件
我遇到了“OR”运算符在 mysql 中未使用任何索引的典型性能问题: SELECT sms.smsID, sms.phonenumber, sms.text, date, mbr.name, mbr
我最近一直在玩 asyncio 模块。下面是我想出的用于发送一些并行请求的代码,这些请求在我的笔记本电脑 (Mac OS) 上似乎运行良好,但在另一台机器 (Ubuntu 18.04) 上似乎运行缓慢
我目前正在开发一个并行应用程序(C#、WinForms),它通过 COM 将消息注入(inject)应用程序。 此应用程序使用多个 foreach 语句,从接受 COM 的应用程序中轮询实体指标。 L
我是一名优秀的程序员,十分优秀!