JVM GC所有关键知识点

堆:分年轻代(新生代,Young Generation)、年老代(老生代,Old Generation)、永久代(持久代,Permanent Generation)。永久代是方法区规范的实践。JDK1.8将永久代改为了元空间(MetaSpace)。永久代在JVM中,元空间在本地内存中。

新生代分Eden、From、To区,默认大小比例8:1:1。From、To区又称为Survivor区,From为S0区,To为S1区。

YGC(Young GC,新生代GC)(Minor GC)触发条件:Eden区空间不足。

FGC(Full GC)(Major GC)触发条件:老生代空间不足;持久代空间不足;堆使用率过高(默认80%);System.gc();(Runtime.getRuntime().gc(););YGC悲观策略;dump内存信息。

YGC悲观策略:
1、YGC执行前,min(新生代已使用的大小,平均晋升到老生代的较小值) > 老生代剩余空间大小 ? 只执行FGC : 只执行YGC;
2、YGC执行后,平均晋升到老生代的大小 > 老生代剩余空间大小 ? 触发FGC :无操作。

GC算法:
复制算法:YGC时,Eden中所有存活对象复制到To;From中默认存活15岁(-XX:MaxTenuringThreshold可修改年龄阈值)的对象移动到老生代,没有达到阈值的对象复制到To区。然后From和To区角色互换。重复过程。如果To区空间不足,根据分配担保机制,多出的对象移动到老生代。如果对象超过阈值或者Eden中放不下进入老生代。 如果From区相同年龄的对象,大小总和大于本区一半,则年龄大于或等于该年龄的对象进入老年代。
优点:效率高,不产生内存碎片。
缺点:因为To区空,浪费了一定内存空间。
标记清除:第一轮扫描标记存活对象,第二轮扫描清除未标记对象。
优点:不浪费内存空间。
缺点:两轮扫描,效率低;会产生内存碎片。
标记整理:标记存活对象,将存活对象移动到一端。
优点:不会产生内存碎片。
缺点:标记存活对象后整理存活对象引用地址,效率低。

内存效率:
复制算法>标记清除算法>标记整理算法。
内存整齐度:
复制算法=标记整理算法>标记清理算法。
内存利用率:
标记整理算法=复制算法>标记清理算法。

FGC整堆回收,在新生代采用复制算法,在老生代、持久代采用标记清除或标记整理算法。

GC高性能:
吞吐量(应用程序占用的时间在总时间中比例)高。
暂停时间(只进行GC的时间)短。-XX:+PrintGCApplicationStoppedTime可以打印应用程序暂停的时间。

是否GC的判定:
引用计数:对象有一个引用+1,失效-1,为0回收。(分布式GC使用)
引用链:对象没有到达GC Root的链则回收。(一般GC使用)

分布式GC:
远程对象被服务端本地对象、服务端注册表、客户端存根引用。客户端定期发送租约让服务端知道客户端持有远程对象。租约到期,服务器认为客户端已经不再持有远程对象的引用。

GC Root:
1.虚拟机栈中引用的对象
2.方法区中类静态变量引用的对象
3.方法区中常量引用的对象
4.native方法(JNI,Java Native Interface)引用的对象

设置GC标志后,GC线程外所有线程在安全点挂起,Java代码暂停执行,JNI可以执行但不能与JVM交互,全局停顿,称为STW(Stop The World)。YGC和FGC都会产生STW。

SafePoint(安全点)定义:程序执行期间,所有GC Root已知并且所有堆对象内容一致的点。

在安全点可以进行GC、偏向锁解除等安全操作。

JIT(Just In Time)编译:Java即时编译。

SafePoint位置:
1.单次循环后(如果JIT编译没有在有界大循环的单次循环后加入SafePoint检查,会导致GC暂停时间长)
2.方法调用后
3.方法返回前
4.异常抛出前

在HotSpot虚拟机中,安全点是主动协作的 。每一个用户线程在安全点上检测一个标志位,决定自己是否暂停执行。

JVM工具:
jps(Java Process Status):查看进程(进程号、进程名)。
jstack(Java Stack):查看线程堆栈,生成线程dump文件。
jmap(Java Memory Map):查看内存映射,生成堆dump文件。
jhat(Java Heap Analysis Tool):查看堆分析,生成堆dump文件。
jstat(Java Statistic):查看统计信息:类装载、内存、垃圾收集、jit编译。
jinfo(Java Information):实时查看与调整虚拟机的各项参数。
jconsole:简易的可视化控制台。
jvisualvm:强大的可视化控制台。

finalize():
复写Object的finalize()。判断对象不可达,能GC时调用finalize(),调用后会再一次进行可达性分析,如果不可达,则下一次GC时清除该对象。

对应https://blog.csdn.net/haoranhaoshi/article/details/108213440 JVM部分。

垃圾收集器:

https://blog.csdn.net/qq_41723615/article/details/104380000

       JDK7/8后,HotSpot虚拟机所有收集器及组合(连线),如下图:

(A)、图中展示了7种不同分代的收集器:

       Serial、ParNew、Parallel Scavenge、Serial Old、Parallel Old、CMS、G1;

(B)、而它们所处区域,则表明其是属于新生代收集器还是老年代收集器:

      新生代收集器:Serial、ParNew、Parallel Scavenge;

      老年代收集器:Serial Old、Parallel Old、CMS;

      整堆收集器:G1;

(C)、两个收集器间有连线,表明它们可以搭配使用:

       Serial/Serial Old、Serial/CMS、ParNew/Serial Old、ParNew/CMS、Parallel Scavenge/Serial Old、Parallel Scavenge/Parallel Old、G1;

(D)、其中Serial Old作为CMS出现"Concurrent Mode Failure"失败的后备预案(后面介绍);

http://www.360doc.com/content/18/1203/18/59933645_799056636.shtml

HotSpot收集器:

G1有并发,也有并行。 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

风铃峰顶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值