JVM垃圾回收机制及其结构


前言

jvm一直是面试官经常问的模块之一,下面由我来带大家回顾一下。

一、垃圾回收机制

1.什么是垃圾回收

比如我们通过可达性分析算法将不可达的对象进行清理就叫垃圾回收。如果我们一直分配内存却不进行清理的话内存迟早会耗空。整个垃圾回收的完整流程是:首先进行垃圾分类,判断哪些对象是垃圾对象,哪些对象是存活对象。分类后找出所有垃圾对象,最后进行垃圾清理。

2.垃圾回收算法

判断垃圾对象的算法:
1.引用计数法,每个对象有一个计数器,被引用计数器加一,释放计数器减一,如果计数器为零就表示此对象为垃圾对象
2.可达性分析法:从根节点(gcroot)开始遍历,递归的访问所有可达的对象,并打上标记,未被标记的就是垃圾对象
3.三色标记法:一开始把所有对象都标记为白色,然后把根节点变为灰色并添加到队列中,从队列中取出一个灰色对象并把它变为黑色,并把该对象引用的对象变为灰色,并加入到队列中,往复循环。最后白色对象就是垃圾对象。
优点:确保了垃圾对象的准确标记 缺点:比较复杂,效率较低。
清除垃圾对象的算法:
1.标记-清除法:直接清除未标记的对象
2.标记-压缩法:标记可达对象后,将其压缩到一端,整理出连续可用的空间
3.复制法:把内存空间分为两个区域,使用时只使用其中之一,结束后把存活对象移动到另一个空间里,然后清除当前空间。
出现fullgc的几种情况:
老年代空间不足,永久代和元空间空间不足

二、jvm组成部分

1.jvm堆的内部结构

堆中主要存放实例化对象和数组,是jvm主要的管理区域,通常分文新生代老年代,和永久代元空间。jvm将新生代分为两个区eden和survivor是为了优化垃圾回收的效率和性能,利用重复算法。
新生代中主要存放新创建的对象,这类对象很快会被垃圾回收。老年代主要存储生命周期较长的对象。新生代中几次垃圾回收后还没有回收的对象会移动到老年代。永久代用来存储常量池和方法信息等,jdk8之前大小是固定的,容易发生内存溢出问题。jdk8之后永久代会进化为元空间,元空间的大小是动态变化的,且使用本地内存。

2.jvm堆和栈的区别

堆:
储存内容:堆中主要存储实例对象和数组,所有实例对象和数组都在堆中动态分配内存。
内存管理方式:由垃圾回收器自行管理,线程共享,存在线程安全问题
生命周期:对象在堆中只要有引用在,就不会被回收
栈:
存储内容:用来存储方法的局部变量,调用参数和调用信息
内存管理方式:由编译器自动管理,内存分配和释放按方法的调用顺序进行,线程私有,线程安全
生命周期:栈中数据在方法调用结束后立即释放

3.jvm的四种引用

强引用:使用new关键字创建的对象就是强引用,强引用在对象就不会被回收。
软引用:内存不足的情况下会回收软引用对象
弱引用:不论对象有没有被引用都会被回收
虚引用:用来跟踪对象被垃圾回收的回收时间

4.什么是双亲委派机制

在类加载器加载类之前,会优先委派给其父类加载器加载,如果父类加载器加载不了,才会到本类加载器加载。保证了java核心库的安全,避免了类的重复加载,提高了类加载效率。
如何破坏:自定义类加载器

java创建对象的几种方法:使用new关键字,使用反射,使用clone方法
什么时候会发生栈溢出:递归调用过深,递归无终止条件,栈空间设置过小

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值