JAVA面试题库-JVM面试题-GC原理

1、GC是什么?

    GC(Garbage Collection):JAVA/.NET中的垃圾回收器。Java是由C++发展来的。它摈弃了C++中一些繁琐容易出错的东西。其中有一条就是这个GC。而C#又借鉴了JAVA。

    在老式的C/C++程序中,程序员定义了一个变量,就是在内存中开辟了一段相应的空间来存值。由于内存是有限的,所以当程序不再需要使用某个变量的时候,就需要销毁该对象并释放其所占用的内存资源,好重新利用这段空间。在C/C++中,释放无用变量内存空间的事情需要由程序员自己来处理。就是说当程序员认为变量没用了,就手动地释放其占用的内存。但是这样显然非常繁琐,如果有所遗漏,就可能造成资源浪费甚至内存泄露。当软件系统比较复杂,变量多的时候程序员往往就忘记释放内存或者在不该释放的时候释放内存了。

    有了GC,程序员就不需要再手动的去控制内存的释放。当Java虚拟机(VM)或.NETCLR发觉内存资源紧张的时候,就会自动地去清理无用对象(没有被引用到的对象)所占用的内存空间(这里的说法略显粗略,事实上何时清理内存是个复杂的策略,下文会讲)。如果需要,可以在程序中显式地使用System.gc() / System.GC.Collect()来强制进行一次立即的内存清理。Java提供的GC功能可以自动监测对象是否超过了作用域,从而达到自动回收内存的目的,Java的GC会自动进行管理,调用方法:System.gc() 或者Runtime.getRuntime().gc();

2、为什么要进行垃圾回收?

    从计算机组成的角度来讲,所有的程序都是要驻留在内存中运行的。而内存是一个限制因素(大小)。
    除此之外,堆也有大小限制。因为地址空间和存储的限制因素,堆要通过垃圾回收机制,来维持它的正常运作,保证对象的分配,尽可能不造成“内存溢出”
    如果不进行垃圾回收,内存迟早都会被消耗空,因为我们在不断的分配内存空间而不进行回收。除非内存无限大,我们可以任性的分配而不回收,但是事实并非如此。所以,垃圾回收是必须的

3、三种基本的GC算法

可达性分析算法(根搜索算法): 从GC Roots(每种具体实现对GC Roots有不同的定义)作为起点,向下搜索它们引用的对象,可以生成一棵引用树,树的节点视为可达对象,反之视为不可达。如下图所示:

补充:GC Roots对象
虚拟机栈(帧栈中的本地变量表)中引用的对象。
方法区中静态属性引用的对象。
方法区中常量引用的对象。
本地方法栈中JNI引用的对象。
本地方法栈则为虚拟机所使用的Native方法服务。
Native方法是指本地方法,当在方法中调用一些不是由java语言写的代码或者在方法中用java语言直接操纵计算机硬件。
JNI:Java Native Interface缩写,允许Java代码和其他语言写的代码进行交互。
在这里插入图片描述

1.标记-清除算法

总共分为两部分:
第一:标记,标记出所有需要回收的对象,参考可达性分析,即 标记出不可达的对象。
第二:清除(标记的对象)。

缺点:递归效率低性能低;标记清除后会产生大量不连续的内存碎片;

2.复制算法(新生代回收算法)

把内存分成两块区域:空闲区域活动区域,第一还是标记,标记之后把可达的对象复制到空闲区,将空闲区变成活动区,同时把以前活动区的对象清除,变成空闲区。

优点: 算法实现简单,运行高效。
缺点: 耗费空间,只能使用堆内存的一半;而且假定活动区域全部是活动对象,这个时候进行交换的时候就相当于做了无用功。

补充:新生代的空间划分比例为什么是比例为8:1:1(不是按照上面算法中说的1:1)

    新创建的对象都是放在Eden空间,这是很频繁的,尤其是大量的局部变量产生的临时对象,这些对象绝大部分都应该马上被回收,能存活下来被转移到survivor空间的往往不多。所以,设置较大的Eden空间和较小的Survivor空间是合理的,大大提高了内存的使用率。
    为什么用8:1:1?
    将内存(新生代内存)分为一块较大的Eden(伊甸园)空间和两块较小的Survivor(幸存者)空间,每次使用Eden和其中一块Survivor(两个Survivor区域一个称为From区,另一个称为To区域)。当回收时,将Eden和Survivor中还存活的对象一次性复制到另一块Survivor空间上,最后清理掉Eden和刚才用过的Survivor空间。也就是说每次新生代可用内存空间为整个新生代容量的90%,而剩下的10%用来存放回收后存活的对象。

3.标记整理算法(老年代回收算法)

    复制收集算法在对象存活率较高时会进行比较多的复制操作,效率会变低。因此在老年代一般不能使用复制算法。
    针对老年代的特点,提出了一种称之为“标记-整理算法”。标记过程仍与“标记-清除”过程一致,但后续步骤不是直接对可回收对象进行清理,而是让所有存活对象向一端移动,然后直接清理掉端边界以外的内存。

4.补充:Minor GC/Major GC/Full GC

Minor GC:从年轻代空间(包括 Eden 和 Survivor 区域)回收内存;
Major GC:对老年代GC;Major GC的速度一般会比Minor GC慢10倍以上
Full GC:清理整个堆空间—包括年轻代和老年代;
详情暂时请自行百度;

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值