Java垃圾回收机制

java的垃圾回收机制是JVM虚拟机提供的能力,用于在空闲时间以不定时的方式动态回收无任何引用的对象占据的内存空间


如何确定某个对象是垃圾

在java中是通过引用来和对象进行关联的,要用对象就得引用,引用是通过引用计算来确定做这个对象是否可以被回收
如果这个对象没有引用,那就这个对象就是无用对象,就会被垃圾回收器回收。


如何计算那个对象无用



一共有四种常用的垃圾回收算法


1.Mark-sweep(标记-清除)算法


Mark-sweep分为两个阶段,标记阶段和清除阶段,标记阶段就是标记所有会被回收的对象
,清除阶段就是清除标记完成的无用对象,释放内存


这中算法有个坏处就是,回收完垃圾对象会产生内存碎片,这样会导致大对象无法分配足够
大的内存空间,这样会导致再次标记删除


什么是内存碎片


存入的对象都会有一个先后顺序


例子
我们有1,2,3,4,5,6个仓库,现在来了10车货分别把1,2,3,4,5仓库都装满了
这个时候客户需要4号仓库的货物,这样一来我还实际还剩下4,6号仓库,但是现在又来一批货物
需要连续存入,这样一来我们没有连续的仓库,导致对象存不进来这就导致内存碎片




2.Copying(复制)算法

为了弥补标记-清除算法的缺陷,复制算法会把内存分成两块,我们存入的对象只占用一块,当这块内存
被用完时,复制算法会把有用的对象复制到另一块内存里,然后把使用过的全部清除,这样就不会
出现碎片问题

这个算法也有不足,它会大大的减少内存的使用,会把内存减半,如果存货的对象过多
会降低复制的效率

3.Mark-Compact(标记-整理)算法

为了解决复制算法的缺陷,充分利用内存空间,这个算法跟标记-清除算法差不多,但是它标记过后
不时被清除,而是把有用的对象整理出来,它会把有用的对象向一端移动,然后删除另一端的无用对象


4.Generational Collection(分代收集)算法


分代收集算法时目前大部分JVM的垃圾回收器采用的算法,它的思想时根据对象的生命周期进行划分
划分不同的区域,一般分为老年代(Tenured Generatuin)和新生代(Young Generation)
老年代的特点是每次回收就会回收少量的对象,新生代的特点是每次回收都会有大量的对象被回收
对象被回收是分不同代进行不同的算法,老年代采用的是(标记-整理)的算法,新生代采用的是(复制)
算法,因为新生代回收的对象比较多,复制的操作比较少,从而给新生代划分的区域比较大,Eolen空间
和两块较小的Survivo空间,每次回收会用到Eolen空间和一块Survivo空间,把有用的对象复制到另一个Survivo
空间,然后清理掉Eolen和Survivo空间,

注:在堆中还有一个永久代(Permanet-Generation),用来储存Class类和常量方法等,采取的是废弃的
常量和无用的类
垃圾回收器


垃圾回收器是内存的具体实现,HotSpot(JDK 7)提供的几种垃圾回收器


1.ParNew收集器


它是采用了多线程进行收集


2.Serial/Serialold 收集齐


它是最基本最古老的收集齐,它是单线程的收集齐,它在收集的时候必须把所有用户线程全部暂停
Serial是针对新生代的收集齐,采用了复制算法
Serialold是针对老年代的收集齐。采用了标记整理算法
优点:是简单高效  缺点:回给用户带来停顿


3.Parallel Scavenge 收集齐


它是针对新生代的多线程并行的收集器,它在收集的时候不需要暂停,采用了复制算法
它与前两个收集器不同,它主要是可以控制吞吐量
4.Parallel Old 是Serialold的老年代(并行收集齐)使用多线程的标记整理算法


5.CMS 收集齐

它是获取最短停顿时间为目标的收集齐,(是并发收集齐)采用了标记-清除算法


6.GI 收集齐


GI是目前发展最前沿的成果,它是面向服务端的应用收集器,它能充分的利用多CPU和多核环境,
因此他是(并行和并发收集齐),它能建立可预测停顿时间的模型,内存的分配往大的方向讲
就是分配在堆上,对象主要会分配在新生代的Eden Space和From Space,少数会分配在老年代
如果新生代内存不足就会发生一次GC,发生一次GC之后,如果新生代的两个内存空间不足,
GC的过程中两个空间会把存货的对象放入 To Space 如果装不下就会存到老年代
在进行GC之后就会使用 Eden Space和To Space了

大对象就直接存储在老年代,大对象就是指需要大量连续存储的空间,也就是大数组


byte[] byte = new byte[1024*1024*4];


大牛勿喷

阅读更多
上一篇Android Vitamio集成_播放视频_At_Swim
下一篇Android 实现单聊功能_At_Swim
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