有没有人研究了创build和垃圾收集Java WeakReference对象所涉及的运行时成本? multithreading应用程序是否存在性能问题(如争用)? 编辑:显然实际的答案将是JVM的依赖,但一般的意见也是受欢迎的。 编辑2:如果有人已经做了一些基准的performance,或者可以指出一些基准的结果,这将是理想的。 (抱歉,但赏金已过期…)
我不断听到有人抱怨C ++没有垃圾收集。 我还听说C ++标准委员会正在考虑将其添加到语言中。 我害怕我只是没有看到它的意义…使用RAII智能指针消除了它的需要,对不对? 我唯一的垃圾收集经验是在几台便宜的八十年代的家用电脑上,这意味着系统每隔几秒就会冻结几秒钟。 我相信自那时以来已经有所改善,但正如你所猜测的那样,并没有给我一个很高的评价。 垃圾收集为经验丰富的C ++开发人员提供了什么好处?
最近我的Galaxy Note 2升级到了4.4.2版本。 我正在使用这款手机进行开发(使用ADT),生活很好,但发布此升级“暂停GC”错误开始到来,我无法解决。 它是每次在我的ADT工具LogCat UI屏幕更改状态。 下面是错误的转储。 先谢谢您的帮助。 05-13 22:39:22.538: W/dalvikvm(8350): No implementation found for native Ldalvik/system/VMRuntime;.pauseGc:(Ljava/lang/String;)I 05-13 22:39:22.543: E/MyThread(8350): Pause GC 05-13 22:39:22.543: E/MyThread(8350): java.lang.reflect.InvocationTargetException 05-13 22:39:22.543: E/MyThread(8350): at java.lang.reflect.Method.invokeNative(Native Method) 05-13 22:39:22.543: E/MyThread(8350): at java.lang.reflect.Method.invoke(Method.java:515) 05-13 22:39:22.543: E/MyThread(8350): at android.app.MyThread.pauseGC(MyThread.java:5525) 05-13 22:39:22.543: E/MyThread(8350): at android.app.MyThread.performLaunchActivity(MyThread.java:2324) 05-13 22:39:22.543: E/MyThread(8350): at android.app.MyThread.handleLaunchActivity(MyThread.java:2471) 05-13 22:39:22.543: E/MyThread(8350): […]
caching来自reflection的昂贵数据的最佳方式是什么? 例如,大多数快速序列化器都会caching这些信息,所以每次遇到相同的types时都不需要反映。 他们甚至可以产生一个dynamic的方法,他们从types中查找。 之前.net 4 传统上,我使用了一个正常的静态字典。 例如: private static ConcurrentDictionary<Type, Action<object>> cache; public static DoSomething(object o) { Action<object> action; if(cache.TryGetValue(o.GetType(), out action)) //Simple lookup, fast! { action(o); } else { // Do reflection to get the action // slow } } 这泄漏了一些内存,但是因为它只有一个types和types只有一次,只要AppDomain我没有考虑这个问题。 由于.net 4 但是现在.Net 4引入了用于dynamictypes生成的收集组件 。 如果我曾经在收集的程序集中声明的对象上使用DoSomething ,程序集将永远不会被卸载。 哎哟。 那么在.net 4中caching每种types信息的最佳方式是什么? 我能想到的最简单的解决scheme是: private static […]
我最近不得不把这个怪物检入到生产代码中来操纵WPF类中的私有字段:(tl; dr我该如何避免这样做?) private static class MemoryPressurePatcher { private static Timer gcResetTimer; private static Stopwatch collectionTimer; private static Stopwatch allocationTimer; private static object lockObject; public static void Patch() { Type memoryPressureType = typeof(Duration).Assembly.GetType("MS.Internal.MemoryPressure"); if (memoryPressureType != null) { collectionTimer = memoryPressureType.GetField("_collectionTimer", BindingFlags.Static | BindingFlags.NonPublic)?.GetValue(null) as Stopwatch; allocationTimer = memoryPressureType.GetField("_allocationTimer", BindingFlags.Static | BindingFlags.NonPublic)?.GetValue(null) as Stopwatch; lockObject = […]
当我按下Eclipse中的“运行垃圾收集器”button时会发生什么? 它只是调用System.gc()?
目前我正在试验用Snap编写的一个Haskellnetworking服务器,它加载并提供给客户大量的数据。 而且我非常非常难以控制服务器进程。 在随机的时刻,这个过程使用了大量的CPU几分钟到几分钟,并且对客户端请求没有反应。 有时内存使用会在几秒钟内高峰(有时会下降)数百兆字节。 希望有人对长时间运行的Haskell进程有更多的经验,这些进程使用大量的内存,并且可以给我一些指针来使事情更稳定。 我已经debugging了好几天了,现在我开始有点绝望了。 我的设置一点点概述: 在服务器启动时,我将大约5千兆字节的数据读入内存中的大(嵌套)Data.Map-like结构。 嵌套地图的值是严格的,地图中的所有值都是数据types,所有的字段也都是严格的。 我花了很多时间确保没有未经评估的thunk被留下。 导入(取决于我的系统负载)大约需要5-30分钟。 奇怪的是连续运行的波动比我想象的要大得多,但这是一个不同的问题。 大数据结构位于由Snap服务器产生的所有客户端线程共享的“TVar”内。 客户可以使用小型查询语言来请求数据的任意部分。 数据请求量通常很小(高达300kb左右),只能触及数据结构的一小部分。 所有只读请求都使用“readTVarIO”来完成,所以它们不需要任何STM事务。 服务器使用以下标志启动:+ RTS -N -I0 -qg -qb。 这将以multithreading模式启动服务器,禁用空闲时间和并行GC。 这似乎加快了这个过程。 服务器大多运行没有任何问题。 然而,客户端请求每隔一段时间就会超时,CPU高达100%(甚至超过100%),并持续很长一段时间。 同时服务器不再响应请求。 我能想到的几个原因可能会导致CPU使用率: 这个请求需要花费很多时间,因为有很多工作要做。 这是不太可能的,因为有时会发生在以前的运行中已经certificate是非常快的请求(我的意思是20-80ms左右)。 在数据被处理和发送给客户端之前,仍然有一些未被评估的thunk需要被计算。 这也是不太可能的,与前面的观点一样。 不知何故垃圾收集踢,并开始扫描我的整个5GB的堆。 我可以想象这会花费很多时间。 问题是,我不知道如何弄清楚到底发生了什么,该怎么办。 由于导入过程需要很长时间,因此分析结果不会显示任何有用的信息。 似乎没有办法有条件地打开和closures代码内的分析器。 我个人认为GC是这里的问题。 我正在使用GHC7,似乎有很多选项来调整GC的工作方式。 通常非常稳定的数据使用大堆时,您推荐什么样的GC设置?
在一个PHP程序中,我依次读取一堆文件(使用file_get_contents ), gzdecode它们进行json_decode对结果进行json_decodeparsing,分析内容,把大部分内容扔掉,并在数组中存储大约1%。 不幸的是,每次迭代(我遍历包含文件名的数组)时,似乎有一些内存丢失(根据memory_get_peak_usage ,每次大约2-10 MB)。 我有双重和三重检查我的代码,我没有存储循环中的无用数据(和所需的数据几乎不超过10MB总体),但我经常重写(实际上,数组中的string)。 显然,PHP没有正确释放内存,因此使用越来越多的内存,直到达到极限。 有没有办法强制垃圾收集? 或者至less要找出内存在哪里? 在此先感谢,德米特里
如果你已经购买了函数式编程范例,那么你很可能喜欢Erlang和Haskell。 两者都具有纯粹的function核心和其他优点,如轻量级线程,使其非常适合多核世界。 但是也有一些差异。 Erlang是经过商业validation的具有成熟分布模型的容错语言。 它具有看似独特的function,能够通过热代码加载在运行时升级其版本。 (太棒了!) 另一方面,Haskell拥有任何主stream语言中最复杂的types系统。 (我把'主stream'定义为任何具有已发表的O'Reilly书籍的语言,所以哈斯克尔就是这样评价的)。它的直线单线程性能看起来比Erlang更好,轻量级线程看起来更轻。 我正试图为我剩下的编码生活组build一个开发平台,并想知道是否可以将Erlang和Haskell混合起来,以实现最佳的平台。 这个问题有两个部分: 我想使用Erlang作为一种容错MPI来将GHC运行时实例粘合在一起。 每个GHC运行时将会有一个Erlang进程。 如果“不可能发生”和GHC运行时间死了,那么Erlang进程会以某种方式检测到并死掉。 Erlang的热门代码加载和分发function将继续工作。 可以将GHC运行时configuration为仅使用一个核心,或者本地机器上的所有核心,或两者之间的任何组合。 一旦编写了Erlang库,其余的Erlang级别代码应该是纯粹的样板,并在每个应用程序的基础上自动生成。 (也许通过一个Haskell DSL例如。)如何实现至less一些这些东西? 我希望Erlang和Haskell能够共享相同的garabage收集器。 (这是比1更进一步的想法。)运行在JVM和CLR上的语言通过共享运行时间实现更大的质量。 我明白,在JVM或CLR上运行Erlang(热代码加载)和Haskell(更高版本的多态)有技术限制。 但是,解开垃圾收集器呢? (对函数式语言的运行时间的开始进行sorting)分配显然还是要非常快,所以也许这一点需要静态链接。而且应该有一些机制来区分可变堆和不可变堆(包含懒惰的一次写入内存),因为GHC需要这个。 修改HIPE和GHC是否可行,以便垃圾收集者可以共享堆? 请回答任何经验(积极或消极),想法或build议。 事实上,任何反馈(短直滥用!)是受欢迎的。 更新 感谢所有4个回复date – 每个教我至less有一个有用的东西,我不知道。 关于编码生活的其余部分 – 我把它包含在脸颊中引起争论,但实际上是这样。 我有一个项目,我打算继续努力,直到我死,它需要一个稳定的平台。 在上面提出的平台中,我只会编写Haskell,因为Erlang将自动生成。 那么Haskell会持续多久呢? Lisp依然和我们在一起,看起来好像很快就会消失。 Haskell是BSD3开放源代码,已经达到临界质量。 如果编程本身仍然是50年左右的时间,那么我认为Haskell或者Haskell的一些持续发展仍然会在这里。 更新2 回应rvirding的post 同意 – 实现一个完整的“Erskell / Haslang”通用虚拟机可能不是绝对不可能的,但是确实会非常困难。 虽然垃圾收集器级别只是像虚拟机一样共享,虽然仍然困难 ,但对我来说听起来要难一些。 在垃圾收集模型中,函数式语言必须有很多共同之处 – 不可变数据(包括thunk)的非普遍性和对非常快的分配的要求。 因此,通用性与单一虚拟机紧密捆绑的事实似乎有些奇怪。 VM有助于实现临界质量。 只要看看F#和Scala等“精简”function语言是如何起飞的。 Scala可能不具有Erlang的绝对容错能力,但是它为与JVM绑定的很多人提供了一条逃生路线。 […]
我与堆,年轻,终身和烫发一代混淆。 谁能解释一下吗?