Java 12 中增强了 G1 垃圾收集器关于混合收集集合的处理策略,这节主要介绍在 Java 12 中同时也对 G1垃圾回收器进行了改进,使其能够在空闲时自动将 Java 堆内存返还给操作系统,这也是 Java 12 中的另外一项重大改进。

目前 Java 11 版本中包含的 G1 垃圾收集器暂时无法及时将已提交的 Java 堆内存返回给操作系统。为什么呢? G1目前只有在full GC或者concurrent cycle(并发处理周期)的时候才会归还内存,由于这两个场景都是G1极力避免的,因此在大多数场景下可能不会及时归还committed Java heap memory给操作系统。除非有外部强制执行。

在使用云平台的容器环境中,这种不利之处特别明显。即使在虚拟机不活动,但如果仍然使用其分配的内存资源,哪怕是其中的一小部分,G1 回收器也仍将保留所有已分配的 Java 堆内存。而这将导致用户需要始终为所有资源付费,哪怕是实际并未用到,而云提供商也无法充分利用其硬件。如果在此期间虚拟机能够检测到 Java 堆内存的实际使用情况,并在利用空闲时间自动将 Java 堆内存返还,则两者都将受益。

具体操作

为了尽可能的向操作系统返回空闲内存,G1 垃圾收集器将在应用程序不活动期间定期生成或持续循环检查整体 Java堆使用情况,以便 G1 垃圾收集器能够更及时的将 Java 堆中不使用内存部分返还给操作系统。对于长时间处于空闲状态的应用程序,此项改进将使 JVM 的内存利用率更加高效。

而在用户控制下,可以可选地执行Full GC,以使返回的内存量最大化。

JDK12的这个特性新增了两个参数分别是G1 PeriodicGCInterval及G1 PeriodicGCSystemLoadThreshold,设置为0的话,表示禁用。如果应用程序为非活动状态,在下面两种情况任何一个描述下,G1 回收器会触发定期垃圾收集:

  • 自上次垃圾回收完成以来已超过 G1PeriodicGCInterval ( milliseconds ), 并且此时没有正在进行的垃圾回收
    任务。如果 G1PeriodicGCInterval 值为零表示禁用快速回收内存的定期垃圾收集。
  • 应用所在主机系统上执行方法 getloadavg(),默认一分钟内系统返回的平均负载值低于
    G1PeriodicGCSystemLoadThreshold指定的阈值,则触发full GC或者concurrent GC( 如果开启
    G1PeriodicGCInvokesConcurrent ),GC之后Java heap size会被重写调整,然后多余的内存将会归还给操作系统。如果 G1PeriodicGCSystemLoadThreshold 值为零,则此条件不生效。

如果不满足上述条件中的任何一个,则取消当期的定期垃圾回收。等一个 G1PeriodicGCInterval 时间周期后,将重新考虑是否执行定期垃圾回收。

G1 定期垃圾收集的类型根据 G1PeriodicGCInvokesConcurrent 参数的值确定:如果设置值了,G1 垃圾回收器将继续上一个或者启动一个新并发周期;如果没有设置值,则 G1 回收器将执行一个Full GC。在每次一次 GC 回收末尾,G1 回收器将调整当前的 Java 堆大小,此时便有可能会将未使用内存返还给操作系统。新的 Java 堆内存大小根据现有配置确定,具体包括下列配置:- XX:MinHeapFreeRatio、-XX:MaxHeapFreeRatio、-Xms、-Xmx。

默认情况下,G1 回收器在定期垃圾回收期间新启动或继续上一轮并发周期,将最大限度地减少应用程序的中断。如果定期垃圾收集严重影响程序执行,则需要考虑整个系统 CPU 负载,或让用户禁用定期垃圾收集。

最新文章

  1. html中键盘事件----在路上(16)
  2. 序列化对象为xml字符串
  3. WPF入门教程系列十二——依赖属性(二)
  4. PHP面向对象编程知识要点
  5. CSS分页
  6. “You must not call setTag() on a view Glide is targeting” 解决
  7. Hibernate学习之hql查询语句
  8. git使用说明
  9. Oracle中的游标的原理和使用详解
  10. logistic分类
  11. Vue——报错总结
  12. rem实现自适应
  13. c# NPOI 导出EXCEL (在下方显示图片)
  14. 设置PhoenixOS进入图形界面
  15. linux下top命令参数详解
  16. MVVM模式理解
  17. JavaScript修改日期格式
  18. 构建NetCore应用框架之实战篇(二):BitAdminCore框架定位及架构
  19. bzoj 1975 [Sdoi2010]魔法猪学院
  20. appium安卓自动化的 常用driver方法封装

热门文章

  1. 查看Linux的本机IP
  2. 个人作业第五次——Alpha项目测试
  3. 爬取前程无忧网站上python的招聘信息。
  4. 洛谷P1084 疫情控制(贪心+倍增)
  5. oVirt部署
  6. Discuz!基础的代码安全和代码规范
  7. Spring Boot属性配置文件:application.properties 详解
  8. jmeter,badboy,jar包文件 常数吞吐量计时器?
  9. NameNode的HA
  10. 到底该不该用RTOS——rtos的优点