2018-10-26 16:06

  虚拟机并不是永远地要求对象的年龄必须达到了MaxTenuringThreshold才能晋升老年代,如果在Survivor空间中相同年龄所有对象大小的总和大于Survivor空间的一半,年龄大于或等于该年龄的对象就可以直接进入老年代,无须等到MaxTenuringThreshold中要求的年龄。

  现代微处理器、主机操作系统(Linux和Windows)以及虚拟机管理程序(VMware ESX,Citrix XenServer和Microsoft Hyper-V)中的技术可在每个虚拟机之间提供基于硬件的隔离。这种保护是同心环:每个环都受到较高编号的环的保护,其中0环位于中心,与应用隔离。

  在虚拟机系统中,主机操作系统的内核在0环中运行,这意味着什么都无法达到。管理程序在环1中运行。而单个虚拟机在环2中运行,因此无法访问环1内的管理程序或操作系统。

  学习jvm的人,基本都阅读过上面这段话,这里讲的是动态年龄的判定。对于动态的判定的条件就是相同年龄所有对象大小的总和大于Survivor空间的一半,然后算出的年龄要和MaxTenuringThreshold的值进行比较,以此保证MaxTenuringThreshold设置太大(默认15),导致对象无法晋升。

  问题的提出

  场景假设

  如果说非得相同年龄所有对象大小总和大于Survivor空间的一半才能晋升。我们看下面的场景

  MaxTenuringThreshold为15

  年龄1的对象占用了33%

  年龄2的对象占用33%

  年龄3的对象占用34%。

  开始推论

  按照晋升的标准。首先年龄不满足MaxTenuringThreshold,不会晋升。

  每个年龄的对象都不满足50%。,不会晋升。

  得到假设结论

  Survivor都占用了100%了,但是对象就不晋升。导致老年代明明有空间,但是对象就停留在年轻代。但这个结论似乎与jvm的表现不符合,只要老年代有空间,最后还会晋升的。

  问题的解答

  uint ageTable::compute_tenuring_threshold(size_t survivor_capacity) {

  //survivor_capacity是survivor空间的大小

  size_t desired_survivor_size = (size_t)((((double) survivor_capacity)*TargetSurvivorRatio)/100);

  size_t total = 0;

  uint age = 1;

  while (age < table_size) {

  total += sizes[age];//sizes数组是每个年龄段对象大小

  if (total > desired_survivor_size) break;

  age++;

  }

  uint result = age < MaxTenuringThreshold ? age : MaxTenuringThreshold;

  ...

  }

  我把晋升软件测试年龄计算的代码摘出。我们来看看动态年龄的计算。代码中有一个TargetSurvivorRatio的值。

  -XX:TargetSurvivorRatio 目标存活率,默认为50%

  通过这个比率来计算一个期望值,desired_survivor_size 。

  然后用一个total计数器,累加每个年龄段对象大小的总和。

  当total大于desired_survivor_size 停止。

  然后用当前age和MaxTenuringThreshold 对比找出最小值作为结果

  总体表征就是,年龄从小到大进行累加,当加入某个年龄段后,累加和超过survivor区域*TargetSurvivorRatio的时候,就从这个年龄段网上的年龄的对象进行晋升。

  再次推演

  还是上面的场景。 年龄1的占用了33%,年龄2的占用了33%,累加和超过默认的TargetSurvivorRatio(50%),年龄2和年龄3的对象都要晋升。

  虚拟机需要划分部分内存,硬盘占用空间不大,窗口切换,比较灵活。

  装双系统的话,每个系统使用的硬件条件是一样的,内存不打折,反应快,可能需要划分硬盘空间做新系统盘,但是进入另外一个系统需要重启。

  小结

  动态对象年龄判断,主要是被TargetSurvivorRatio这个参数来控制。而且算的是年龄从小到大的累加和,而不是某个年龄段对象的大小。看完后先记住这个参数吧TargetSurvivorRatio,虽然你以后基本不会调整他。

       原文出处:xpbob


评论

kvc636757024

#2

kvc636757024

http://v.qq.com/x/search/?q=%E5%8D%8E%E7%BA%B3%E7%BD%91%E5%9D%80_18183615678
2020/06/26 14:03回复
kvc636757024

#1

kvc636757024

http://v.qq.com/x/search/?q=%E5%8D%8E%E7%BA%B3%E5%BC%80%E6%88%B7%E7%BD%91%E5%9D%80_18183615678
2020/06/26 14:03回复