《深化了解Java虚拟机》笔记之第3章 废物收集器与内存分配战略ITeye - AG环亚娱乐

《深化了解Java虚拟机》笔记之第3章 废物收集器与内存分配战略ITeye

2019年02月26日09时59分57秒 | 作者: 智杰 | 标签: 目标,内存,废物 | 浏览: 2440

1、判别目标是否存活的算法

   (1)引证计数算法:目标中增加一个引证计数器,有一个当地引证它时,计数器值加1;当引证失效时,计数器值减1。计数器的值为0的目标就是不可能再被运用的。(Python、微软的COM技能、Squirrel等运用此算法进行内存办理)。缺陷在于难以解决目标之间的彼此循环引证问题。

   (2)根查找算法:从一系列的名为“GC Roots”的目标作为起始点,从这些节点开端向下查找,查找所走过的途径称为引证链,当一个目标到GC Roots没有任何引证链相连时,则证明此目标是不可用的。(Java、C#、Lisp等运用此算法)

 

2、收回办法区(即HopSpot虚拟机中的永久代)

堆中(尤其是新生代中),惯例运用进行一次废物搜集一般能够收回70%~95%的空间,而永久代的废物搜集功率远低于此。

永久代的废物搜集首要加收两部分的内容:抛弃常量和无用的类。

 

3、废物搜集算法

(1)符号-铲除(Mark-Sweep)算法;

(2) 仿制(Copying)算法:将内存要为巨细持平的两块,每次只运用其间的一块,当这一块内存完了,就将还存活着的目标仿制到别的一块上面,然后再把已运用过的内存空间一次收拾掉(现代商业虚拟机都选用这种方法来收回新生代)。

新生代中的目标有98%是朝生夕死的,所以并不需求依照1:1的份额来区分内存空间,而是将内存分为一块较大的Eden空间和两块较小的Survivor空间,每次运用Eden和其间的一块Survivor。当收回时,将Eden和Survivor中存活着的目标一次性地拷贝到别的一块Survivor空间上,最终收拾掉Eden和方才用过的Survivor的空间(Hotspot虚拟机默许Eden和Survivor的份额为8:1)。

(3)符号-收拾(Mark-Compact)算法:一般老时代选用。

一般来说,老时代GC(Major GC/Full GC)比新生代GC(Minor GC)的速度慢10倍以上。

 

4、内存分配与收回战略

(1)目标优先在Eden分配。假如Eden区没有满足的空间,虚拟机将建议一次Minor GC;

(2)大目标直接进入老时代。大目标是指需求很多接连内存空间的Java目标,最典型的大目标就是那种很长的字符串及数组。因而,写程序时应该“朝生夕死”的“短命大目标”。

(3)长时间存活的目标将进入老时代。目标在Eden出世,熬过一次Minor GC,其目标年纪就加1,默许目标年纪为15时,就会提升到老时代。

(4)动态年纪断定。假如在Survivor空间中相同年纪一切目标巨细的总和大于Survivor空间的一半,年纪大于或等于该年纪的目标就能够直接进入老时代。

(5)空间分配担保。Minor GC前,虚拟时机检测之前每次提升到老时代的均匀巨细是否大于老时代的剩下空间巨细。假如大于,则改为直接进行一次Full GC;假如小于,则检查HandlePromotionFailure设置是否答应担保失利;假如答应,那只会进行Minor GC;假如不答应,则也要改为进行一次Full GC。

 

 

版权声明
本文来源于网络,版权归原作者所有,其内容与观点不代表AG环亚娱乐立场。转载文章仅为传播更有价值的信息,如采编人员采编有误或者版权原因,请与我们联系,我们核实后立即修改或删除。

猜您喜欢的文章