JVM垃圾回收采用的是可达性分析算法:
从GC set中的GC roots 作为起点,从这些节点向下搜索,搜索的路径被称为引用链,如果一个对象不存在引用链的话,那么说明这个对象已死。就会被GC回收器回收。
GC roots 是
1.来自于JVM栈中引用的对象。比如各个线程中被调用的方法堆栈中使用到的参数、局部变量、临时变量等。
2.方法区中静态属性引用的对象。比如Java中的引用类型静态变量。
3.方法区中常量引用的对象。比如字符串常量池(String Table)中的引用。
4.本地方法栈中引用的对象。
5.Java虚拟机内部的引用。比如基本数据类型对应的Class对象,一些常驻的异常类等,还有系统的类加载器。
6.所有被同步锁持有的对象。
…
并不是所有的引用对象一定就会被GC 的时候回收掉。
JDK1.2之后的四种引用类型:
================
1.强引用:
就是程序中一般使用的引用类型,即使发生OOM也不会回收的对象。
就是为刚被new出来的对象所加的引用,它的特点就是,永远不会被GC,除非显示的设置null,才会GC。
比如:
2.软引用:
就是用来描述一些还有用,但是非必须的对象,只被软引用关联着的对象,在系统将要发生OOM前会回收的对象。如果这次回收还没有足够的内存,才会抛出OOM的异常。
3.弱引用:
弱引用也是用来描述那些非必要的对象,它的强度比软引用还低一些。当垃圾回收器开始工作的时候,无论内存是否够用,都会回收掉只被弱引用关联着的对象。
4.虚引用:
它是最弱的一种引用关系。刚被创建就会被GC回收器回收。它的价值就是在GC 的时候触发一次方法的回调。
虚拟机中的并行与并发:
并行:
并行描述的是多条垃圾收集器线程之间的关系,说明同一时间有多条这样的线程在同时的进行工作。
并发:
并发描述的是垃圾收集器线程与用户线程之间的关系,说明同一时间垃圾收集器的线程和用户线程之间同时在运行。
常见的垃圾回收算法:
==========
1.标记–清除算法:(Mark–Sweep)
将死亡的对象标记,然后进行GC。
执行的效率不稳定。如果堆中有大量的对象,其中有大部分都是要被回收的话 ,那么必需要进行大量的标记–清除的步骤,导致执行效率的降低。
会造成内存碎片的问题,使空间的利用率降低。标记–清除之后会产生大量的不连续的内存碎片。
2.标记–复制算法:
将空间分为两部分,一部分始终是未使用的状态。当进行垃圾回收的时候。
将存活的对象复制到未使用的空间上,然后将另一半的区域进行全GC。
但是标记–复制算法在对象存活率比较高的时候就要进行多次的复制操作,效率会降低。而且每次只有50%的内存空间被使用。
3.标记–整理算法:
将存活的对象进行移动,然后进行GC。对象的移动需要STW,解决了垃圾碎片的问题。
常见的垃圾回收器:
=========
1.Serial/Serial Old收集器 是最基本最古老的收集器,它是一个单线程收集器,并且在它进行垃圾收集时,必须暂停所有用户线程。Serial收集器是针对新生代的收集器,采用的是Copying算法,Serial Old收集器是针对老年代的收集器,采用的是Mark-Compact算法。它的优点是实现简单高效,但是缺点是会给用户带来停顿。
2.ParNew收集器是Serial收集器的多线程版本,使用多个线程进行垃圾收集。
3.Parallel Scavenge收集器 是一个新生代的多线程收集器(并行收集器),它在回收期间不需要暂停其他用户线程,其采用的是Copying算法,该收集器与前两个收集器有所不同,它主要是为了达到一个可控的吞吐量。
4.Parallel Old收集器 是Parallel Scavenge收集器的老年代版本(并行收集器),使用多线程和Mark-Compact算法。
5.CMS(Concurrent Mark Sweep)收集器是一种以获取最短回收停顿时间为目标的收集器,它是一种并发收集器,采用的是Mark-Sweep算法。
6.G1收集器 是当今收集器技术发展最前沿的成果,它是一款面向服务端应用的收集器,它能充分利用多CPU、多核环境。因此它是一款并行与并发收集器,并且它能建立可预测的停顿时间模型。
新时代、老年代
=======
Java 中的堆也是 GC 收集垃圾的主要区域。GC 分为两种:Minor GC、FullGC ( 或称为 Major GC )。 Minor GC 是发生在新生代中的垃圾收集动作,所采用的是复制算法。新生代几乎是所有 Java 对象出生的地方,即 Java 对象申请的内存以及存放都是在这个地方。Java 中的大部分对象通常不需长久存活,具有朝生夕灭的性质。
当一个对象被判定为 “死亡” 的时候,GC就有责任来回收掉这部分对象的内存空间。新生代是GC收集垃圾的频繁区域。当对象在 Eden ( 包括一个 Survivor 区域,这里假设是 from 区域 ) 出生后,再经过一次 Minor GC 后,如果对象还存活,并且能够被另外一块 Survivor 区域所容纳( 上面已经假设为 from 区域,这里应为 to 区域,即 to 区域有足够的内存空间来存储 Eden 和 from 区域中存活的对象 ),则使用复制算法将这些仍然还存活的对象复制到另外一块 Survivor 区域 ( 即 to 区域 ) 中。
然后清理所使用过的 Eden 以及 Survivor 区域 ( 即from 区域 ),并且将这些对象的年龄设置为1,以后对象在 Survivor 区每熬过一次 Minor GC,就将对象的年龄 + 1,当对象的年龄达到某个值时 ( 默认是 15 也就是经历15次GC之后还存活的对象),这些对象就会被移动到老年代。
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)
![img](https://i-blog.csdnimg.cn/blog_migrate/27c16fe19800ccf2748bb243454cdfba.jpeg)
最后
2020年在匆匆忙忙慌慌乱乱中就这么度过了,我们迎来了新一年,互联网的发展如此之快,技术日新月异,更新迭代成为了这个时代的代名词,坚持下来的技术体系会越来越健壮,JVM作为如今是跳槽大厂必备的技能,如果你还没掌握,更别提之后更新的新技术了。
更多JVM面试整理:
《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》,点击传送门即可获取!
新迭代成为了这个时代的代名词,坚持下来的技术体系会越来越健壮,JVM作为如今是跳槽大厂必备的技能,如果你还没掌握,更别提之后更新的新技术了。
[外链图片转存中…(img-5gHDvRZX-1711904322979)]
更多JVM面试整理:
[外链图片转存中…(img-tfIku4uy-1711904322979)]
《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》,点击传送门即可获取!