首页 > 免root版 > gg修改器需要root6_gg修改器需要脚本吗
gg修改器需要root6_gg修改器需要脚本吗
  • gg修改器需要root6_gg修改器需要脚本吗

  • 大小:18.20MB日期:2024-04-20 22:58:06
  • 语言:简体中文系统:Android
绿色无毒,安全可靠!部分设备误报拦截请通过!

应用详情

大家好,今天小编为大家分享关于gg修改器需要root6_gg修改器需要脚本吗的内容,赶快来一起来看看吧。

话不多说,先上图,有图有真相。

jvm分代收集模型

凡是做Java开发的同学,请牢记此图,分代收集模型是一面必问题,除非面试官也不会。

JVM的垃圾回收算法,主要的就是一下三种(请牢记,与面试内容紧密相连):

1、标记清除(Mark-Sweep),首先标记出所有需要回收的对象,标记完成后统一回收。主要有两点不足,一是标记、清除过程效率低;二是清除之后会产生大量不连续的内存碎片,可能会导致后续分配较大对象时找不到足够大的空间,从而触发新一次垃圾回收。

2、复制算法(Copying),将内存容量分为大小相等两块,每次只用其中一块,一块用完了,把还存活的对象复制到另外一块,然后把已使用的空间一次清理掉。缺点是内存利用率只有1/2。

3、标记整理(Mark-Compact),首先标记出所有需要回收的对象,然后让存活对象都向一端移动,然后直接清理掉存活对象边界以外的内存空间。

目前商业虚拟机都采用分代收集算法,根据存活周期将内存分为新生代和老年代,新生代分为一大块Eden区和两块较小的Survivor区,在新生代使用复制算法,在老年代使用标记清除或标记整理算法。

内存分配策略:

1、对象优先Eden区分配,当Eden空间不足时,触发Young GC(MinorGC)。如果Young GC发生后,Survivor区空间不足以存放存活对象时,部分对象会通过分配担保机制转移到老年代。

2、大对象直接进入老年代,如很长的字符串、特别长的数组。大对象对虚拟机内存分配很不友好,一群朝生夕灭的大对象更糟糕,很容易导致老年代在空闲内存还有很多时,为了获取连续的内存空间安置大对象而提前触发Full GC(Major GC)。

-XX:PretenureSizeThreshold(默认值0,不管多大对象都优先在Eden区分配)参数用来设置大对象的阈值,超过设定值直接分配到老年代,避免大对象在Eden区和Survivor区发生大量内存复制,影响内存回收效率。

3、长期存活对象进入老年代,对象年龄计数器增加到15时,晋升到老年代。

-XX:MaxTenuringThreshold(默认值15)参数可设置分代年龄。

4、如果Survivor区中相同年龄对象大小总和大于Survivor空间一半以上,那么年龄大于或等于该年龄的对象可以直接进入老年代。

5、空间分配担保,在触发Young GC之前,虚拟机会先检查老年代最大连续可用空间是否大于新生代所有对象总大小或者历次晋升的平均大小,如果大于进行Young GC,否则进行Full GC。

再奉上经典图一张:

7种作用于不同分代的收集器,如果两个收集器之间存在连线,就说明他们可以搭配使用。以上7种收集器,只有具体场景最适合的收集器,没有最完美的收集器,至少到G1收集器为止还没有。

Serial / Serial Old 收集器运行示意图

新生代收集器:Serial,单线程收集器,在进行垃圾收集时,所有工作线程都要暂停。只是在单核CPU环境下简单高效,其它场景不适用。

老年代收集器:Serial Old,Serial收集器的老年代版本,单线程,标记整理算法,CMS收集器的后备预案,在并发收集发生Concurrent Mode Failure是使用。

ParNew / Serial Old 收集器运行示意图

新生代收集器:ParNew,Serial的多线程版本,在进行垃圾收集时,依然要暂停所有工作线程。在两个以上核数CPU环境下,效率才能超过Serial。

Parallel Scavenge / Parallel Old 收集器运行示意图

新生代收集器:Parallel Scavenge,jdk1.7-1.8默认收集器,采用复制算法,“吞吐优先收集器”,并行多线程收集器。优势是可以控制吞吐量,高吞吐量可以提高CPU利用率,最大特点是自适应策略,也是与ParNew收集器重要区别。(-XX:+UseAdaptiveSizePolicy,jdk1.8默认开启),虚拟机会根据当前系统的运行情况收集性能监控信息,动态调整新生代大小、Eden区与Survivor区比例、晋升老年代对象大小等参数,提供对适合的停顿时间或最大吞吐量。只需要给它设置一个优化目标最大停顿时间(-XX:MaxGCPauseMillis)或吞吐量比例(-XX:GCTimeRatio默认99)。

并行(Parallel):多条垃圾收集线程并行工作,用户线程仍处于等待状态。

