阅读本文前能够,先阅读一下:java
翻译自:JEP 351github
加强ZGC,将未使用的堆内存返回给操做系统。微信
目前ZGC不会将未使用的内存归还给操做系统,即便该内存已经很长时间没有使用了。这种行为并不适合全部类型的应用程序和环境,特别是那些须要考虑内存占用的应用程序和环境。例如:post
HotSpot中的其余垃圾收集器(如G1和Shenandoah)已经提供了这种功能,该功能对于一些用户很是有用。将此功能添加到ZGC将受到这些用户的欢迎。性能
ZGC堆由一组称为ZPages的堆区域组成。每一个Zpage与数量可变的已提交内存相关联。当ZGC压缩堆时,ZPages被释放并插入到页面缓存ZPageCache中。页面缓存中的ZPages能够重用,以知足新的堆分配,在这种状况下,它们将从缓存中删除。页面缓存对性能相当重要,由于提交和不提交内存都是昂贵的操做。操作系统
页面缓存中的ZPages集合表示堆中未使用的部分,这些部分能够归还给操做系统。所以,取消提交内存能够经过简单地从页面缓存中删除一组精心选择的ZPages,并取消与这些页面关联的内存的提交来完成。页面缓存已经将ZPages保持在最近最少使用(LRU)的顺序,并按大小(小、中、大)进行分隔,所以清除ZPages和取消提交内存的机制相对简单。挑战在于设计策略来决定什么时候从缓存中驱逐ZPage。.net
一个简单的策略是设置一个timeout或delay值,该值指定ZPage在被清除以前能够在页面缓存中驻留多长时间。这个超时将有一些合理的默认值,可使用命令行选项覆盖它。Shenandoah GC使用这样的策略,默认值为5分钟,命令行选项-XX:ShenandoahUncommitDelay=<milliseconds>来覆盖默认值。命令行
相似上述策略的效果可能至关不错。然而,人们也能够设想更复杂的策略,不涉及添加新的命令行选项。例如,根据GC频率或其余数据找到合适超时值的启发式方法。咱们将首先提供一个简单的超时策略,使用-XX:ZUncommitDelay=<seconds>选项,稍后再提供一个更复杂的策略(若是找到了)。
默认状况下将启用uncommit功能。可是不管策略如何决定,ZGC都不能把堆内存降到低于Xms。这就意味着,若是Xmx和Xms相等的话,这个能力就失效了,-XX:-ZUncommit这个参数也能让这个内存管理能力失效。
最后,Linux/x64上的ZGC使用tmpfs或hugetlbfs文件来支持堆。这些文件使用的未提交内存须要fallocate(2)和FALLOC_FL_PUNCH_HOLE支持,FALLOC_FL_PUNCH_HOLE支持最先出如今Linux 3.5 (tmpfs)和4.3(hugetlbfs)中。在旧的Linux内核上运行时,ZGC应该像之前同样继续工做,可是禁用了uncommit功能。
我的微信公众号:
我的github:
我的博客: