java 多线程 垃圾回收_JAVA垃圾回收机制 - 1024菜bird的个人空间 - OSCHINA - 中文开源技术交流社区...

前言

线程独享的内存区域有程序计数器,虚拟机栈,本地方法栈,这些区域不用考虑内存回收的问题,随着线程的执行结束,自然就回收了,而堆内存和方法区的回收则不一样,他们的内存分配和回收是动态的。

1.对象存活与否

法一:引用计数算法原理:每当有地方引用该对象时,计数器加一,当引用实效的时候,计数器减一,当计数器值为0的时候可以进行对象的内存回收。问题:无法解决对象之间的循环引用法二:可达性分析原理 :1.选择一系列的对象作为GC Roots(GC ROOTS:栈帧中的局部变量表中的对象引用,方法区中静态属性引用,常量池中的常量引用),其实我觉得除了object5=null这种情况之外都可以作为GC ROOTs 2.如果对象之间存在引用关系,那么它们之间就应该可达,eg:Object1于Object2 3.从GC ROOTs进行可达性分析如果不可达那么久认为对象可以被回收(eg:object5,object6,object7)

706a909b883ca0b9da552e4de841ee59.png

图1.可达性分析算

2.对象的垃圾回收过程---对象的二次标记过程(回收堆内存)

1.进行可达性分析,发现对象不可达,则进行第一次标记

2.第一次标记后的对象将会检查对象是否有覆盖finalize方法以及finalized是否被执行过。

3.finalized函数没有被执行过的对象会被放入F-Queue队列中,执行finalized函数,若执行过程中对象被重新引用,那么在第二次标记时该对象将会被移出F-Queue,否则对象会被回收。

3.回收方法区(加载过的类、常量池、静态变量)

回收对象:

什么样的类才是没用的类?

无用常量:没有被引用的常量

无用类:

1.该类的所有实例已经被回收

2.类的加载器已经被回收(CLASSLOAD)

3.该类的CLASS对象没有被使用

4.垃圾回收算法

总体思想:

阶段一:对需要回收内存的对象进行标记

阶段二:对标记过的内存进行回收

问题:

1.效率低下

2.产生大量的内存碎片

af69f2f7aad6139d672a9d77267a2f28.png

图2:标记-清除算法

新生代对象的回收算法复制法 1.新生代对象需要回收的对象数量比较少 2.为了解决标记-清除算法效率低下的问题,我们把内存分为两部分,Eden和两块Survivor(8:1:1),Eden内存用完,进行垃圾回收之前,会把Eden上的存活的对象复制到survivor上,之后对Eden进行整块回收

48a08ad2c0306129a119afb228b2ae34.png

图3.复制法回收新生期内存

老年代对象回收算法

标记-整理

老年代的对象存活时间比较旧,甚至会出现100%存活的极端情况,因此复制法不再适用。

阶段一:标记

阶段二:整理,先不对内存进行回收,而是把存活的对象向内存的一端进行移动,然后直接清除掉边界以外的内存。

4.何时进行垃圾回收

safepoint

为了避免程序长时间执行,往往会在代码复用较多的地方设置safepoint,例如方法跳转,循环跳转,异常跳转

进行垃圾回收之前需要所有的线程在safepoint停下来,为了达到同步有两种方式

1.抢先试:先中断所有的线程,然后让线程,自己“跑”到最近的safepoint

2.主动式:在safepoint处设置一个轮训标志,当线程发现标志设置为true时,就会在轮询的位置停下来

safeRegion

当线程分配不到CPU时间片的时候,线程自然就不能跑到safepoint,这时就要以来saferegion进行垃圾回收

saferegion是指在一片代码中对象的引用关系不发生变化的时候。

5.垃圾回收器

目前常见的垃圾回收器如图所示

97aeaf2fa1ac6db295c33191f362cf40.png

图4.虚拟机的垃圾回收器

简单介绍

1.Serial

新生期对象的单线程收集器,需要首先停止用户线程(stop the world)

2.Serial Old

老年期单线程,也需要停止用户线程

3.ParNew

新生期对象的多闲扯功能收集器

4.Parallel Scavenge

与Serial回收器类似是新生对象的垃圾回收器,Serial追求的是是的垃圾回收所占用的CPU时间尽量的短,而Parallel Scavenge追求的是最大吞吐量 (运行用户程序时间)/(运行用户程序时间+垃圾回收的时间)

6.Parallel Old

Parallel Scavenge的老年版本

5.CMS

基于标记-清除的老年代垃圾回收器,分为如下四个步骤

初始标记--GC Roots直接关联的对象

并发标记--GC Roots Tracing的过程(与用户程序并发)

重新标记--并发标记过程中,用户程序新长生的对象进行标记

并发清理--进行垃圾回收

7.GI

与CMS类似,并发清理变为筛选回收,加快回收的效率,还没有成熟版本

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值