Java美好的承诺,自动回收垃圾


640?wx_fmt=gif

导语:

Java和C++有一堵内存分配的墙,墙内的人想进去,墙里的人想出去。C++程序员苦于内存泄漏,Java程序员羡慕C++程序员可以自己控制一切。Java语言向程序员做了一个美好的承诺,程序员不需要管理内存,JVM会自动垃圾回收。那么你对GC又了解多少,本文详细介绍了GC的原理,愿与君共勉...



垃圾回收

  • GC的弊端,尽管JVM有垃圾回收机制,但是并不会按照程序员的要求随时进行GC。垃圾回收并不会及时清理内存,尽管程序员需要。程序员不能对垃圾回收进行控制。

  • 为什么回收,随着程序的运行,内存中的实力对象,变量等信息只会越来越多。如果不进行回收必然会带来性能的下降,乃至出现不必要的系统异常。

  • 哪些垃圾需要回收,JVM的五大内存区域中(程序计数器, JVM栈,本地方法栈)会随着线程的销毁自动释放内存。只有方法区和堆需要进行GC,如果一个对象不存在任何引用了,那么他就可以被回收了。

  • 什么时候回收,JVM采用一个叫做根搜索算法来进行垃圾回收。具体思路是从一个叫GC Roots 的对象开始向下搜索,如果一个对象不能达到GC Roots对象的时候就说明已经不被引用了,即可以被回收了。这样可以解决一个问题(引用计数算法),当两个对象相互引用,而他们又没有作用时不符合垃圾回收的条件。

  • Java类什么情况被回收,当该类的所有实例对象都已经被回收。类加载器ClassLoader已经被回收。该类对应的反射类 java.lang.Class对象没有被任何地方引用了。



回收区域

  • 根据新生代,旧生代,持久代的特点不一样造就了他们所使用的GC算法不一样。新生代适合那些生命周期短,频繁销毁的对象。旧生代适合生命周期长的对象。持久代在 Sun HotSpot中指的是方法区。

  • 新生代,New Genneration 或者 Yong Genneration,大致又分为Eden区和Survivor区。Survivor区又分大小相同的两部分:FromSpace和ToSpace,新建的对象就用新生代分配内存,Eden内存不足时会把存活的对象转移到Survivor中。

  • 旧生代,Old Gnneration,用于存放新生代中经过多次垃圾回收仍然存在的对象,例如缓存对象。

  • 持久代,Permeate Gnneration,在Sun 的JVM中就是方法区的意思。主要存放常量和类的一些信息。



GC算法

  • 标记-清除法(mark-sweep):思想是将要进行回收的对象进行标记,之后扫描,有标记的就回收,这样就产生了两个步骤:标记和清除。这个算法效率不高,而且会在清除完成后产生内部碎片,这样如果有大对象需要连续内存空间时,还需要进行碎片整理。

  • 复制算法(Copying),新生代内存分为三分,Eden区和两块Survivor区。一般JVM会将Eden和Survivor区的比例调为8:1。保证有一块Survivor区是空闲的,这样在垃圾回收的时候,将不需要回收的对象放在空闲的Survivor区。然后将Eden和第一块Survivor区进行完全清理,这样又一个问题,就是如果第二块Survivor区空间不够大怎么办。这时候就需要当Survivor区不够用的时候暂时借持久代内存用一下。该算法适用于新生代。

  • 标记-整理算法(mark-compact)和标记-清除法类似,区别在于在标记了不需要回收的对象后,将标记的对象移动到一起,使得内存是连续的,这时只需要将边界以外的内存清理就行。此算法适用于持久代。



回收器

  • Serial GC,最古老的收集器,现在依然广泛使用。是一种单线程垃圾回收机制,而且不仅如此,它最大的特点就是在进行垃圾回收的时候需要将正在进行的线程暂停(stop the world)。这对于某些应用是难以接受的,但只要控制暂停时间在n毫秒,大多数应用还是可以接受的。

  • ParNew GC,基本和Serial GC一样,本质就是加入了多线程机制,提高了效率。同时,他可以与 CMS GC配合,更有理由将他至于service端。

  • Parallel Scavenge GC,在整个扫描和复制过程中采用多线程的方式进行。适用于多CPU,对暂停时间要求较短的应用上,是service级别默认采用的GC方式。

  • CMS(Concurrent Mark Sweep)收集器,收集器的目标是解决Serial GC停顿的问题,以达到最短的收集时间。常见的B/S架构应用就是适合这种收集器,是基于标记-清除算法实现的。


推荐阅读:


K8S 到底是个啥


一次MySQL千万级大表优化过程


Full Gc分析与排查指南


曾今有人关注了我,

后来他找到了女朋友

640?wx_fmt=jpeg

640?wx_fmt=png

点击文末右下角的 “在看” 解锁更多惊喜哦

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值