并发(Concurrent):用户线程与垃圾收集线程同时执行(可能是交替执行),用户程序继续运行,垃圾收集程序运行于另外一个CPU。

吞吐量 = 程序正常执行时间 /(程序正常执行时间 + 垃圾收集时间)

老年代收集器:Parallel Old,jdk1.7-1.8默认收集器,Parallel Scavenge收集器的老年代版本,多线程,标记整理算法,jdk1.6才有。

CMS收集器运行示意图

老年代收集器:CMS(Concurrent Mark Sweep),收集器是一种以获取最短回收停顿时间为目标的收集器。采用标记清除算法,包括4个步骤:初始标记、并发标记、重新标记、并发清除。初始标记、重新标记这需要STW(Stop the World),只是标记GC Roots直接关联的对象。并发标记阶段是进行GC Root关联对象及下游关联对象追踪的过程。重新标记是为了修复并发标记期间程序继续运行而导致标记产生变动的一部分对象进行标记,消耗时间会比初始标记长一点。并发标记和并发清除的过程耗时最长,但是收集线程都可以与用户线程一起工作,所以可以说CMS是并发收集器。

缺点:

1、用户线程停顿时间短会造成总吞吐量降低。默认启动回收线程数(CPU数量+3)/4,CPU占用率高,CPU核数少于4个性能较差。

2、无法收集浮动垃圾,就是说并发清理时,用户线程还在运行,会产生新的垃圾,新垃圾只能在下次GC的时候清理。所以CMS不能在老年代填满的时候再出发回收,必须预留一部分空间,如果在CMS运行过程中预留空间不足,会出现Concurrent Mode Failure。此时虚拟机会启动Serial Old收集器来从新进行老年代垃圾收集,这样用户线程停顿时间就会很长。

-XX:CMSInitiatingOccupancyFraction参数设置比例,设置太高导致大量Concurrent Mode Failure,性能反而下降了。

如果CMSInitiatingOccupancyFraction在0~100之间,那么由CMSInitiatingOccupancyFraction决定。否则用此公式计算 ((100 – MinHeapFreeRatio) + (double)( CMSTriggerRatio * MinHeapFreeRatio) / 100.0) / 100.0 MinHeapFreeRatio = 40 CMSTriggerRatio=80。

jdk1.5默认是68%,jdk1.6-jdk1.8启动阈值默认92%

3、标记清除算法收集结束后会产生大量空间碎片,当没有连续的空间分配对象时,会提前出发Full GC。CMS为解决这个问题提供了-XX:+UseCMSCompactAtFullCollection开关参数(默认开启),用于收集器顶需要进行FullGC的时候,开启碎片整理过程,碎片整理过程无法并发执行,整体停顿时间变长。所以CMS设计者提供另外一个参数,-XX:CMSFullGCsBeforeCompaction,执行多少次不压缩的FullGC之后再进行一次压缩的FullGC(默认值0,表示每次进入FullGC)时都进行碎片压缩。

G1内存模型

G1(Garbage-First),jdk1.6提出目标是替换CMS,jdk1.7时正式使用,jdk1.9的默认垃圾收集器。G1收集器要解决的核心问题,是让STW可预测。

并行与并发:充分利用多CPU并发执行减少STW时间。

分代收集:依然使用分代收集策略。

空间整合:整体采用标记整理算法,收集后不产生空间碎片,避免分配大对象时无连续空间使用而提前触发GC。

可预测停顿:是比CMS先进的地方,已经是实时垃圾回收的特征了。

G1将一块内存模型分成多个Region管理,其中,每块Region大小是在JVM启动的时候就固定的,使用参数-XX:G1HeapRegionSize设定,范围为1M~32M 。G1同样会划分Eden Survice 和Old,但不同的是G1的分代只是逻辑上划分,在实际内存中完全是可以不连续的。有一些Region标明了H,它代表Humongous Object(简称H-Obj),这表示这些Region存储的是巨大对象,即大小大于等于region一半的对象。H-obj直接分配到了old ,防止了反复拷贝移动。 对于H-obj的GC,无疑是很费时间的,G1的

-XX:G1HeapRegionSize参数目的就是为了让开发者将Region块大小调节到一个最适合自己的数值,从而减少H-obj。

可预测停顿,G1收集器根据-XX:MaxGCPauseMillis参数,尽可能在参数约定时间内完成收集。G1收集器为实现可预测的停顿,需要使用Collcetion Set(简称CSet)来记录要回收的Region信息,并标识了优先级,优先回收价值最大的Region,避免全区域回收。

G1中使用Remembered Set(简称RSet)避免全堆扫描,每个Region都有自己的RSet,里面记录的就是当前Region对其他Region的引用信息,在GC的时候,标记阶段同时会检查RSet是否引用了其他Region的对象,如果有,就去其他的Region继续标记,如果没有,标记会停止。

G1收集器运行示意图

G1收集步骤

