我正在寻找一个长期运行服务(使用F#)的内存泄漏.到目前为止,我见过的唯一"奇怪"的事情如下:
我在代码中看不到任何这种行为的原因(你可以在每个邮箱示例中找到你的标准代码 - 只有一个带有a let! = receive
和a 的循环match
结束了return! loop()
有没有人见过这种行为,甚至知道如何处理这个?或者这甚至是一个(已知的)错误?
更新:数组的增长真的很奇怪 - 似乎附加了额外的空间而没有正确使用:
我尝试编译代码时收到以下错误:
无法从用法中推断出方法'System.Linq.Enumerable.SelectMany(System.Collections.Generic.IEnumerable,System.Func>)'的类型参数.尝试显式指定类型参数.
List<RowEntry> entries = ...
List<RowArgument> arguments = ...
var argumentsVal = entries.SelectMany((RowEntry entry) =>
(IEnumerable<RowArgumentVal>)arguments.SelectMany((RowArgument arg) =>
new RowArgumentVal()
{
Action = "X"
, EntryID = entry.ID
, ArgID = arg.ID
, Val_BIT = true
, Val_DATE = new DateTime(2014, 01, 04)
, Val_DATETIME = new DateTime(2014, 01, 04)
, Val_DECIMAL = 4.6M
, Val_INT = 88
, Val_TIME = new TimeSpan(6, 0, 0)
}
).Cast<RowArgumentVal>()).Cast<RowArgumentVal>().ToList();
Run Code Online (Sandbox Code Playgroud)
我不知道怎样才能"更进一步"这样做......
好的,我B
从基类派生出一个类型A
.
A
实现IDisposable
显式但我必须进行额外的清理B
,所以我实现IDisposable
在B
:
interface IDisposable with
member i.Dispose() =
// ... additional work
base.Dispose() // <- want to do but cannot
Run Code Online (Sandbox Code Playgroud)
问题是:如何从base访问Dispose-method?
(base :> IDisposable).Dispose()
Run Code Online (Sandbox Code Playgroud)
产生编译错误: Unexpected symbol ':>' in expression. Expected '.' or other token.
做点什么
(i :> IDisposable).Dispose()
Run Code Online (Sandbox Code Playgroud)
当然会产生一个StackOverflowException
运行时 - 所以我该怎么做呢?对不起,但从未遇到过这样的事情...
我在这里遇到了一个奇怪的行为:我在生产运行在DLOG终端(Windows Embedded Standard SP1)上运行的WPF应用程序时出现大量内存泄漏,如果我在普通桌面上运行它,它会表现得非常好(Win7 prof .)
经过多次尝试找不到任何问题后,我将其中一个直接放在我的显示器旁边,安装了ANTs MemoryProfiler,并在终端和我的开发PC上进行了一小时的测试运行,模拟用户操作.
结果是,由于一些奇怪的原因,嵌入式系统堆积了大量的WeakReference和EffectiveValueEntry []对象.
这是一些图片:
开发(PC):
终端:
只要查看班级列表......
有没有人见过这样的东西,有没有已知的解决方案呢?我在哪里可以获得帮助?
(PS安装了为.net4准备的图像的终端)
PPS:对于亲密选民:我认为问题很明确:我该如何解决这个问题.你可以争论这是一个IT/OS问题与编程问题,但我想如果我在服务器故障中发布这个问题,它将立即得到一个非主题关闭......
更新:我能够找到问题的很大一部分 - 但感觉有点像C++:我使用类似ViewModel的Items类来提供(以及其他)ICommand(RelayCommand-pattern)的WPF-List.在视图的ViewModel-Property的getter中动态创建的Items似乎应用程序/ GC从未释放那些未使用的命令 - 或者对其CanExecuteChanged的订阅 - 内存分析器显示那些"由a持有弱参考".我更改了我的代码以重用那些item-viewmodel和Dispose/set以使其Dispose中的每个已使用的属性都为null,并将其用作清理 - 就像我说的那样:在旧的C++时代感觉就像"删除".最重要的是我使用强制GC.Collect每30分钟(是的我知道 - 你永远不应该 - 但我到目前为止没有其他解决方案).使用此设置,应用程序运行6个小时到目前为止没有问题,但感觉不对.
我无法理解为什么那些WeakReferences没有被声称,因为它们在我的台式机上...
有什么想法吗?请!
更新:我仍然无法确定这个问题,但我发现了一个奇怪的行为:如果我使用PC-Anywhere观察我的软件在其中一个终端上的运行问题就会消失!即使在运行8小时后.直接软件运行它应该 - 它甚至会释放内存(我在主屏幕上放了一个小记忆计数器 - 让我说我连接到终端并看到内存很低 - 等待几分钟后内存被回收)
所以我认为Devin(下面的一个答案)在正确的方向上有一个领先优势 - 远程控制软件中的某些东西可以解锁终结器线程或阻止GC的任何东西 - 无论是模拟键盘/鼠标还是其他什么.
有什么想法吗?
我在haskell模式下使用emacs(24.3.1)和ghc-mod一起玩Haskell.现在一切都很好,除了一件烦人的事情:
GHC信息缓冲区中的每个输出仅包含第一行.
例如,当我要求ghc-show-info
(比方说在sqlSettings
从坚持)我得到这样的:
而Interactive-Haskell工作正常:
所有事情都会发生:信息,错误,警告等.
现在我不知道是什么导致了这个问题,因为似乎emacs中的ghc-mod正在解析输出错误.
也许有人可以帮助我获取所有信息.
谢谢
PS:也许这个显示问题好一点:
代替
我正在使用fsharp类型推理,我正在尝试理解它们是如何工作的.为什么会这样
List.filter List.head
Run Code Online (Sandbox Code Playgroud)
是类型bool list list -> bool list list
?
假设我有一个包含一些.hs
文件的文件夹,我想将它包装在一个项目中
如果我有cabal install
,stack
那没什么大不了的:
cabal init
(互动选择东西)stack init
但是,当我只是轻松 - 只是安装stack
路线,我没有cabal install
- 只有stack
现在stack init
没有.cabal
(或.package
)文件就无法工作,因为stack new
我知道没有没有设置其他文件/文件夹的模板.
可能我错过了一些明显的东西,并且有一个stack
参数/命令吗?
如果不是:处理这个问题的正确方法是什么?安装cabal-install
?
嗨,在双工模式下运行WCF的服务存在很大问题.它泄漏了内存(不多但每天大约80MB)并且在内存分析器与服务一起运行24小时之后我发现大部分内存都byte[]
被引入了相当混乱,但我最常引用的结尾是这样的:
而"root"看起来像这样:
我也看到很多ServiceChannel
(大约200个)来自回调频道(我认为).
我很确定我每个连接的客户端只能容纳其中的一个.
总体而言,我的问题似乎与此几乎相同:Silverlight Wcf实现中的内存泄漏,但在服务器端.
我甚至尝试过[MTAThread]
这里提到的事情:当客户端超时但是它没有解决问题时,WCF服务泄漏句柄和内存.
我只是不认为问题出在我的代码中,因为我OperationContext.Current.GetCallbackChannel<IServiceConnectorCallback>()
在我自己的一个对象中获取它之后将回调通道包装起来并且没有泄漏(对于每个内存中的每个客户端只有一个给定快照) - 确保我在几次重置这些回调,因为通道可能会改变(客户端丢失连接或重新连接)但我没有办法处理旧的引用,所以我只删除它们,GC应该做它的工作在他们.
我确实使用PerCall
我的服务,所以我根本没有处理我的代码中的那些对象.
除了每隔几天重新启动一次服务之外,我真的不知道如何处理这个问题 - 我现在不想要解决的问题:(
所以请给我一些帮助/提示 - 非常感谢你!
我试图调用一个方法,该方法在调用BeginInvoke的UI线程上的后台线程上启动,并传递一个委托,如下所示:
Dispatcher.BeginInvoke(Function() UpdateApplicationDataUI())
Run Code Online (Sandbox Code Playgroud)
调用此方法:
Private Sub UpdateApplicationDataUI()
...
End Sub
Run Code Online (Sandbox Code Playgroud)
但是,我在调用BeginInvoke时遇到错误(委托的UpdateApplicationDataUI部分声明"Expression不生成值").我确定我错过了一些简单的东西...任何想法?
做了更多研究并回答了我自己的问题:
Me.Dispatcher.BeginInvoke(Function() New Action(AddressOf UpdateApplicationDataUI))
Run Code Online (Sandbox Code Playgroud) 我正在努力练习Haskell的一系列例子.我目前正在学习继续传递,但是我对如何实现像list中的元素的查找索引这样的函数有点困惑:
index 3 [1,2,3] id = 2
Run Code Online (Sandbox Code Playgroud)
像factorial这样的例子有意义,因为除了乘法之外没有真正的数据处理,但是在索引函数的情况下,我需要将我正在查看的元素与我正在寻找的元素进行比较,并且我似乎无法弄清楚如何使用函数参数来做到这一点.
任何帮助都会很棒.
f# ×3
memory-leaks ×3
c# ×2
haskell ×2
dispatcher ×1
duplex ×1
emacs ×1
ghc-mod ×1
inheritance ×1
linq ×1
vb.net ×1
wcf ×1