JAVA内存模型

堆/Stack

  1. 实例、静态变量、数组变量保存在堆中。
  2. 堆在JVM启动时创建,在程序运行过程中可能会变大或变小。

新生代 旧生代 和 持久代

  • 堆分为新生代(Nursery/young space)和旧生代(old space)

    新生代分为Eden, survivor spaces。大部分对象初始化在新生代的Eden部分,一些特别大的对象也会初始化在旧生代上。

Survivor space 分为两部分,在任意时刻,一定有一个survivor space是空的。

  • 垃圾回收主要针对堆,可能包含方法区

    当新生代空间满时,GC启动一个young collection,把不再需要的实例移动到旧生代.

怎样移动?

  • 新生代 TO 旧生代

    当某个对象survive some number of young generation collection后,这个对象会被移动到old generation

-- Eden TO survivor spaces

The survivor spaces hold objects that have survived at least one young generation collection
and have thus been given additional chances to die before being considered “old enough” to be promoted to the
old generation

怎样判断实例是否不再被需要?

  • 算法为根搜索算法

    当旧生代空间满时,GC启动一个old collection.

  1. 之所以区分新生代和旧生代是因为大部分实例都是临时且不会长期保留在内存中.

垃圾回收

JAVA中的GC算法

  • 根搜索算法(GC Roots Tracing)

    通过一系列的GC Roots 的对象作为起始点,从Roots开始向下搜索,搜索走过的的路径成为引用链(Reference Chain),当一个对象到Roots没有任何引用链时,证明此对象是无法到达,即不再可用。

在JAVA中,可作为GC Roots的对象包含:

虚拟机栈的引用的对象

方法区中的类静态属性引用的对象

方法区中的常量引用的对象

本地方法栈中JNI(Native方法)的引用的对象

http://286.iteye.com/blog/1935894

GC设计选择

  • 串行回收VS并行回收
  • 并发执行VS应用程序停止
  • 压缩VS不压缩VS拷贝

WEAK GENERATIONal HYPOTHESIS

  • 大部分对象不会存在太长时间
  • 小部分引用需要从旧生代对象指向新生代对象(Few references from older to younger objects exist.)

垃圾回收类型

  • 新生代被填满时,young generation collection(minor collection)

有针对新生代的算法

  • 旧生代被填满时,full collection(major collection)

针对旧生代的算法,适用于旧生代和持久代

  • 如果有压缩,那么不同的generation分别压缩

  • 如果从新生代promote到旧生代的对象太多,以至于旧生代放不下,那么新生代算法不会运行。这时,旧生代算法运行在整个heap上。

posted on 2015-08-07 17:02  onesteng  阅读(222)  评论(0编辑  收藏  举报