- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我有两个问题。其中一个将讨论这个话题:)
1) 我遇到了无法找到有关不同垃圾收集器在 HotSpot 中工作方式的完整信息的问题。但我不是在谈论垃圾收集器工作的一般描述(我们在互联网上有很多这样的信息),我在谈论具体的算法。我找到了这份白皮书(Java HotSpot 虚拟机中的内存管理)http://www.oracle.com/technetwork/java/javase/tech/memorymanagement-whitepaper-1-150020.pdf .但它只有一般的想法。它对并行压缩算法(我的意思是并行标记-清除-压缩)有一个很好的描述(可能不太好 - 请参阅我的第二个问题),但它没有解释其他垃圾收集器的算法。然而,这份白皮书是我能够在 Internet 上找到的最好的信息。我想知道的是在哪里可以获得关于不同垃圾收集器(对于年轻一代我的意思是:ParNew、DefNew、PSYoungGen;对于老一代:PSOLdGen、ParOldGen、Concurrent-Mark-Sweep)如何工作的完整描述/信息。无法相信这些信息对用户不可用。
2) 关于Parallel Compacting Collector 算法(ParOldGen 或Parallel Mark-Sweep-Compact)的问题。白皮书(见第一个问题)描述了它的工作。让我引用白皮书中的一段话(请花点时间看一下):
我无法理解的地方如下:
关于总结阶段:
Due to compactions from previous collections, it is typical that some portion of the left side of each generation will be dense, containing mostly live objects. The amount of space that could be recovered from such dense regions is not worth the cost of compacting them.
好吧,这是否意味着当我们有一个区域由 98-99% 的 Activity 对象和 2-1% 的死对象组成(换句话说,死对象的比例非常小)而不是压缩该区域不值得从这样一个区域恢复的空间。然而,这个微小的空闲空间(空洞)最终会被填满,垃圾收集完成后将没有空洞。
So the first thing the summary phase does is examine the density of the regions, starting with the leftmost one, until it reaches a point where the space that could be recovered from a region and those to the right of it is worth the cost of compacting those regions.
好吧,如果我们有比这个区域大的死对象百分比,就值得压缩,对吧?
The regions to the left of that point are referred to as the dense prefix, and no objects are moved in those regions.
“并且这些区域中没有移动任何对象”,但是这些区域中可能有一些小的空闲空间,对吗?看不懂重点
The regions to the right of that point will be compacted, eliminating all dead space.
请说明它们将如何压缩。每个区域都将单独压缩?我觉得不是。那么也许这里会发生某种转变?
The summary phase calculates and stores the new location of the first byte of live data for each compacted region.
要理解它,我需要理解我想的上一个问题。
关于压缩阶段:
In the compaction phase, the garbage collection threads use the
summary data to identify regions that need to be filled, and the
threads can independently copy data into the regions. This produces a heap that is densely packed on one end, with a single large empty
block at the other end.
我完全糊涂了。所以在“总结阶段”没有发生压缩?上一阶段的目的只是为了找到所有空闲空间吗?
请帮我看清楚。
最佳答案
这只是对算法的一般描述。这样的描述可以有不同的细节。在这种情况下,它为您提供了大部分细节,但仍为实现者留下了一些选择。
关于您的问题:
所以在“总结阶段”没有发生压缩?前一阶段的目的是否只是为了找到所有空闲空间?
- 是的,这是正确的。摘要阶段收集索引数据并基本上确定所有必要的内容,以便压缩阶段可以执行复制。他们没有说明如何实现压缩,但默认方式只是将每个 Activity 对象紧挨着前一个对象放置。基本上,所有空白空间都被删除,压缩步骤完成后,您将拥有一个连续的内存块,其中包含所有 Activity 对象。我看到您对第四部分感到困惑,但请注意它是用将来时写的:“将被压缩”- 所以不是在总结期间,而是在以后。这是否意味着 [...] 该区域的压缩不值得从该区域恢复的空间?
是的,没错。您实际上会损失一些空间,但是为了执行速度而牺牲内存是很常见的。确切的密度阈值取决于实现,但我认为已用内存与总内存的比率阈值大约在 70-90%。如果您想了解所有细节,请查看评论中建议的开源 VM 实现。
关于java - 并行压缩收集器算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20430058/
有没有办法同时运行 2 个不同的代码块。我一直在研究 R 中的并行包,它们似乎都基于在循环中运行相同的函数。我正在寻找一种同时运行不同函数的方法(循环的 1 次迭代)。例如,我想在某个数据对象上创建一
无论如何增加 Parallel.For 启动后的循环次数?示例如下: var start = 0; var end = 5; Parallel.For(start, end, i => { C
我是 Golang 的新手,正在尝试了解并发和并行。我阅读了下面提到的关于并发和并行的文章。我执行了相同的程序。但没有得到相同的(混合字母和字符)输出。首先获取所有字母,然后获取字符。似乎并发不工作,
我正在寻找同时迭代 R 中两个或多个字符向量/列表的方法,例如。有没有办法做这样的事情: foo <- c('a','c','d') bar <- c('aa','cc','dd') for(i in
我对 Raku 很陌生,我对函数式方法有疑问,尤其是 reduce。 我最初有这样的方法: sub standardab{ my $mittel = mittel(@_); my $foo =
我最近花了很多时间来学习实时音频处理的细节,我发现的大多数库/工具都是c / c++代码或脚本/图形语言的形式,并在其中编译了c / c++代码。引擎盖。 使用基于回调的API,与GUI或App中的其
我正在使用 JMeter 进行图像负载测试。我有一个图像名称数组并遍历该数组,我通过 HTTP 请求获取所有图像。 -> loop_over_image - for loop controller
我整个晚上都在困惑这个问题...... makeflags = ['--prefix=/usr','--libdir=/usr/lib'] rootdir='/tmp/project' ps = se
我正在尝试提高计算图像平均值的方法的性能。 为此,我使用了两个 For 语句来迭代所有图像,因此我尝试使用一个 Parallel For 来改进它,但结果并不相同。 我做错了吗?或者是什么导致了差异?
假设您有一个并行 for 循环实现,例如ConcRT parallel_for,将所有工作放在一个 for 循环体内总是最好的吗? 举个例子: for(size_t i = 0; i < size()
我想并行运行一部分代码。目前我正在使用 Parallel.For 如何让10、20或40个线程同时运行 我当前的代码是: Parallel.For(1, total, (ii) =>
我使用 PAY API 进行了 PayPal 自适应并行支付,其中无论用户(买家)购买什么,都假设用户购买了总计 100 美元的商品。在我的自适应并行支付中,有 2 个接收方:Receiver1 和
我正在考虑让玩家加入游戏的高效算法。由于会有大量玩家,因此算法应该是异步的(即可扩展到集群中任意数量的机器)。有细节:想象有一个无向图(每个节点都是一个玩家)。玩家之间的每条边意味着玩家可以参加同一场
我有一个全局变量 volatile i = 0; 和两个线程。每个都执行以下操作: i++; System.out.print(i); 我收到以下组合。 12、21 和 22。 我理解为什么我没有得到
我有以下称为 pgain 的方法,它调用我试图并行化的方法 dist: /***************************************************************
我有一个 ruby 脚本读取一个巨大的表(约 2000 万行),进行一些处理并将其提供给 Solr 用于索引目的。这一直是我们流程中的一大瓶颈。我打算在这里加快速度,我想实现某种并行性。我对 Ru
我正在研究 Golang 并遇到一个问题,我已经研究了几天,我似乎无法理解 go routines 的概念以及它们的使用方式。 基本上我是在尝试生成数百万条随机记录。我有生成随机数据的函数,并将创建一
我希望 for 循环使用 go 例程并行。我尝试使用 channel ,但没有用。我的主要问题是,我想在继续之前等待所有迭代完成。这就是为什么在它不起作用之前简单地编写 go 的原因。我尝试使用 ch
我正在使用 import Control.Concurrent.ParallelIO.Global main = parallel_ (map processI [1..(sdNumber runPa
我正在尝试通过 makePSOCKcluster 连接到另一台计算机: library(parallel) cl ... doTryCatch -> recvData -> makeSOCKm
我是一名优秀的程序员,十分优秀!