我开发了或多或少的实时应用程序表单来运行MODBUS RTU诊断程序。 实时部分位于while循环中,它位于一个线程中,它启动每个新消息。 旧线程关闭,布尔值设置为false,然后在mainthread中设置.join(50),然后检查线程是否已关闭,如果没有,则执行硬中止。 此后线程变为null(= null)。 我使用的所有计时器(系统形式计时器)都保持运行(只是启动/停止)。 我遇到的第一个问题是,一个计时器(作为watchdogtimer运行)在没有通信10秒后没有触发中断。 做了一些研究后,我发现了垃圾收集器等问题。 所以我做了第二个计时器和一个=新计时器()。 但仍然没有事件发生。 现在我也看到使用的内存随着时间的推移而增加,而通信变得越来越慢。 重新启动后,我的应用程序使用32MB内存,每秒触发10-15条消息。 10个小时后,该应用程序使用350MB的内存,并且仅以每秒9,9,2个消息的速度触发。 我检查了所有使用过的变量,使这些变量都为null,使用disposes()等等。 这是一个简单的形式,只有2个丰富的文本框(我已经限制了最大尺寸,通过这种方式将.Text切割为最多250个字符:`
TextBox.Text = TextBox.Text.Insert(0, "Hello world!");
Array.Resize(...);
我的问题是: - 如何检查导致此内存的元素随时间增加? - 可能是什么因素,或者已知的原因是什么?
编辑:问题已解决
问题必须是GC收集器(垃圾控制器),它不遵循高吞吐量的数据
对于每个消息,在第一个应用程序设置中启动了一个新线程(这只是用于连接的嵌入式设备的测试目的的一些代码)。
尽管所有的= null和.disposes()在某种程度上GC都会卡在很多新的和释放的变量和线程上。
现在我用一些运行whileloops的静态线程重写了整个部分,它们没有关闭,但只有当它们冻结时,才开始使用b_StartWrite和b_StartReceive这样的布尔值进行读/写。
每个while循环都有一个变量,如ReceiveThreadStatus
,我在接收开始之前将其设置为1,接收线程将此var设置为2,然后进行主线程检查。
如果var没有改变,接收线程已经冻结,并且mainthread清理并重新启动此接收线程
主计时器(1毫秒计时器事件)启动&检查主线程。
也许一个不错的更新应该是线程的睡眠和暂停,因此处理器不必一直运行@ 30%......但那是稍后的时间。
14个小时后,该应用程序仅消耗25,8MB,仍然会发出15条消息/秒,因此嵌入式设备现在处于稳定测试状态:)。
在每个线程停止后写GC.Collect()
也不能解决这个减速问题
另一种可能性是使用Server Mode
GC,如下所述:Configuring Garbage Collection on the Server