JVM内存结构系列:HotSpot内存结构最清晰

SUN的jvm内存池被划分为以下几个部分:
Eden Space (heap)
内存最初从这个线程池分配给大部分对象。
Survivor Space (heap)
用于保存在eden space内存池中经过垃圾回收后没有被回收的对象。
Tenured Generation (heap)
用于保持已经在survivor space内存池中存在了一段时间的对象。
Permanent Generation (non-heap)
保存虚拟机自己的静态(reflective)数据,例如类(class)和方法(method)对象。Java虚拟机共享这些类数据。这个区域被分割为只读的和只写的。
Code Cache (non-heap)
HotSpot Java虚拟机包括一个用于编译和保存本地代码(native code)的内存,叫做“代码缓存区”(code cache)。
jvm的内存回收过程是这样的:
对象在Eden Space创建,当Eden Space满了的时候,gc就把所有在Eden Space中的对象扫描一次,把所有有效的对象复制到第一个Survivor Space,同时把无效的对象所占用的空间释放。当Eden Space再次变满了的时候,就启动移动程序把Eden Space中有效的对象复制到第二个Survivor Space,同时,也将第一个Survivor Space中的有效对象复制到第二个Survivor Space。如果填充到第二个Survivor Space中的有效对象被第一个Survivor Space或Eden Space中的对象引用,那么这些对象就是长期存在的,此时这些对象将被复制到Permanent Generation。

若垃圾收集器依据这种小幅度的调整收集不能腾出足够的空间,就会运行Full GC,此时jvm gc停止所有在堆中运行的线程并执行清除动作

 

 

HotSpot 虚拟机定义两个Generation:Young Generation (有时候也称为Nursery)和Old Generation。Young Generation由一个Eden Space和两个Survivor Spaces组成,虚拟机初始是分配所有的对象到Eden Space,许多对象也是在这里死去。当它执行一个minor GC的时候,虚拟机将从Eden Space中移动一些残余的对象到其中的一个Survivor Spaces中。虚拟机将在Survivor Spaces中生存足够长时间的对象移动到Old Generation的Tenured Spaces中。当Tenured Generation被填满,则将执行一个完全GC,这个完全GC非常的慢,因为它要处理所有存活着的对象。Permanent Generation 控制着所有虚拟机自己映射的数据,如类和对象的方法。

 

 

VM内存划分为年轻代(Young)和年老代(Tenured),Young GC是指是针对年轻代中的无用对象进行垃圾回收,而Full GC则会对年轻代和年老代中的无用对象均进行垃圾回收。上图中Virtual为可伸缩部分,即初始可以指定一个内存空间最大值和初始值,随着程序运行空间会进行增长。

Young:年轻代,具体包括EdenSurvivor0Survivor1

Eden:初始分配的对象最先存放到这里;

Survivor0Survivor1:存放Eden中经过若干次Young GC仍存活的对象,Survivor0Survivor1轮流被使用,当GC执行时,会从其中一个空间中拷贝存活对象到另一空间中。

Tenured:存放Survivor1中经过若干次Young GC仍存活的对象,这里的对象只有Full GC才可能回收;

 

Perm:存放Java类,常量等静态内容。

 

你可能感兴趣的:(HotSpot)