最近看了一些java基础、博客以及《深入理解java虚拟机》等文章,生活之余就想着记录下来,也算是对知识的总结。
=======================================================================
本系列文章将从,jvm的基本概念、GC、优化配置,线程安全等方面阐述。
=======================================================================
本人这里只提供自己学习的思路,就不详细讲解了,以免误人子弟
目录
1.垃圾回收算法
2.如何区分垃圾
3.垃圾如何分代
4.什么情况下触发垃圾回收
5.jvm调优
总结:
拓扑图
1.垃圾回收算法
按照基本回收策略分
1.引用计数
2.标记-清除
3.复制
4.标记-整理
按分区对待的方式分
增量收集、分代收集
按系统进程分
串行收集、并行收集、并发收集、
2.如何区分垃圾/怎么判断它是垃圾
垃圾回收的起点是一些跟对象(java栈、静态变量、寄存器、、、)。
因为程序运行是在栈中进行的,一个栈对应一个线程,所以要获取哪些对象正在被使用,需要从栈中开始。
判断垃圾的算法:从程序运行的根节点触发,遍历整个对象,查找存活的对象。以栈或者寄存器中的引用为起点,我们可以找到堆中的对象,又从这些对象找到堆中其他对象的引用,这种引用逐步扩展,最终以null引用或者基本类型结束,这样就形成了一颗以java栈中引用所对应的对象为根节点的一颗对象树,如果栈中有多个引用,则最终会形成多颗对象树。在这些对象树上的对象,都是当前系统运行所需要的对象,不能被垃圾回收。而其他剩余对象,则可以视为无法被引用到的对象,可以被当作垃圾回收。
3.垃圾为什么要分代
分代的垃圾回收策略是基于:不同的对象的声明周期是不一样的。因此,不同生命周期的对象可以采取不同的手机方式,以便提高回收效率。
虚拟机中划分为:年轻代(Young Generation)、年老代(Old Generation) 、持久代(Permanent Generation)
分代的目的:因为垃圾回收是对整个堆空间进行回收,如果不进行分代,那么每次都需要遍历所有的存活对象,显而易见是耗时的,而分代之后,可以把不同生命周期的对象放在不同代area上,再对不同代采取不同的垃圾回收方式,达到分而治之的思想。
4.什么情况下触发垃圾回收
GC有两种类型:Scavenge Gc 、 Full Gc。
5.jvm调优
下面配图。
总结:
1.垃圾回收是对整个堆空间进行回收,栈因为每个线程都有一个栈,所以线程结束,栈空间(基本数据类型)就回收了
2.我们要区分谁是垃圾(以栈或者寄存器中的引用为起点,我们可以找到堆中的对象)基于垃圾回收算法
3.因为不同的对象的声明周期是不一样的,所以我们采用分代,不同代采用不同的方式进行回收垃圾,高效。
4.垃圾回收的时机
拓扑图
