Hot Spot内存模型,GC回收机制

Hot Spot内存模型,GC回收机制_第1张图片

内存总览
    堆区
        Eden Space(伊甸园)
        Survivor Space(幸存者区)
        Tenured Gen(老年代-养老区)
    非堆区
        Code Cache(代码缓存区)
        Perm Gen(永久代)
        Jvm Stack(java虚拟机栈)
        Local Method Statck(本地方法栈)

 

Young Gen(年轻代)    

1个Eden Space
        1. 当对象在堆中创建后,会进入年轻代的Eden Space。
        2. GC高频扫描,每次扫描都会到失去引用的对象直接清理,然后将存活对象存入A Servivor Space。
    A Survivor Space
        3. GC中频扫描,扫描到失去引用的对象直接清理,后将存活对象存入B Servivor Space
    B Survivor Space(幸存者区),16此扫描放入老年代
        4. GC中频扫描,扫描到失去引用的对象直接清理,如果几次扫描后对象仍然存在,则将其放入Old Gen。扫描完毕后jvm将Eden Space和两个Survivor Space清空,并将两个Survivor Space调换位置来减少内存碎片的产生。

 

Old Gen(老年代)
        GC低频扫描,每次扫描都会到失去引用的对象直接清理

 

字符串常量池
    JDK1.7中JVM把String常量区从方法区中移除了;JDK1.8中JVM把String常量池移入了堆中,同时取消了“永久代”,改用元空间代替(Metaspace)

 

程序计数器
    编译时由所持引用计数,每个栈相互独立,记录的是正在执行的虚拟机字节码指令地址,如果是本地方法则为undefined
    由于内存消耗很小几乎忽略不计,所以也是java中唯一不会抛出outofmemoryerroer的内存区域

 

非堆区/方法区
    Perm Gen(永久代)1.8以后取消,改用元空间
        永久代主要存放类定义、字节码和常量等很少会变更的信息。
    class文件信息
        class文件常量池
    运行时常量池
    Code Cache
        HotSpot Java虚拟机包括一个用于编译和保存本地代码(native code)的内存,叫做“代码缓存区”(code cache)。 

 

内存碎片处理
    堆区
        Young Gen
            Young Gen垃圾回收时,采用将存活对象复制到到空的Suvivor Space的方式来确保尽量不存在内存碎片,采用空间换时间的方式来加速内存中不再被持有的对象尽快能够得到回收。
        Tenured Gen
            采用压缩的方式来避免内存碎片(将存活对象移动到内存片的一边,也就是内存整理)。当然,有些垃圾回收器(譬如CMS垃圾回收器)出于效率的原因,可能会不进行压缩。 

你可能感兴趣的:(JVM)