- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我有一个不断运行的程序。通常情况下,它似乎是垃圾收集,并保持在大约 8MB 的内存使用量以下。但是,每个周末,除非我明确调用它,否则它拒绝垃圾收集。但是,如果它接近最大堆大小,它仍然会进行垃圾收集。然而,这个问题被注意到的唯一原因是它实际上在一个周末因内存不足而崩溃,即它必须达到最大堆大小,并且没有运行垃圾收集器。
下图 (click to see)是程序一天内存使用情况的图表。在图表的两侧,您可以看到程序内存使用的正常行为,但第一个大峰值似乎是在周末开始的。这个特殊的图是一个奇怪的例子,因为在我对垃圾收集器进行显式调用后,它成功运行,但随后它爬回最大堆大小并成功地自行收集了两次垃圾。
这里发生了什么?
编辑:
好吧,从评论来看,我似乎没有提供足够的信息。该程序只是接收一个 UDP 数据包流,这些数据包被放置在一个队列中(设置为最大大小为 1000 个对象),然后对其进行处理以将其数据存储在数据库中。平均每秒接收大约 80 个数据包,但最高可达 150 个。它在 Windows Server 2008 下运行。
问题是,这个 Activity 是相当一致的,如果有的话,在内存使用量开始稳定攀升时, Activity 应该更低,而不是更高。请注意,我上面发布的图表是我拥有的唯一一个可以追溯到那么远的图表,因为我只更改了 Java Visual VM 包装器以将图表数据保留足够远以便在本周看到它,所以我不知道它是否准确每周同一时间,因为我周末不能看,因为它在私有(private)网络上,而且我周末不上类。
这是第二天的图表:
这几乎是一周中每隔一天的内存使用情况。该程序永远不会重新启动,并且由于这个问题,我们只在星期一早上告诉它进行垃圾收集。一周我们尝试在周五下午重新启动它,但它仍然在周末的某个时间开始攀升,因此我们重新启动它的时间似乎与下周的内存使用情况没有任何关系。
当我们告诉它时,它成功地垃圾收集所有这些对象的事实向我暗示这些对象是可收集的,它只是在达到最大堆大小之前不这样做,或者我们显式调用垃圾收集器。堆转储不会告诉我们任何事情,因为当我们尝试执行时,它会突然运行垃圾收集器,然后输出堆转储,这当然在这一点上看起来非常正常。
所以我想我有两个问题:为什么它突然不像本周剩下的时间那样进行垃圾收集,为什么在一次达到最大堆大小时发生的垃圾收集无法收集所有这些对象(即为什么一次会引用这么多对象,而每隔一次则不能引用)?
更新:
今天早上是一个有趣的一天。正如我在评论中提到的,该程序正在客户端的系统上运行。我们在客户组织的联系人报告说,凌晨1点,该程序失败,他今天早上上类时不得不手动重新启动它,而且服务器时间再次不正确。这是我们过去与他们一起遇到的问题,但直到现在,这个问题似乎从未相关过。
查看我们的程序生成的日志,我们可以推断出以下信息:
最佳答案
However the only reason this issue was noticed, is because it actually crashed from running out of memory on one weekend i.e. it must have reached the maximum heap size, and not run the garbage collector.
关于Java 垃圾收集器 - 无法定期正常运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4309105/
我是 .NET 编程的新手,目前我正在开发一个计算机健康监控系统,该系统目前处于初级阶段。我将使用 C# 2010 并使用 WMI 查询来查询计算机信息。 在进一步开发应用程序之前,我创建了一个迷你测
我正在考虑开发一个站点,服务器将定期抓取另一个站点,以便为我的数据库中的某些条目收集内容。我的问题如下... 如何让服务器及时执行抓取? 你能让它执行 php 还是你用什么语言来执行抓取? 有什么好的
使用 JobScheduler , 我设置了一个简单的 JobService如下: @TargetApi(21) public class SimpleJobService extends JobSe
我想定期从我的 JavaFX 应用程序执行任务。该任务从远程流中提取数据。 虽然我知道我可以按照下面的建议使用计时器: JavaFX periodic background task 我相信这应该能够
上下文 我们使用多个具有相同工作流程的 git 存储库,涉及两个分支,并且想知道如何最好地将一个提交“同步”到另一个。 简单地说,我们的 git 存储库包含: 长寿枝 两个分支: master(持续开
我正在编写一个需要以高精度和低频率进行后台位置更新的应用程序。解决方案似乎是一个后台 NSTimer 任务,它启动位置管理器的更新,然后立即关闭。之前有人问过这个问题: How do I get a
我有一个包含产品的商业系统。产品被分类并且还具有属性组。 我想同步/更新将来自商务系统的产品转换为在 Orchard 中定义的产品项目的内容类型,以便将数据从商务系统推送到 Orchard 内容项目。
所以我想做的只是按时间间隔更新 Activity 的 View ,比如每秒一次。在这个特定的例子中有几个按钮,我想要改变的只是它们的文本。我在这里阅读了很多解决相同问题的问题,但我似乎比其他人更容易陷
我有一个项目的 recyclerView,(除其他外)包含从 WS 检索的游戏持续时间的时间戳。为了显示比赛的持续时间,我必须获取当前时间戳,做垫子并将其转换为可读格式(例如:5 分钟 5 秒)。只有
这可能是一个愚蠢的问题,但经过几个小时的谷歌搜索后我找不到合适的答案.. 我们有一个在 cloudbees 上运行的业务关键型应用程序。源代码已正确备份,我们希望我们的数据库也有相同的备份。 Clou
我一直在观察我的 PostgreSQL 只读副本显示复制滞后的周期性延迟。延迟似乎会增加到 30-40 分钟,然后自动下降到 0。这与 CPU 利用率 相关,但它远未接近 CPU 限制。 读取流量来自
我已完成 Keepalived + MySQL(master - master)设置。 我将 MASTER 和 BACKUP 的优先级保持不变,因为我不希望它们开始频繁抖动(一次切换 VIP 就足够了
我目前有一个图像,如果本地内容可用,它会被 ping 以仅显示一个 div。 但我认为更好的实现方式是以 30 秒为间隔定期检查 ping,如果图像未成功 ping,则显示 #offline div。
我正在尝试编写一项服务,该服务将每隔 X 分钟尝试获取设备的 GPS 位置,并在后台运行和记录,即使应用程序未处于焦点状态也是如此。 那么,是时候创建服务了。 我创建了一个服务,设置了 locatio
我在这里阅读了很多问题,但无法弄清楚问题是什么。 我正在为 Android 编写现场服务应用程序。在其中一个 Activity (MyActivity.java) 中,我有两个按钮:开始和停止。 当现
假设我有这样的代码: git fetch && git diff origin origin/master --quiet || echo "untracked" 我希望它定期运行。比方说,每秒一次
我想建立与 HTTPS 服务器(例如 google.com)的连接并定期获取新鲜内容。 我编写了简单的 HTTP 客户端: public class AsyncLoader { private
我想定期进行 wifi 扫描(可能每 5 分钟一次)并将结果导出到一个 txt 文件,以便它显示 AP SSID 和 MAC 以及接收到的信号强度。我是 Android 开发的新手,所以我只知道基础知
当手机处于 sleep 模式时,Workmanager 不会向我的服务器发送坐标。异步任务被杀死? 我使用 Workmanager (PeriodicWorkRequest) 每 15 分钟获取一次坐
目标 收集 LogCat 的定期更新并将这些文本 block 保存(附加)到 SD 卡上的文件中 问题 Log 类不提供自特定时间戳以来的更新 可能的解决方案 我的计划是定期运行类似于以下代码:htt
我是一名优秀的程序员,十分优秀!