Java垃圾回收机制

原创 2018年04月15日 14:07:11
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];


大牛勿喷

Java垃圾回收机制理解

垃圾回收机制的理解。
  • daguairen
  • daguairen
  • 2016-08-19 10:17:06
  • 6770

java垃圾回收机制---面试的问题

面试过程中遇到一个问题:  java 垃圾回收器,回收没有引用指向的对象实例,那如果是A->B,B->A这种就一直回收不了了吗? Q: Does unreachable m...
  • Happy_wu
  • Happy_wu
  • 2016-09-12 16:48:33
  • 2365

简述java垃圾回收机制

简述java垃圾回收机制 一.谁在做Garbage Collection?         一种流行的说法:在C++里,是系统在做垃圾回收;而在Java里,是Java自身在做。 ...
  • oHuiJia1
  • oHuiJia1
  • 2014-05-05 15:32:08
  • 1831

简单理解了下java中的垃圾回收机制

准备找工作,所以各种看书了,对于java开发岗来说垃圾回收机制的份量很重的说。看了以下几本书中对垃圾回收机制的描述:《深入理解java虚拟机》、《java编程思想》、《疯狂Java讲义》、《Java程...
  • NIMANCY
  • NIMANCY
  • 2016-07-14 17:12:01
  • 1544

面试题 java垃圾回收机制

前几天面试的时候被问到垃圾回收机制的时候,心里还庆幸这个之前看过,可是答完后就傻了,面试官竟然问还有没有。 好吧,我一直以为面试官是懂我说什么的,加上说的有点快,有点乱,很多东西都省略掉了,估计是我...
  • q291611265
  • q291611265
  • 2015-04-18 17:46:39
  • 13506

JAVA 垃圾回收机制原理

这里,我不用什么理论方式讲述垃圾回收机制原理.我只通过2个简单的程序,探讨我对Java 垃圾回收机制的理解.毕竟很多东西,理论的术语可能没有直观的测试更好.   package cn.vicky....
  • eclipser1987
  • eclipser1987
  • 2012-03-03 16:18:09
  • 4326

JAVA的事件委托机制和垃圾回收机制

java 事件委托机制的概念,一个源产生一个事件并将它送到一个或多个监听器那里。在这种方案中,监听器简单的等待,直到它收到一个事件。一旦事件被接受,监听器将处理这个事件,然后返回。 垃圾回收机制 垃...
  • saifer000
  • saifer000
  • 2012-10-30 09:08:21
  • 856

深入解析Java垃圾回收机制

 面试必备 | 深入解析Java垃圾回收机制 2017-08-09 六尺帐篷 Android技术杂货铺 Android技术杂货铺 Android技术杂货铺 微信号 ...
  • java_2017_csdn
  • java_2017_csdn
  • 2017-08-10 15:14:28
  • 334

Java垃圾回收机制面试回答

在面试的时候,经常会被问Java的垃圾回收机制是怎样的?       一开始我是懵逼的,因为我就知道垃圾回收就是对象不再用,就回收。它有什么原理更本就不知道,查资料,总结。 个人能力有限,有错希望...
  • jim19890923
  • jim19890923
  • 2017-06-16 10:52:23
  • 559

垃圾回收机制如何优化程序

垃圾回收机制,如何优化程序 原文地址:http://blog.sina.com.cn/s/blog_a0af2b6d0101fldu.html 虽然程序员无法控制JVM的垃圾回收机制。...
  • baidu_35751704
  • baidu_35751704
  • 2017-06-24 14:21:54
  • 725
收藏助手
不良信息举报
您举报文章:Java垃圾回收机制
举报原因:
原因补充:

(最多只允许输入30个字)