java中nursey_JAVA内存模型

JAVA内存模型

堆/Stack

实例、静态变量、数组变量保存在堆中。

堆在JVM启动时创建,在程序运行过程中可能会变大或变小。

新生代 旧生代 和 持久代

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

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

67Ui9yb.png

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.

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

垃圾回收

JAVA中的GC算法

根搜索算法(GC Roots Tracing)

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

bmCZluc.jpg

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

虚拟机栈的引用的对象

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

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

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

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上。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值