初始标记:标记GC Roots能关联到的对象,并修改TAMS(Top-at-matk-start,每个Region中的两个内存指针。在TAMS之上的是新分配的对象。prevTAMS、nextTAMS),让下一阶段用户程序并发运行时,能在正确的Region中创建对象,这个过程需要线程停顿,但耗时很短。

并发标记:从GC Roots开始对堆中对象进行可达性分析,找出存活对象,耗时较长,但可以与用户线程并发执行。

最终标记:修正并发标记阶段因用户程序继续执行而导致变动的部分,先记录到RSet Log里,然后再合并到RSet,这个过程需要用户线程停顿,单可以并行执行。

筛选回收:对可回收的Region成本和价值进行评估排序,根据用户设定的停顿时间制定回收计划,理论上可以与用户线程并发执行。

G1提供的GC机制

Young GC:选定所有年轻代里的Region。通过控制年轻代的region个数,即年轻代内存大小,来控制young GC的时间开销。

Mixed GC:选定所有年轻代里的Region,外加根据global concurrent marking统计得出收集收益高的若干老年代Region。在用户指定的开销目标范围内尽可能选择收益高的老年代Region。

由上面的描述可知,Mixed GC不是full GC,它只能回收部分老年代的Region,如果mixed GC实在无法跟上程序分配内存的速度,导致老年代填满无法继续进行Mixed GC,就会使用serial old GC(full GC)来收集整个GC heap。所以G1是不提供full GC的。

-XX:G1HeapRegionSize=n 设置Region大小

-XX:MaxGCPauseMillis 设置G1收集过程停顿时间,默认值200ms,非硬性条件

-XX:G1NewSizePercent 新生代最小值,默认值5%

-XX:G1MaxNewSizePercent 新生代最大值,默认值60%

-XX:ParallelGCThreads StopTheWorld期间,并行GC线程数

-XX:ConcGCThreads=n 并发标记阶段,并行执行的线程数

-XX:InitiatingHeapOccupancyPercent 设置触发标记周期的 Java 堆占用率阈值。默认值是45%。这里的java堆占比指的是非新生代可用字节,包括H-obj

最后,跨时代的产品来了,此产品是否能解决Java开发心中的疑问:完美的收集器真的来了?

Open JDK11开源了ZGC收集器(早期实验版)

官方文档上这样描述它:这个项目的目标是创建一个可伸缩的低延迟垃圾收集器,能够处理从几GB到几TB大小的堆,GC暂停时间不超过10毫秒。

取消分代收集。

唯一的调优方式就是设置最大堆大小,设置 -Xmx一个参数就够了。

Per Liden ZGC研发者

ZGC实现实时收集的两个重要技术:着色指针(Colored Pointer )和 读屏障(Load Barrier),保证并发执行机制。

与标记对象的传统算法相比,ZGC在指针上做标记,在访问指针时加入Load Barrier(读屏障),比如当对象正被GC移动,指针上的颜色就会不对,这个屏障就会先把指针更新为有效地址再返回,也就是,永远只有单个对象读取时有概率被减速,而不存在为了保持应用与GC一致而粗暴整体的Stop The World。

ZGC将堆划分为Region作为清理,移动,以及并行GC线程工作分配的单位。

不过G1一开始就把堆划分成固定大小的Region,而ZGC 可以有2MB,32MB,N× 2MB 三种Size Groups,动态地创建和销毁Region,动态地决定Region的大小。

256k以下的对象分配在Small Page, 4M以下对象在Medium Page,以上在Large Page。所以ZGC能更好的处理大对象的分配。

——————————-分割线————————————–

以下内容只是简单说明:

JConsole:Java监视与管理控制台

VisualVM:多合一故障处理工具,有丰富的插件

jps:JVM Process Status Tool,显示制定系统内所有HotSpot虚拟机进程

jstat:JVM Statistics Monitoring Tool,用于收集HotSpot虚拟机各方面的运行数据

jinfo:Configuration Info for Java,显示虚拟机配置信息

jmap:Memory Map for java,生成虚拟机的内存转储快照(heapdump文件)

jhat:JVM Heap Dump Browser,用于分析heapdump文件,它会建立一个HTTP/HTML服务器,让用户可以在浏览器上查看分析结果

jstack:Stack Trace for Java,显示虚拟机的线程快照

——————————-分割线————————————–

最后送各位读者一句话:“尽信书,不如无书。” – 孟子

随着近几年技术的飞速发展,技术书籍已经明显跟不上步调了,多读书没错,但也不要完全信,毕竟书里写的是昨天的东西,还是要多想多问多实践。

上文内容如有任何问题,请在评论区留言,必回。

以上就是关于gg修改器需要root6_gg修改器需要脚本吗的全部内容,感谢大家的浏览观看,如果你喜欢本站的文章可以CTRL+D收藏哦。

相关文章

热门下载

大家还在搜