三. 垃圾收集器与内存分配策略

2017-10-10  本文已影响0人  柒黍

3.1概述

主要问题:

其中程序计数器,虚拟机栈,本地方法栈随线程而生,随线程而灭,而堆内存和方法区是线程共享,需要动态回收内存

3.2对象已死吗?

3.3垃圾收集算法

3.3.1 标记-清除算法(基础)

不足:

3.3.2 复制算法

它将可用内存等量的两块,每次只使用其中一块,当这一块内存用完了,把还可用的对象复制到另外一块内存,然后把已使用过的内存直接清理掉
优点:

目前都采用这种算法来收集 新生代内存 ,一般是将内存分为一块较大的Eden空间和两块较小的Survivor空间,每次都使用Eden空间和一块Survivor空间,当回收时将存活的对象复制到一块Survivor空间,清理使用的Eden和Survivor空间

3.3.3 标记-整理算法

标记过程仍然与 (标记-清除算法)一样,但是后续步骤不是直接对可回收对象进行整理,而是让所有存活对象都向一端移动,然后直接清理掉端边界以外的对象内存

一般老年代因对象存活率高,没有额外空间做分配担保,就必须使用 标记-清除算法、标记-整理算法

3.4HotSpot的算法实现

3.4.1 枚举根节点

因为在要保持“一致性”,导致GC进行时必须停顿所有Java执行线程的一个重要原因,目前是使用一句称为OopMap的数据结构来存储这些信息供GC使用。

3.4.2 安全点

Java虚拟机并没有为每条指令生成OopMap,只是在 安全点 才暂停生成OopMap。

问题一:安全点的选定标准 是否具有让程序长时间执行的特征

问题二:如何在GC发生时让所有线程都跑到最近的安全点上再停顿下来

3.4.3 安全区域

处理场景是线程处于Sleep或者Blocked状态,此时线程无法响应JVM的中断请求。此时需要安全区域来解决,在线程执行到安全区域中,首先标识自己进入了安全区域,当在这段时间内发生了GC时,就不用处理已经标识为安全区域的线程,在线程要离开安全区域时,它要检查是否完成了整个GC过程,如果完成就继续执行,如果没有则等待,直到收到可以离开安全区域的信号.

3.5 垃圾收集器

HotSpot的垃圾收集器

3.5.1 Serial收集器

3.5.2 ParNew收集器

3.5.3 Parallel Scavenge收集器

3.5.4 Serial Old收集器

3.5.5 Parallel Old收集器

3.5.6 CMS收集器

3.5.7 G1收集器

G1是一款面向服务器应用的垃圾收集器

3.6 内存分配与回收策略

Java自动内存管理主要解决2个问题:分配内存回收内存

上一篇 下一篇

猜你喜欢

热点阅读