java 学习篇(JVM(java 虚拟机)-GC)

JVM(java 虚拟机)-GC

这是通过整理网上的资料出来的,会介绍到什么是GC,作用是什么,什么时候触发 等等.......

 

1.1 GC简单的了解

GC :Garbage Collections 字面意思是垃圾回收器,释放垃圾占用的空间。让创建的对象不需要像c、c++那样delete、free掉 。对于c、c++的开发人员来说内存是开发人员分配的,也就是说还要对内存进行维护和释放。对于Java程序员来说,一个对象的内存分配是在虚拟机的自动内存分配机制的帮助下,不再需要为每一个new操作去写配对的delete/free代码,而且不容易出现内存泄露和内存溢出问题,但是,如果出现了内存泄露和内存溢出问题,而开发者又不了解虚拟机是怎么分配内存的话,那么定位错误和排除错误将是一件很困难的事情

1.2 GC--->老年代、新生代

JVM将堆分成了二个大区新生代(Young)和老年代(Old),新生代又被进一步划分为Eden和Survivor区,而Survivor由FromSpace和ToSpace组成,也有些人喜欢用Survivor1和Survivor2来代替。这里为什么要将Young划分为Eden、Survivor1、Survivor2这三块,给出的解释是  

  “Young中的98%的对象都是死朝生夕死,所以将内存分为一块较大的Eden和两块较小的Survivor1、Survivor2”

 

1.2.1 新生代

定义:新创建的对象都是用新生代分配内存,Eden空间不足时,触发Minor GC,这时会把 存活的对象转移进Survivor区。

新生代的GC:新生代通常存活时间较短基于Copying算法进行回收,就是扫描出存活的对象,并复制到一块新的完全未使用的空间中,copy在Eden和FromSpace或ToSpace之间。新生代采用空闲指针的方式来控制GC触发,指针保持最后一个分配的对象在新生代区间的位置,当有新的对象要分配内存时,用于检查空间是否足够,不够就触发GC。当连续分配对象时,对象会逐渐从Eden到Survivor,最后到老年代。

在新生代中,每次垃圾收集都发现有大批对象死去,只有少量存活,则使用Copying算法,新生代内存被分为一个较大的Eden区和两个较小的Survivor (səˈvaɪvə(r))区,每次只使用Eden区和一个Survivor区,当回收时将Eden区和Survivor还存活着的对象一次性的拷贝到另一个Survivor区上,最后清理掉Eden区和刚才使用过的Survivor区,Eden和Survivor的默认比例是8:1

1.2.2 老年代

定义:老年代用于存放经过多次Minor GC之后依然存活的对象。

老年代的GC:老年代对象存活的时间比较长、比较稳定,因此采用标记(Mark)算法来进行回收,所谓标记就是扫描出存活的对象,然后再进行回收未被标记的对象,回收后对用空出的空间要么进行合并、要么标记出来便于下次进行分配,总之目的就是要减少内存碎片带来的效率损耗。

 

1.3 回收算法

1.3.1 ①Mark-Sweep(标记-清除)算法

定义:标记-清除算法分为两个阶段:标记阶段和清除阶段。标记阶段的任务是标记出所有需要被回收的对象,清除阶段就是回收被标记的对象所占用的空间

 

优点:简单易理解,实现简单

缺点:容易产生内存碎片,碎片太多可能会导致后续过程中需要为大对象分配空间时无法找到足够的空间而提前触发新的一次垃圾收集动作

 

 

1.3.2 ②.Copying(复制)算法 

定义:将可用内存按容量划分为大小相等的两块,每次只使用其中的一块。当这一块的内存用完了,就将还存活着的对象复制到另外一块上面,然后再把已使用的内存空间一次清理掉

 

优点:虽然实现简单,运行高效且不容易产生内存碎片

缺点:但是因为能够使用的内存缩减到原来的一半,所以对内存空间的使用做出了高昂的代价,如果存活对象很多,那么Copying算法的效率将会大大降低。我们的新生代GC算法采用的是这种算法

③Mark-Compact(标记-整理)算法

定义:该算法标记阶段和Mark-Sweep一样,但是在完成标记之后,它不是直接清理可回收对象,而是将存活对象都向一端移动,然后清理掉端边界以外的内存,在一般厂商JVM中老年代GC就是使用的这种算法,由于老年代的特点是每次回收都只回收少量对象。

 

1.4 什么时候要用GC ?

定义:Java堆内存不足时,GC会被调用。当应用线程在运行,并在运行过程中创建新对象,若这时内存空间不足,JVM就会强制地调用GC线程,以便回收内存用于新的分配。若GC一次之后仍不能满足内存分配的要求,JVM会再进行两次GC作进一步的尝试,若仍无法满足要求,则 JVM将报“out of memory”的错误,Java应用将停止

1.5 Minor GC、Full GC、OOM什么时候触发 ?

创建对象是新生代的Eden空间调用Minor GC;当升到老年代的对象大于老年代剩余空间Full GC;GC与非GC时间耗时超过了GCTimeRatio的限制引发OOM。

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值