手游托在什么网站申请,大同建设银行保安招聘网站,茂名建站公司,google 空间 网站一)G1垃圾回收器: 垃圾收集器迭代停顿时间越少越好#xff0c;但是垃圾回收的总时间会增多#xff0c;默认暂停时间默认是200ms 一)垃圾收集器介绍 1)G1垃圾回收器是一款面向服务器的垃圾收集器#xff0c;主要针对的是配备多颗处理器以及大容量内存的机器#xff0c;以极高… 一)G1垃圾回收器: 垃圾收集器迭代停顿时间越少越好但是垃圾回收的总时间会增多默认暂停时间默认是200ms 一)垃圾收集器介绍 1)G1垃圾回收器是一款面向服务器的垃圾收集器主要针对的是配备多颗处理器以及大容量内存的机器以极高的频率来满足GC停顿时间的要求的同时来尽量的提升吞吐量 2)虽然在物理上分代已经不连续了但是在逻辑上还是存在着分代的概念的 3)G1堆将JAVA的堆划分成多个大小相等的独立区域JVM最多有2048个regin一般的regin大小等于堆内存大小除以2048比如说堆的大小是4096M那么regin的大小就是2M当然也是可以使用参数-XX:G1HeapReginSize来手动指定Regin的大小但是推荐默认的计算方式 4)G1保留了年轻代和老年代的概念但是不在是物理隔阂了都是不连续的Regin的集合默认年轻代对于堆内存的占比是5%如果堆内存大小是4096M那么年轻代大概占据200M的内存大概是100个regin可以使用-XX:G1NewSizePercent来设置新生代初始占比在系统运行过程中JVM会不断给年轻代增加更多的regin但是最多新生代的占比也没有超过60%可以通过-XX:G1MaxNewSizePercent调整年轻代中的Eden和Survivor对应的region也跟之前一样默认8:1:1假设年轻代现在有1000个regioneden区对应800个s0对应100个s1对应100个一开始regin内存区域都是空的随着空间不断被使用年轻代不在扩容程序运行后期这些不同的regin会被赋予不同的含义 5)一个regin可能之前是年轻代如果regin进行了垃圾回收可能就变成了老年代也就是说regin的功能区域可能会动态发生变化 6)G1垃圾收集器对于对象什么时候会转移到老年代和之前说过的原则一模一样唯一不同的是针对于大对象的处理G1有一个专门分配大对象的区域叫做Humongous区域而不是让大对象直接进入到老年代的Regin中在G1中有专门分配大对象的区域叫做Humongous区大对象的判断规则就是一个对象超过了Regin区域的一半按照上面的计算规则每一个Regin的大小是2M只要对象的大小超过了1M就会被存放到Humongous如果对象特别大还有可能使用多个连续的Regin存放Humongous区专门存放短期巨型对象不用直接进老年代可以节约老年代的空间避免因为老年代空间不够的GC开销FullGC的时候除了收集年轻代和老年代之外也会将Humongous区一并回收 1)G1垃圾收集器会让初始标记和最终标记和筛选回收的总的STW时间控制在一个设置的参数范围内在筛选回收中G1垃圾回收器不一定会把所有的堆中的垃圾全部回收掉可能在筛选回收之前并发标记过程中标记了很多非垃圾对象还有很多的垃圾对象要进行清理但是在G1筛选回收阶段因为要考虑到停顿时间可能要把整个堆空间回收完成要400ms但是程序员指定的STW时间是200msG1会有一个算法来预估回收多少块区域(预估每一块regin大概要回收多长时间)能够达到用户设置的最大停顿时间剩余的区域下一次GC回收 2)一共的GC总时间比CMS时间还长ZGC的垃圾回收一次完整过程的时间可能会更久 3)可不可以把GC的停顿时间指定的非常短呢不要乱指定既然需要停顿时间短一些就指定为10msG1一次性清理的垃圾非常非常少垃圾积累多了可能会触发大级别的FullGC直接STW直接单线程垃圾收集本来设置时间是200ms但是你设置10ms最终可能导致G1停顿时间失效 4)G1垃圾回收器在后台维护了一个优先级列表每一次根据允许的收集时间优先进行选择回收加载最大的regin比如说一个regin花费200ms能够回收10M垃圾另外一个regin花费50ms能够回收20M垃圾在总回收时间有限的情况下G1当然会优先回收后面这个 5)一块区域存活的对象越多垃圾回收的效益比越低又要移动对象更新引用啥的应该优先回收垃圾比较多的regin区域