java 垃圾回收再整理

由于工作中遇到了Direct Memory(只有full GC会回收此内存) 内存溢出的问题,顺带就看了很多java垃圾回收的东西,看完感觉很清晰,过段时间一看脑子里又是一片混乱,特意整理一下。

首先要理解jvm内存模型

jvm分为 程序计数器、java虚拟机栈、本地方法栈(Sun HotSpot 虚拟机将java虚拟机栈、本地方法栈合二为一)、java堆、方法区(包括运行时常量)、直接内存(Direct Memory)

Object obj = new Object();

假设这句代码出现在方法体中,那“Object obj”这部分的语义将会反映到Java 栈

的本地变量表中,作为一个reference 类型数据出现。而“new Object()”这部分的语义

将会反映到Java 堆中,形成一块存储了Object 类型所有实例数据值(Instance Data,对

象中各个实例字段的数据)的结构化内存,根据具体类型以及虚拟机实现的对象内存布

局(Object Memory Layout)的不同,这块内存的长度是不固定的。另外,在Java 堆中

还必须包含能查找到此对象类型数据(如对象类型、父类、实现的接口、方法等)的地

址信息,这些类型数据则存储在方法区中。

了解完内存模型 就可以来看垃圾回收了

按代的垃圾回收机制

HotSpot虚拟机将其物理上划分为两个–新生代(young generation)和老年代(old generation)。
新生代(Young generation): 绝大多数最新被创建的对象会被分配到这里,由于大部分对象在创建后会很快变得不可到达,所以很多对象被创建在新生代,然后消失。对象从这个区域消失的过程我们称之为”minor GC“。

老年代(Old generation): 对象没有变得不可达,并且从新生代中存活下来,会被拷贝到这里。其所占用的空间要比新生代多。也正由于其相对较大的空间,发生在老年代上的GC要比新生代少得多。对象从老年代中消失的过程,我们称之为”major GC“(或者”full GC“)

新生代的构成

一个(Eden )
两个(Survivor ) from to

JDK7一共有5种GC类型:

Serial GC
Parallel GC
Parallel Old GC (Parallel Compacting GC)
Concurrent Mark & Sweep GC (or “CMS”)
Garbage First (G1) GC

  1. Serial GC (-XX:+UseSerialGC)

新生代空间的GC方式eden-(from-to)多次进老年代,在老年代空间中的GC采取称之为”mark-sweep-compact“的算法。

算法的第一步是标记老年代中依然存活对象。(标记)
第二步,从头开始检查堆内存空间,并且只留下依然幸存的对象。(清理)
最后一步,从头开始,顺序地填满堆内存空间,并且将对内存空间分成两部分:一个保存着对象,另一个空着(压缩)。

  1. Parallel GC (-XX:+UseParallelGC)

serial GC只使用一个线程执行GC,而parallel GC使用多个线程,因此parallel GC更高效。这种GC在内存充足以及多核的情况下会很有用,因此我们也称之为”throughput GC“。

  1. Parallel Old GC(-XX:+UseParallelOldGC)

Parallel Old GC在JDK5之后出现。与parallel GC相比,唯一的区别在于针对老年代的GC算法。Parallel Old GC分为三步:标记-汇总-压缩(mark – summary – compaction)。汇总(summary)步骤与清理(sweep)的不同之处在于,其将依然幸存的对象分发到GC预先处理好的不同区域,算法相对清理来说略微复杂一点。

  1. CMS GC (-XX:+UseConcMarkSweepGC)

CMS GC比我之前解释的各种算法都要复杂很多。第一步初始化标记(initial mark) 比较简单。这一步骤只是查找那些距离类加载器最近的幸存对象。因此,停顿的时间非常短暂。在之后的并行标记( concurrent mark )步骤,所有被幸存对象引用的对象会被确认是否已经被追踪和校验。这一步的不同之处在于,在标记的过程中,其他的线程依然在执行。在重新标记(remark)步骤,会再次检查那些在并行标记步骤中增加或者删除的与幸存对象引用的对象。最后,在并行交换( concurrent sweep )步骤,转交垃圾回收过程处理。垃圾回收工作会在其他线程的执行过程中展开。一旦采取了这种GC类型,由GC导致的暂停时间会极其短暂。CMS GC也被称为低延迟GC。它经常被用在那些对于响应时间要求十分苛刻的应用之上。

当然,这种GC类型在拥有stop-the-world时间很短的优点的同时,也有如下缺点:

它会比其他GC类型占用更多的内存和CPU
默认情况下不支持压缩步骤
在使用这个GC类型之前你需要慎重考虑。如果因为内存碎片过多而导致压缩任务不得不执行,那么stop-the-world的时间要比其他任何GC类型都长,你需要考虑压缩任务的发生频率以及执行时间。

  1. G1 GC

最后,我们来学习垃圾回收优先(G1)GC类型。

如果你想要理解G1,首先你要忘记你所学过的新生代和老年代的概念。正如你在上图所看到的,每个对象被分配到不同的格子,随后GC执行。当一个区域装满之后,对象被分配到另一个区域,并执行GC。这中间不再有从新生代移动到老年代的三个步骤。这个类型是为了替代CMS GC而被创建的,因为CMS GC在长时间持续运作时会产生很多问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值