java 垃圾回收算法

1.垃圾回收机制的意义

java区别C/C++语言的原因就在于它的垃圾自动回收机制。我们都知道C/C++开发时有个经常发生的问题就是内存泄漏,程序员需要手动释放内存才能避免内存泄漏,但是Bug总是无处不在的,而java则为了有效避免这个问题,不允许程序员手动释放内存,改为设计一个垃圾回收器进行内存回收。(即使如此,还是有较少的情况可能会发生内存泄漏的 )。

2.垃圾回收算法分类

垃圾回收分为两个步骤,标记和清除。

2.1 标记算法

引用计数法:给一个每一个对象都增加一个计数器,每次引用都进行计数,方便快捷,可以在程序运行的同时进行,缺点是无法解决对象循环引用的问题。目前少用。
GC Roots(可达性分析):从一系列Gc Roots的引用出发搜索,如果一个对象无法到达,则说明该对象已经无用了。目前用的较多,JVM的HotSpot就是用可达性分析。
可作为GC Roots的引用对象

  • 虚拟机栈中栈帧的引用对象(局部变量表)
  • 方法区中的类的静态引用对象
  • 方法区中的引用对象常量
  • 本地方法中的引用对象(Native方法)
2.2 回收算法
  1. 标记-清除算法:将所有被标记为无用的对象进行回收。
    缺点:内存空间不连续,效率不高

  2. 复制算法:将内存空间分为两块,每次只对一块进行GC,将一块空间内可用的对象复制到另一块空间中,然后清空这一块内存空间。下一次GC另一块空间。
    缺点:空间利用率低。(如果平分就浪费了一半的空间)
    优化:但是由于每次GC都会有大部分对象熬不过去,所以没必要1:1分配,更好的策略是分为一块较大的Eden块和两块较小的Survivor块,每次GC较大的Eden块和一块Survivor(1)块,将可用的对象复制都另一块Survivor(2)中去,最后清理Eden和Survivor(2),下一次GC使用Survivor(2),反复轮替使用,大小比例一般为8:1:1,但是有可能存活对象超过10%,这时候多出来的使用分配担保机制送到老年代中。

  3. 标记-整理:将存活的对象往空间的一端复制,然后清理掉剩余的空间。效率低,一般用在老年代。

3.JVM的实际回收机制(HotSpot)

3.1垃圾回收现象(过程)

1、有3个垃圾收集过程,minor garbage collection、marjor garbage collection和Full GC。
2、在进行垃圾回收的时候,会停止所有在运行的线程被称作 " stop world event "

minor GC:发生在新生代中,但Eden去满了时会触发。
major GC:发生在老年代中,许多 Major GC 是由 Minor GC 触发的。
full GC:和major GC的概念并没有明确区分。

3.2分区回收

根据存活对象的不同(指存活时间)划分为几块内存区,一般是老年代和新生代,不同区采用不同的回收算法。新生代和老年代一般是1:2。

新生代:根据经验可以知道,大部分对象在创建后不久就会被回收,只有少量存活,所以新生代采用优化的复制算法比较合理。每次存活下来的对象都会被复制进入空的Survivor块中,同时age加1,此时的GC触发条件是Eden去满了(minor GC),当出现对象的age达到某个阈值(一般是8)就会触发major GC,回收的同时把age为8且还在使用的对象移动到老年代中。

老年代:老年代中都是存活了好几次GC的对象,因此,可以认为这些对象在一段时期内,甚至在应用程序的整个生命周期中,将是常驻内存的,所以采用标记-整理算法。

大对象在分配时会直接进入老年代。

一般来说堆按如下进行分代。
在这里插入图片描述

3.3 永久代/元空间的回收

方法区:储存类的元数据信息,静态变量和常量,即使编译器产生的代码数据,由虚拟机规范所规定的。
永久代/元空间:是方法区的具体实现,JDK1.8之前是Perm区(永久代),1.8之后变成了MetaSpace(元空间),最大的区别就是Perm区的实现是在JVM内存中,而MetaSpace则是在系统内存中。

  1. 永久代的GC效率低。
  2. 字符串存在永久代容易产生性能问题和内存溢出
  3. 类及方法的信息等比较难确定其大小,因此对于永久代的大小指定比较困难,太小容易出现永久代溢出,太大则容易导致老年代溢出。
  4. Oracle 可能会将HotSpot 与 JRockit 合二为一

tips:欢迎来我的个人网站溜达溜达http://www.wsjiu.com/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值