`

《深入理解java虚拟机》第三章读书笔记

 
阅读更多

3.2 引用计数法

      主流的java虚拟机没有选用引用计数算法来管理内存,主要原因是它何难解决对象之间相互引用的问题

3.2.2 可达性分析算法

       可作为GC Roots对象的几种

1)虚拟机栈(栈帧中的本地变量表)中引用的对象

2)方法区中类静态属性引用的对象

3)方法区中常量引用的对象

4)本地方法栈中JNI(即一般说的Native方法)引用的对象

3.2.3 再谈引用

      jdk1.2之后,java对引用概念进行了扩充,将引用分为强引用,软引用,弱引用,虚引用四种,引用强度逐步减弱

强引用:普遍存在,只要强引用存在,垃圾收集器永远不会回收掉被引用的对象

软引用:描述一些还有用但并非必需的对象,对于软引用关联的对象,在系统将要发生内存溢出之前,将会把这些对象进行回收范围之中进行第二次回收,如果这次回收还没有足够的内存,才会抛出异常。在jdk1.2之后,提供了SoftReference类来实现软引用

弱引用:描述非必需对象,无论内存是否足够,都会回收掉只被弱引用关联的对象。WeakReference

虚引用:幽灵引用,幻影引用,设置虚引用关联的唯一目的就是在这个对象被垃圾回收的时候收到一个系统通知。PhantomReference

3.2.5 方法区

      方法区是没有垃圾回收的,主要原因是性价比太低

永久代中垃圾回两种:废弃常量,无用的类

无用的类的标准

1)该类所有的实例都已经被回收

2)加载该类的ClassLoader已经被回收

3)该类对应的java.lang.Class对象没有在任何地方被引用,无法在任何地方通过反射访问该类的方法

3.3  垃圾收集算法

标记-清除算法:先标记,后回收

缺点:标记和清除的效率都不高;标记清除之后产生大量内存碎片

复制算法:将内存区域分成两部分,每次只使用其中一块,当这块使用完了,就将还存活的对象复制到另一块上面,然后把已使用过的内存空间一次清理掉。

HotSpot虚拟机默认Eden和Survivor大小比例为8:1

标记-整理算法:标记过程跟标记-清除一样,然后让所有存活对象都向一端移动,然后直接清理掉端边界以外的内存。

分代手机算法:新生代--->复制算法

老年代--->标记-清理或者标记--整理

3.4 HotSpot算法实现

1)枚举根节点

可达性分析对执行时间的敏感还体现在GC停顿上,这项工作必须在确保一致性的快照中实现; 

一致性: 在整个分析期间整个执行系统看起来被冻结在某个时间节点上,不可以出现分析过程中对象引用关系还在不断的变化的情况,这点不满足的话分析结果就无法得到保证

这个点----Stop the World

2)安全点

安全点的选定是以是否具有让程序长时间执行的特征为标准选定

3)安全区域

   安全区域是指在一段代码片段之中,引用关系不会发生变化

3.5 垃圾收集器

1)Serial 收集器

    单线程收集器,单cpu或一条收集器去完成垃圾回收,垃圾回收时,必须暂停所有工作线程,直到它收集完成;适用于Client模式下的虚拟机

2)ParNew 收集器

    多线程收集器,在Server模式下虚拟机首选的新生代收集器;除了Serial收集器,只有它能与CMS收集器配合工作;-XX:+UseConcMarkSweepGC 默认新生代收集器,也可以使用-XX:+UseParNewGC强制指定

-XX:ParalleGCThreads指定限制垃圾收集的线程数

3)Parallel  Scavenge收集器

新生代收集器,使用复制算法,多线程,主要是达到一个可控制的吞吐量

-XX:MaxGCPauseMills 控制最大垃圾收集停顿时间

-XX:GCTimeRatio 直接设置吞吐量大小

-XX:UseAdaptiveSizePolicy 开关参数,打开之后就不需要指定新生代和老年代比例,晋升老年代对象大小等参数,GC的自适应调接策略

4) CMS收集器

    获取最短回收停顿时间为目标的收集器,基于标记-清除算法,过程分为4个步骤

初始标记

并发标记

重新标记

并发清除

缺点:

1)CMS收集器对cpu非常敏感,默认回收线程数=(cpu数量+3)/4

2)CMS收集器无法处理浮动垃圾

3)碎片太多

-XX:UseCMSCompactAtFullCollection  默认开启,用于在CMS收集器顶不住FullGC时开启碎片整理的合并整理过程。

-XX:CMSFullGCsBeforeCompaction  默认0 设置执行多少次不压缩的FullGC后,执行一次带压缩的

5)G1收集器

   面向服务器端应用的垃圾收集器,优点: 并行与并发;分代收集;空间整合;可预测的停顿;

收集时将java堆分成多个大小相等的独立区域Region,虽然仍有新生代和老年代的概念,但是新生代和老年代不再是物理隔离,而是一部分Region的集合。

3.6  内存分配与回收策略

 对象优先在Eden分配

 大对象直接进入老年代 -XX:PretenureSizeThreshold设置大对象大小

 长期存活的对象将进入老年代-XX:MaxTenuringThreshold设置年龄大小

 动态对象年龄判定

 空间分配担保

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics