CrazyDailyQuestion
CrazyDailyQuestion copied to clipboard
2019-10-15:说一下java的垃圾回收机制?
垃圾收集器和内存回收策阅
引言
- 哪些内存需要回收?
- 什么时候回收?
- 如何回收?
一.引用存亡测试方式
可达性分析算法判断对象是否存活,判断对象是否finalize()
,如果对象在执行finalize()
比较缓慢或者进入死循环,会导致整个回收机制奔溃。
二.java引用类型
强引用
类似Object obj = new Object()
这类的强引用,只要强引用还在,垃圾收集器永远不会回收掉被引用的对象。
弱引用
用来描述非必需对象,但是它的强度比软引用关联的对象只能生存到下一次收集发生之前。软引用用SoftRefrence
来表示。
虚引用
一个对象是否有虚引用的存在,完全不会对其生存空间造成影响,也无法通过虚引用获取一个对象实例。JDK 1.2
后用 PhantomRefrence
来表示。
弱引用
弱引用来描述非必需对象的,但是它的强度比软引用更弱一些,被弱引用关联的对象只能生存到下一次垃圾回收器之前,JDK 1.2
用 weakRefrence
来表示。
三.引用存亡标准
四.如何保证永久代不会溢出?
一.分类
根据引用类型的强弱,我们可以把引用分为: 强引用,软引用,弱引用,虚引用
A.强引用(Strong Refrence)
MicroKibaco github = new MicroKibaco()
声明变量和定义就会产生对象的强引用.只要对象有强引用指向,并且 GC Roots
可达,那么 Java 内存回收时,即时濒临内存耗尽也不会回收该对象。
B.软引用(Soft Refrence)
引用力度弱于强引用
,是非必需的场景,在即将OOM
之前,垃圾回收机制会把这些软引用对象加入回收范围,以获得更大的内存空间,让程序更加健康的运行。
C.弱引用(Weak Refrence)
YGC
时候肯定会被回收,在强引用断开后,引用不会劫持对象,调用WeakRefrence
.get()
可能返回null
,要注意空指针异常。
D.虚引用(Phantom Refrence)
希望达到对对象回收的时候给系统一个通知的时候我们考虑使用虚引用
二.本质
可以让开发工程师通过代码来决定代码的回收时机