Java基础_JVM_内存管理和GC过程

JavaJVM主要分为栈区、堆区

栈区:本地方法栈、程序计数器、虚拟机栈

堆区:方法区、堆

GC的机制主要在堆区进行垃圾回收操作

堆区使用分代管理如下图所示:


Java基础_JVM_内存管理和GC过程_第1张图片

新生代:分为Eden、两块一样大小的Survivor组成

1、年轻代(Young Gen):年轻代主要存放新创建的对象,内存大小相对会比较小,垃圾回收会比较频繁。年轻代分成1个Eden Space和2个Survivor Space(命名为A和B)。当对象在堆创建时,将进入年轻代的Eden Space。垃圾回收器进行垃圾回收时,先扫描伊甸区,存活对象放进A区,当A区满了的时候,扫描Eden Space和A Survivor Space,如果对象仍然存活,则复制到B Survivor Space,如果B Survivor Space已经满,则复制到Old Gen。同时,在扫描Survivor Space时,如果对象已经经过了几次的扫描仍然存活,JVM认为其为一个持久化对象,则将其移到Old Gen。扫描完毕后,JVM将Eden Space和A Survivor Space清空,然后交换A和B的角色(即下次垃圾回收时会扫描Eden Space和B Survivor Space。这么做主要是为了减少内存碎片的产生。

也就是说Eden和survivor的第一块都会把不到回收阈值的对象放进survivor的第二块内存当中,然后把survivor两块内存交换位置,这个时候Eden和第二块survivor就是空的

我们可以看到:Young Gen垃圾回收时,采用将存活对象复制到到空的Survivor Space的方式来确保尽量不存在内存碎片,采用空间换时间的方式来加速内存中不再被持有的对象尽快能够得到回收。

2、年老代(Tenured Gen):年老代主要存放JVM认为生命周期比较长的对象(经过几次的Young Gen的垃圾回收后仍然存在),内存大小相对会比较大,垃圾回收也相对没有那么频繁(譬如可能几个小时一次)。年老代主要采用压缩的方式来避免内存碎片(将存活对象移动到内存片的一边,也就是内存整理)。当然,有些垃圾回收器(譬如CMS垃圾回收器)出于效率的原因,可能会不进行压缩。

3、持久代(Perm Gen):持久代主要存放类定义、字节码和常量等很少会变更的信息。

你可能感兴趣的:(Java基础_JVM_内存管理和GC过程)