jvm - GC回收算法

jvm基础:html

http://www.javashuo.com/article/p-xcewdtkf-kr.html算法

 

调优这方面- -其实除了架构师基本用不到,知道基本原理和简单的调优就能够了。。。架构

 

调优通常是调优jvm

方法区 和 堆线程

方法区: 存放方法的信息(变量,常量,类信息,运行时常量池等)htm

堆(GC发生在这里): 存放对象实例对象

 

1.堆blog

1.1 新生代区排序

1.1.1 伊甸区 (西方神话人类起源地-。-)内存

1.1.2 survivor from (幸存者from区)

1.1.3 survivor to (幸存者to区)

1.2 老年代区

内存比例:

新生代:老年代 = 1 : 2

伊甸区:survivor from :survivor to = 8:1:1  

 

GC机制: (survivor from 和 survivor to 直接写成from 和 to)

1. 一个对象实例A被声明后进入堆的新生代伊甸区

2. 根据GC策略(好比GC发现没有指向A的变量了,或者伊甸区满了等),A进入from区

3. from满了之后,触发Miner GC(轻GC),把from区的一部分幸存者数据放到 to区,2区互换(A仍是在from区,只不过是以前的to区),清的to区(以前的老from区,没被复制到to区的都被清空了= =)。新来的开始进入新from区。

4. 新from区满了之后,重复以上步骤,15次(jvm默认次数)后, A还活着的话就会进入老年区。

6.当老年代区也满了之后,会产生full GC, jvm会停掉全部线程(STW: stop the world),开始全面清理垃圾。

 

若是A的占用空间很是大,为了防止过分频繁的轻GC(幸存者区会很快满。。。),会直接把A放到老年区。

GC的调优主要就是改变这几个区域的空间大小比例,还有垃圾回收算法(GC策略),减小full GC

 

 

垃圾回收算法:

1. 标记清除算法:

把可回收的部分标记为清除(逻辑清除),伪装不存在了,之后须要空间能够直接覆盖。

缺点: 幸存者的内存地址不连续,会有不少碎片。可能会致使大对象存不进来直接GC

 

2. 复制算法:(survivor from 和 to 的经常使用算法就是这个)

只用内存的1/2,1区和2区,每次内存回收的时候,1区把不须要清除的复制到2区,此时对象在2区内存地址连续,没有碎片,而后清空1区,把2区做为新的1区。

缺点:少了一半可用空间。

 

3. 标记整理算法:

先把幸存对象和可回收的对象标记,而后把可回收的清除,从新整理排序。

缺点:开销大,花费时间长。 

 

4.分代收集算法:(如今大部分都用的这个)

不一样区域不一样算法。

新生代中大量对象死去(局部变量这类的),因此用复制算法。

老年代中的对象都是在幸存者区域中通过了15次的GC回收的老不死- -因此高几率长久存活,所以用标记整理或者标记清除算法。

相关文章
相关标签/搜索