JVM内存池,GC

GC工作机制

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停止所有在堆中运行的线程并执行清除动作。

 

(来源)

 

猜你喜欢

转载自itace.iteye.com/blog/2274949