喜欢能够点个赞哦java
程序计数器程序员
Java虚拟机栈算法
本地方法栈数组
Java堆(GC区)(Java Head)安全
JDK1.7 方法区(永久代)数据结构
运行时常量池多线程
JDK1.8 元空间并发
直接内存函数
句柄访问布局
直接指针访问(HotSpot使用)
第一次标记(缓刑)
引用计数算法
可是它难以解决对象之间的相互循环引用的状况,此时这个两个对象引用计数值为1,可是永远没法用到这两个对象。
- 可达性分析算法(Java使用) - 以一系列GC Roots的对象做为起始点,从这些节点开始向下搜索,搜索所走过的路径称为引用链,当一个对象到GC Roots没有任何引用链相连是,则证实此对象不可用,能够被回收。
GC Roots对象包括
第二次标记
finalize()
知足无用的类三个判断条件才仅仅表明能够进行回收,不是必然关系,可使用-Xnoclassgc参数控制。
不足:
如今商业虚拟机都采用这种算法用于新生代。
由于新生代中的对象98%都是朝生暮死,因此将内存分为一块较大的Eden空间和两块较小的Survivor空间,每次使用Eden和其中一块Survivor空间。
当回收时,若是另一块Survivor空间没有足够的空间存放存活下来的对象时,这些对象将直接经过分配担保机制进入老年代。
枚举根节点(GC Roots)
安全点
程序执行只有到达安全点时才能暂停,到达安全点有两种方案。
可是当线程sleep或blocked时没法响应JVM的中断请求走到安全点中断挂起,因此引出安全区域。
安全区域
线程进入安全区域时表示本身进入了安全区域,这个发生GC时,JVM就不须要管这个线程。
线程离开安全区域时,检查系统是否完成GC过程,没有就等待能够离开安全区域的信号为止,否者继续执行。
新生代
优势:对比其余单线程收集器简单高效,对于单个CPU环境来讲,没有线程交互的开销,所以拥有最高的单线程收集效率。
它是Client场景下默认新生代收集器,由于在该场景下内存通常来讲不会很大。
- 2. parnew收集器 - 它是Serial收集器的多线程版本,公用了至关多的代码。
在单CPU环境中绝对不会有比Serial收集器更好的效果,甚至在2个CPU环境中也不能百分之百超越。
它是Server场景下默认的新生代收集器,主要由于除了Serial收集器,只用它能与CMS收集器配合使用。
- 3. parallel scavenge收集器 - “吞吐优先”收集器,与ParNew收集器差很少。
可是其余收集器的目标是尽量缩短垃圾收集时用户线程停顿的时间,而它的目标是达到一个可控制的吞吐量。这里的吞吐量指CPU用于运行用户程序的时间占总时间的比值。
老年代
也是给Client场景下的虚拟机使用的。
- 5. parallel old收集器 - 是Parallel Scavenge收集器的老年代版本。
在注重吞吐量已经CPU资源敏感的场合,均可以优先考虑Parallel Scavenge和Parallel Old收集器。
- 6. cms收集器 - Concurrent Mark Sweep收集器是一种以获取最短回收停顿时间为目标的收集器。 - 运做过程 - 1. 初始标记(最短)。仍须要暂停用户线程。只是标记一下GC Roots能直接关联到的对象,速度很快
1 和4 两个步骤并无带上并发两个字,即这两个步骤仍要暂停用户线程。
- 优缺点 - 并发收集、低停顿。
运做过程
主动引用
被动引用
初始化阶段才真正执行类中定义的Java程序代码,是执行类构造器
在准备阶段,类变量已经给过零值,而在初始化阶段,根据程序员经过程序制定的主观计划去初始化类变量和其余资源。
虚拟机会保证clinit在多线程环境中被正确的加锁、同步。其余线性唤醒以后不会再进入clinit方法,同一个类加载器下,一个类型只会初始化一次。
- <init>() - 对象构造器方法。Java对象被建立时才会进行实例化操做,对非静态变量解析初始化。
会显式的调用父类的init方法,对象实例化过程当中对实例域的初始化操做所有在init方法中进行。
类与类加载器
类加载器分类
启动类加载器
扩展类加载器
应用程序类加载器
自定义类加载器
双亲委派模型
工做过程
好处
Minor GC
时机
Full GC
时机