浅探JVM内存模型和GC机制

GC是啥?

GC垃圾回收:java语言的特点之一,不需要开发人员关心内存资源的释放,但是会增加软件系统的负担,算是有利有弊吧,但是选择合适的GC就会很明显利大于弊了。

  • 先大致了解一下JVM内存区域:

JVM内存模型:

      

注意: 

1.java8之后取消永久带,设置了元空间(不占用虚拟机内存,而是机器本地内存),常量池被放到了方法区。

2.私有内存伴随着线程的产生而产生,一旦线程终止,私有内存区也会自动消除,所以垃圾回收不在此探讨范围内,着重看一下堆内存。

堆内存:

概念:所有的对象实例都要在堆上分配,无论死的还是活的对象。
作用:动态申请分配一定大小的内存空间

模型:


负责GC的垃圾回收器常用算法        

垃圾回收算法概述:
1.复制算法:

根节点扫描所有存活对象复制到新内存中,将原来那块内存回收掉。
 ----适合新生代

2.标记-清除算法:

两个阶段,标记阶段和清除阶段,从根节点开始,未标记的就是未被引用的垃圾对象,清除阶段清除所有未被标记的对象。

3.标记-压缩算法:

在标记-清除的基础上优化,一轮扫描后,先将所有存货对象压缩到内存另一端,之后清理边界外所有空间,可规避碎片的产生。

4.代回收算法:

不同年代使用不同算法,选择最合适的。新生代存活率低,可以用复制算法,而老年代存活率高,没有额外空间分配担保,用标记清除或者标记整理(压缩)。

新生代GC:

Minor GC垃圾回收,eden中存活对象会复制到未被使用的sur0中,正在使用的sur1的年轻对象也会被复制到sur0中(大、老对象进入老年代),如果sur0已满,对象也直接进入老年代,此时eden中和sur1的剩余对象就是垃圾对象,直接清空,而sur0中就是此次回收存活的所有对象,复制算法保证了内存的连续性,也避免了内存空间的浪费。最后sur0和sur1互换,保持sur0为空,如此反复,如果复制对象达到16次,那么这个对象就可以送去老年代了。

特点:频率高、速度快
Survivor的存在意义:减少被送到老年代的对象,进而减少Full GC的发生,Survivor的预筛选保证,只有经历16次Minor GC还能在新生代中存活的对象,才会被送到老年代。保证永远有一个survivor space是空的,另一个非空的survivor space无碎片。

老年代GC:

Major GC:经历16次的还存活就被送到老年代,老年代空间一般较大,使用标记-清除
算法。扫描后回收,会产生内存碎片。标记-压缩算法可规避。

特点:是频率低速度慢也就是当老年代也放不下的时候发生FullGC,耗时严重。System.gc()也会发生。

垃圾回收器

分类:

1.使用串行回收器的相关参数:

-XX:+PrintGCDetails:打印GC信息。

-XX:+UseSerialGC:新生代、老年代都使用串行回收器。

-XX:+UseParNewGC :新生代使用并行收集器,老年代使用串行收集器。

2.使用并行回收器的相关参数:

-XX:+UseParNewGC:新生代使用并行收集器,老年代使用串行收集器。

-XX:ParallelGCThreads :并行收集器工作时的线程数量。

-XX:+UseParallelGC:新生代使用并行回收收集器,老年代使用串行收集器。

-XX:+UseParallelOldGC:新生代和老年代都是用并行回收收集器。

-XX:+MaxGCPauseMills:设置最大垃圾收集停顿时间,它的值是一个大于 0 的整数。

-XX:+GCTimeRatio:设置吞吐量大小,它的值是一个 0-100 之间的整数。假设 GCTimeRatio 的值为 n,那么系统将花费不超过 1/(1+n) 的时间用于垃圾收集。

3.使用CMS回收器相关参数:

-XX:+UseConcMarkSweepGC: 新生代使用并行收集器,老年代使用 CMS+串行收集器。

-XX:CMSInitiatingOccupancyFraction:指定回收阈值,默认是 68。

-XX:+UseCMSCompactAtFullCollection: CMS 在垃圾收集完成后,进行一次内存碎片整理。内存碎片的整理并不是并发进行的。

-XX:CMSFullGCsBeforeCompaction:设定进行多少次 CMS 回收后,进行一次内存压缩。

4.使用G1回收器相关参数:

-XX:+UnlockExperimentalVMOptions:允许使用实验性参数。

–XX:+UseG1GC:启用 G1 回收器.

-XX:MaxGCPauseMills:设置 G1 回收器的最大停顿时间。

-XX:GCPauseIntervalMills:设置 G1 回收器的目标停顿时间间隔。

参数参考:JVM 垃圾回收器工作原理及使用实例介绍

 

相信读完本文,对于GC的概念应该就不会那么陌生了~

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值