前面简单介绍了如何确定对象是垃圾.什么时候回收.怎么回收,今天就来聊一聊java中常见的垃圾回收器,从Serial到G1,其中会着重解读CMS和G1的工作原理,包括如何安全的并发回收.cSet.rSet等以及他们各自的优缺点:下面按照新生代.老年代进行分类介绍 新生代垃圾回收器 一.Serial收集器(STW)   Serial收集器是一个单线程的.采用标记-复制算法的.回收时需要暂停用户线程(STW)的新生代垃圾回收器:可与serial old或cms搭配使用;但JDK9后已不再支持Ser…
这篇文章主要从以下几个方面介绍垃圾收集的相关知识 一.判断对象是否已死 二.主流垃圾收集算法 三.内存分配与回收策略 本章节主要从以下几个思考点着手介绍垃圾回收的相关知识:哪些内存需要回收?什么时候回收?如何回收?这也是经典的学习一个知识点的3h方法:what? when? how? 上一个章节已经介绍jvm运行时数据区的内存分布,垃圾回收主要发生在堆这个区,也就是众多对象实例呆着的地方 一.如何判断对象已死? 相信面试过高级java的工程师肯定遇到过面试官这样的问题:两个对象之间互相循环引用,…
我们知道我们编写的java代码,会经过编译器编译成字节码(class文件),再把字节码文件装载到JVM中,最后映射到各个内存区域中,我们的程序就可以在内存中运行了.那么问题来了,这些字节码文件是怎么装载到JVM中去的呢.中间经过了哪些步骤?我们常说的双亲派模式又是怎么回事?本文就来说说这些问题. 类加载器的流程 1.加载 加载是类加载的第一步.它首先通过class文件的路径读取到二进制流,并解析二进制流将里面的元数据(类型.常量等)载入到方法区(方法区上文说了就是存放这些元数据的),在java堆…
JVM(HotSpot)7种垃圾收集器 7种垃圾收集器作用于不同的分代,如果两个收集器之间存在连续,就说明他们可以搭配使用. 从JDK1.3到现在,从Serial收集器->Parallel收集器->CMS->G1,用户线程停顿时间不断缩短,但仍然无法完全消除. 1.Serial收集器(串行收集器) Serial收集器是最基本.发展历史最悠久的收集器,曾是(JDK1.3.1之前)虚拟机新生代收集的唯一选择. Serial收集器是一个单线程的收集器.“单线程”的意义不仅仅是它只会使用一个CP…
一.Minor GC.Major GC 和 Full GC Minor GC:清理新生代空间,当Eden空间不能分配时候引发Minor GC Major GC:清理老年代空间 Full GC:清理Java堆空间 二.新生代垃圾收集器 1. Serial 收集器 线程:单线程收集器, 算法:新生代标记复制,老年代标记整理 缺点:在进行垃圾收集时候需要停止所有用户线程(STW) 优点:没有线程交互开销 2. ParNew 收集器 在Serial收集器上进行改进,将GC改成了多线程,其他的包括Seri…
JVM学习笔记-第三章-垃圾收集器与内存分配策略 tips:对于3.4之前的章节可见博客:https://blog.csdn.net/sanhewuyang/article/details/95380620 3.5 经典垃圾收集器 3.5.1 Serial收集器 这个收集器是一个单线程工作的收集器,但它的单线程的意义并不仅仅是说明他只会使用一个处理器或一条收集线程去完成垃圾收集工作,更重要对的是强调在它进行垃圾收集时,必须暂停其他所有工作线程,直到它收集结束. 目前已经老无可用,但有着优于其他收…
G1垃圾收集器是一种工作在堆内不同分区上的并发收集器.分区既可以归属于老年代,也可以归属新生代,同一个代的分区不需要保持连续.为老年代设计分区的初衷是我们发现并发后台线程在回收老年代中没有引用的对象时,有的分区垃圾对象的数量很多,另一些分区垃圾对象相对较少. 虽然分区的垃圾收集工作实际还是要暂停应用线程,不过由于G1收集器专注于垃圾最多的分区,最终的效果是花费较少的时间就能回收这些分区的垃圾.这种只专注于垃圾最多的分区的方式就是G1垃圾收集器的名称由来,即首先收集垃圾最多的分区. 这一算法并不适…
JVM—深入理解内存模型与垃圾收集机制 https://juejin.im/post/5d68dc9ee51d4561ad6548f7 前言 Java是一种跨平台的语言,当初其设计初衷也是为了解决各个平台编译环境具有差异,对程序移植性问题造成困难这一痛点,于是推出了Java语言.这么多年Java受业界追捧的原因除了其面向对象的特性以外就是其可移植性强,而可移植性这一特性正式建立在JVM虚拟机这一基础上的,JVM在其内存模型和垃圾回收机制的设计上堪称神作,了解JVM虚拟机是每一个Java开发工程师…
HotSpot JVM的并发标记清理收集器(CMS收集器)的主要目标就是:低应用停顿时间.该目标对于大多数交互式应用很重要,比如web应用.在我们看一下有关JVM的参数之前,让我们简要回顾CMS收集器的操作和使用它时可能出现的主要挑战. CMS收集器有3种基本的操作,分别是: CMS收集器会对新生代的对象进行回收(所有的应用线程都会被暂停): CMS收集器会启动一个并发的线程对老年代空间的垃圾进行回收: 默认情况下CMS不会对永久代进行垃圾回收,如果有必要,CMS会发起Full GC. 就像吞吐…
一.概述 定义:虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验.转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型.类加载和连接的过程都是在运行期间完成的. 二. 类的加载方式 1):本地编译好的class中直接加载 2):网络加载:java.net.URLClassLoader可以加载url指定的类 3):从jar.zip等等压缩文件加载类,自动解析jar文件找到class文件去加载util类 4):从java源代码文件动态编译成为class文件 三.类加载的时机…