过去的几天里,我把JVM内部的垃圾回收算法和垃圾回收器.还剩下最后一个G1回收器没有说,我们今天数一下G1回收器和常见的参数配置. G1回收器 G1 (Garbage-First)是一款面向服务器的垃圾收集器,主要针对配备多颗处理器及大容量内存的机器,以极高概率满足GC停顿时间要求的同时,还具备高吞吐量性能特征.我们会想一下我们上次课说的parNew+CMS回收器已经很厉害了,但是我们的服务器是那种超大内存的服务器呢?比如内存是32G的,可能最后我们的堆内存需要分配到十多个G,我们用parNew…
JVM 垃圾回收算法和垃圾回收器. 一.垃圾回收的区域 栈:栈中的生命周期是跟随线程,所以一般不需要关注. 堆:堆中的对象是垃圾回收的重点. 方法区:这一块也会发生垃圾回收,不过这块的效率比较低,一般不是我们关注的重点. 二.怎么判断对象的存活 一般有两种方式(引用计数法.可达性分析),JVM使用的是可达性分析. 1. 引用计数法 给对象添加一个引用计数器,当对象增加一个引用时计数器加 1,引用失效时计数器减 1.引用计数为 0 的对象可被回收(Python 在用,但主流虚拟机没有使用). 优点…
接上次JVM虚拟机堆内存模型来继续说,上次我们主要说了什么时候可能把对象直接放在老年代,还有我们的可能性分析,提出GCroot根的概念.这次我们主要来说说垃圾回收所使用的的算法和我们的垃圾回收器,需要了解我们的可达性分析GCroot根是什么,还有我们的动态年龄判断和老年代分配担保机制,还不清楚咋回事的小伙伴可以去我上几篇JVM的博客去看一下,JVM内存模型的几篇博客 https://www.cnblogs.com/cxiaocai/p/11520731.html 垃圾回收算法,主要就三种,标记清…
垃圾回收算法 1.标记清除 标记-清除算法将垃圾回收分为两个阶段:标记阶段和清除阶段. 在标记阶段首先通过根节点(GC Roots),标记所有从根节点开始的对象,未被标记的对象就是未被引用的垃圾对象.然后,在清除阶段,清除所有未被标记的对象. 适用场合: 存活对象较多的情况下比较高效 适用于年老代(即旧生代) 缺点: 容易产生内存碎片,再来一个比较大的对象时(典型情况:该对象的大小大于空闲表中的每一块儿大小但是小于其中两块儿的和),会提前触发垃圾回收 扫描了整个空间两次(第一次:标记存活对象:第…
常用的垃圾回收算法 标记-清除 标记清除算法是一种非移动式的回收算法,分为标记 清除 2个阶段,简而言之就是先标记出需要回收的对象,标记完成后再回收掉所有标记的内存对象,如下图 可见回收后图中被标记的对象被删除回收了,但是碎片化比较严重不连续 对于下次分配大对象的时候由于内存不连续性影响比较大,而且每一次Gc的时候需要执行2个操作 1次标记 1次回收 标记-整理压缩 标记整理压缩算法是一种移动式的算法,由于上面标记清除算法导致内存不连续的问题 标记-整理算法就解决了这个问题. 工作原理也是2阶段…
基本上 jvm内存回收有三种 基本算法 标记-清除 标记清除的算法最简单,主要是标记出来需要回收的对象,然后然后把这些对象在内存的信息清除.如何标记需要回收的对象,在上一篇文章里面已经有说明. 标记-清除-压缩 这个算法是在标记-清除的算法之上进行一下压缩空间,重新移动对象的过程.因为标记清除算法会导致很多的留下来的内存空间碎片,随着碎片的增多,严重影响内存读写的性能,所以在标记-清除之后,会对内存的碎片进行整理.最简单的整理就是把对象压缩到一边,留出另一边的空间.由于压缩空间需要一定的时间,会…
话不多说,先上图. ***.class文件执行大概就是这样来走的.我们都知道我们的java文件经过编译以后会生成对应的class文件.先经过类装载子系统,然后塞进运行时内存模型的元空间,开始执行方法,对象放在堆,线程开辟栈空间,程序计数器控制执行顺序.字节码执行引擎整体调控程序计数器,走你...大概就是这样的.我们先来看一下类装载子系统是如何工作的. 类装载子系统大概分为,验证->准备->解析->初始化.笼统的来说就这个4个步骤. 1,验证:验证我们的编译文件(字节码文件)是否正确. 2…
还是我们上次的图,我们上次大概讲解了类加载子系统的执行过程,验证,准备,解析,初始化四个过程.还有我们的双亲委派机制. 我们这次来说一下运行时内存模型.上一段小代码. public class Main { public int compute() { int a = 11; int b = 22; int c = a + b / 2; return c; } public static void main(String[] args) { Main main = new Main(); int…
垃圾回收算法和内存分配策略 Java垃圾回收 垃圾收集,也就是GC并不是Java的伴生物,而对于GC的所需要完成任务主要就是: 1.哪些内存是需要回收的? 2.何时去回收这些内存? 3.以何种方式去回收这些内存? 前面已经提到过: 程序计数器,虚拟机栈,本地方法栈3个内存区域跟随线程的生命周期,这三个区域的内存分配和回收都是确定的,JVM不需要过多的担心这些区域的内存回收和分配. 但是在堆和方法区中却不一样,只有在程序运行的时候才能知道哪些对象会被创建,而对于方法区的内存回收,Java虚拟机并不…
昨天总结了JVM内存分区相关的知识,这次我们将来了解下JVM的另一个核心知识点——垃圾回收算法.这一部分其实并不太难,如果对操作系统的内存处理算法有所了解,那么这部分算法其实只看名字就能明白,两者在原理上是一样的,而且JVM的相对更为简单点. 在初学JVM的时候,我们往往会对这部分感到迷惑:网上不少博客介绍的五花八门,像引用计数算法.串行.并行.并发算法等,他们到底算不算垃圾回收算法,算的话又和基本的那几个算法有什么关系呢?(PS:其实如果认真看过书的话,就不会疑惑了,因为书里边介绍的很清晰),…