侧边栏壁纸
  • 累计撰写 307 篇文章
  • 累计阅读 104.3万

JAVA垃圾回收

TOTC
2019-01-06 / 925 阅读 / 正在检测是否收录...

垃圾回收算法

标记-清除算法 :产生不连续的内存碎片,为较大对象分配内存时无法找到足够连续的内存,不得不提前触发垃圾收集动作。CMS垃圾回收器。

标记-整理算法 :存活的对象向一端移动,存活率高时,效率远高于复制算法。G1、ParallelGC(Paraller Old)。

复制算法 :Eden、s0、s1,比例是8:1:1,10%被浪费,JDK8,ParallelGC(Parallel Scavenge)。

分代收集算法

垃圾回收器

CMS收集器 :发标记、并发清除、内存碎片、最短回收停顿时间为目标,与用户线程可以并发执行,牺牲一定的吞吐量;可开启内存碎片整理,会停顿用户线程。

ParallelGC :(JDK8)新生代(Parallel Scavenge复制算法),老年代(Paraller Old标记整理算法)。

G1垃圾收集器 :吞吐量高,可预测的停顿;整体基于标记-整理算法,从局部(两个Region)是基于复制算法;设置了新生代大小相当于放弃了G1为我们做的自动调优。

G1官方的建议——实时数据占用了超过半数的堆空间;对象分配率或“晋升”的速度变化明显;期望消除耗时较长的GC或停顿(超过0.5——1秒)。

ZGC :着色指针(在对象的引用上标注了对象的信息),读屏障(把指针更新为有效地址再返回,也就是,永远只有单个对象读取时有概率被减速),Stop-The-World 只会在根对象扫描阶段发生,所以GC暂停时间并不会随着堆和存活对象的数量而增加。TB 级别的堆内存管理;最大 GC Pause 不高于 10ms;最大的吞吐率(Throughput)损耗不高于 15%。

ParallelGC 吞吐量优先,后台运算而不需要太多交互的任务。

CMS 响应速度优先,集中在互联网站或B/S系统服务端上的Java应用。

G1 响应速度优先,面向服务端应用,将来替换CMS。

内存划分为

JVM内存划分为堆内存和非堆内存,堆内存分为年轻代、老年代,非堆内存就一个永久代。在JDK1.8版本废弃了永久代,替代的是元空间(MetaSpace),元空间与永久代上类似,都是方法区的实现,他们最大区别是元空间并不在JVM中,而是使用本地内存。

Full GC条件

a.发生minor gc之前会判断老年代最大可用连续空间是否大于新生代的所有对象总空间,如果大于直接发生minor gc,如果小于发生full gc。

b.老年代空间不足时,创建一个大对象时Ended放不下,会直接保存到老年代中,如果老年代空间不足,就会触发full gc。

c.显示调用System.gc()方法,可能会发生full gc。

引用类型

强引用 :永远不会回收

软引用SoftReference :内存不足时才会回收该对象。比如网页缓存、图片缓存等。

弱引用WeakReference :每次垃圾回收。

虚引用PhantomReference :虚引用必须和引用队列 (ReferenceQueue)联合使用,主要用来跟踪对象被垃圾回收器回收的活动。

假如有一个应用需要读取大量的本地图片,如果每次读取图片都从硬盘读取,则会严重影响性能,但是如果全部加载到内存当中,又有可能造成内存溢出,此时使用软引用可以解决这个问题。

21

评论

博主关闭了所有页面的评论