MicroKibaco / CrazyDailyQuestion

每日一问: 水滴石穿,聚沙成塔,坚持数月, 必有收获~
35 stars 1 forks source link

2019-10-15:说一下java的垃圾回收机制? #46

Open MicroKibaco opened 5 years ago

MicroKibaco commented 5 years ago

垃圾收集器和内存回收策阅

引言

一.引用存亡测试方式

   可达性分析算法判断对象是否存活,判断对象是否finalize(),如果对象在执行finalize()比较缓慢或者进入死循环,会导致整个回收机制奔溃。

二.java引用类型

强引用

   类似Object obj = new Object() 这类的强引用,只要强引用还在,垃圾收集器永远不会回收掉被引用的对象。

弱引用

   用来描述非必需对象,但是它的强度比软引用关联的对象只能生存到下一次收集发生之前。软引用用SoftRefrence来表示。

虚引用

   一个对象是否有虚引用的存在,完全不会对其生存空间造成影响,也无法通过虚引用获取一个对象实例。JDK 1.2 后用 PhantomRefrence 来表示。

弱引用

  弱引用来描述非必需对象的,但是它的强度比软引用更弱一些,被弱引用关联的对象只能生存到下一次垃圾回收器之前,JDK 1.2weakRefrence 来表示。

三.引用存亡标准

四.如何保证永久代不会溢出?

MicroKibaco commented 4 years ago

一.分类

  根据引用类型的强弱,我们可以把引用分为: 强引用,软引用,弱引用,虚引用

A.强引用(Strong Refrence)
MicroKibaco github = new MicroKibaco()

  声明变量和定义就会产生对象的强引用.只要对象有强引用指向,并且 GC Roots 可达,那么 Java 内存回收时,即时濒临内存耗尽也不会回收该对象。

B.软引用(Soft Refrence)

   引用力度弱于强引用,是非必需的场景,在即将OOM之前,垃圾回收机制会把这些软引用对象加入回收范围,以获得更大的内存空间,让程序更加健康的运行。

C.弱引用(Weak Refrence)

   YGC时候肯定会被回收,在强引用断开后,引用不会劫持对象,调用WeakRefrence.get()可能返回null,要注意空指针异常。

D.虚引用(Phantom Refrence)

   希望达到对对象回收的时候给系统一个通知的时候我们考虑使用虚引用

二.本质

  可以让开发工程师通过代码来决定代码的回收时机