深入JVM-垃圾收集器常用的GC参数
- 格式:docx
- 大小:109.34 KB
- 文档页数:2
javaGC垃圾回收机制G1、CMSCMS(Concurrent Mark-Sweep)是以牺牲吞吐量为代价来获得最短回收停顿时间。
对于要求服务器响应速度的应⽤上,这种垃圾回收器⾮常适合。
在启动JVM参数加上-XX:+UseConcMarkSweepGC ,这个参数表⽰对于⽼年代的回收采⽤CMS。
CMS采⽤的基础算法是:标记—清除。
使⽤场景:1、应⽤程序对停顿⽐较敏感,并且在应⽤程序运⾏的时候可以提供更⼤的内存和更多的CPU2、在JVM中,有相对较多存活时间较长的对象(⽼年代⽐较⼤)会更适合使⽤CMS。
为解决CMS算法产⽣空间碎⽚和其它⼀系列的问题缺陷,HotSpot提供了另外⼀种垃圾回收策略,G1(Garbage First)算法,通过参数-XX:+UseG1GC来启⽤,该算法在JDK 7u4版本被正式推出,G1垃圾收集算法主要应⽤在多CPU⼤内存的服务中,在满⾜⾼吞吐量的同时,竟可能的满⾜垃圾回收时的暂停时间,下⾯是官⽅介绍:The Garbage-First (G1) collector is a server-style garbage collector, targeted for multi-processor machines with large memories.It meets garbage collection (GC) pause time goals with a high probability, while achieving high throughput. The G1 garbagecollector is fully supported in Oracle JDK 7 update 4 and later releases. The G1 collector is designed for applications that:Can operate concurrently with applications threads like the CMS collector.Compact free space without lengthy GC induced pause times.Need more predictable GC pause durations.Do not want to sacrifice a lot of throughput performance.Do not require a much larger Java heap.G1采⽤了另外⼀种完全不同的⽅式组织堆内存,堆内存被划分为多个⼤⼩相等的内存块(Region),每个Region是逻辑连续的⼀段内存,G1中提供了三种模式垃圾回收模式,young gc、mixed gc 和 full gc,在不同的条件下被触发。
JVM常用参数设置(针对G1GC)Java虚拟机(JVM)是Java程序的运行环境,在JVM中,存在很多参数可以对其进行配置以优化Java应用程序的性能。
本文将介绍G1GC垃圾收集器常用的JVM参数设置。
G1GC(Garbage-First Garbage Collector)是JVM中的一种垃圾收集器,它是在Java 7 update 4之后引入的,并在Java 9中成为默认垃圾收集器。
G1GC的目标是为了更好地处理大内存的堆和长暂停时间,通过将堆内存划分成多个小区域(Region),并使用多线程来并行扫描、标记和压缩堆内存中的垃圾对象。
以下是一些常用的JVM参数设置,可以针对G1GC进行调整:1. -Xms:设置JVM的初始堆内存大小。
例如,-Xms2g将初始堆内存设置为2GB。
2. -Xmx:设置JVM的最大堆内存大小。
例如,-Xmx8g将最大堆内存设置为8GB。
3. -XX:+UseG1GC:启用G1GC垃圾收集器。
4. -XX:MaxGCPauseMillis:设置G1GC的最大垃圾收集停顿时间(单位:毫秒)。
默认值为200毫秒,可以根据实际需求进行调整。
较大的值可以减少垃圾收集的频率,但也会增加每次垃圾收集的停顿时间。
5. -XX:G1HeapRegionSize:设置G1GC中每个Region的大小。
默认值为堆内存的1/2048、较小的Region可以提高并行性和垃圾收集的效率,但同时也会增加垃圾收集器的元数据开销。
6. -XX:InitiatingHeapOccupancyPercent:设置G1GC开始执行垃圾收集的堆占用比例。
默认值为45%,当堆的占用率达到该比例时,G1GC将开始执行垃圾收集。
可以根据应用程序的内存使用情况进行调整。
7. -XX:ConcGCThreads:设置G1GC的并发垃圾收集线程数。
默认值为根据CPU核数动态计算的值。
可以根据实际硬件环境进行调整,较多的线程可以提高并发性能。
g1gc调优参数1. 简介在Java应用程序中,垃圾回收(Garbage Collection)是一个重要的环节,它负责释放不再使用的内存资源。
G1GC(Garbage First Garbage Collector)是一种新的垃圾回收器,它在JDK 7u4版本中首次引入,并在JDK 9版本中成为默认的垃圾回收器。
2. G1GC的特点G1GC相比于传统的CMS(Concurrent Mark Sweep)垃圾回收器有以下几个特点:- 可预测的暂停时间:G1GC通过将堆划分为多个区域(Region),并采用并发标记、并发清理和并发整理的方式,使得垃圾回收过程可以与应用程序并发执行,从而避免了长时间的停顿。
- 自适应的内存分配:G1GC通过监控每个Region的垃圾回收情况,动态调整不同Region的大小,以达到更好的垃圾回收性能。
- 并行处理能力:G1GC在进行垃圾回收时,可以利用多个线程并行处理不同区域的垃圾回收任务,提高了垃圾回收的效率。
3. G1GC调优参数3.1 并发标记周期相关参数并发标记是G1GC中的一项重要工作,它可以与应用程序并行执行,以减少垃圾回收暂停的时间。
下面是一些与并发标记周期相关的参数:3.1.1 -XX:+G1ParallelGCThreads该参数用于指定并发标记阶段使用的线程数,默认值为CPU核心数的1/4。
3.1.2 -XX:G1ConcRefinementThreads该参数用于指定并发标记阶段的细化阶段使用的线程数,默认值为CPU核心数的1/4。
3.1.3 -XX:G1HeapRegionSize该参数用于指定每个Region的大小,默认值为堆大小的1/2000。
较小的Region 可以提高内存分配的精度,但会增加内存开销。
3.2 垃圾回收时间相关参数G1GC的目标是在可接受的暂停时间内完成垃圾回收。
下面是一些与垃圾回收时间相关的参数:3.2.1 -XX:MaxGCPauseMillis该参数用于指定最大垃圾回收暂停时间的目标值,默认值为200毫秒。
Java-技术专区-JVM调优常⽤参数1.调优的⽬的1.控制GC的⾏为:GC是⼀个后台处理,但是它也是会消耗系统性能的,因此经常会根据系统运⾏的程序的特性来更改GC⾏为。
2.控制JVM堆栈⼤⼩:JVM在内存分配上不需要你修改,但是当你的程序新⽣代对象在某个时间段产⽣的⽐较多的时候,就需要控制新⽣代的堆⼤⼩,同时,还要需要控制总的JVM⼤⼩避免内存溢出。
3.控制JVM线程的内存分配:如果是多线程程序,产⽣线程和线程运⾏所消耗的内存也是可以控制的,需要通过⼀定时间的观测后,配置最优结果。
2、GC 事件分类根据垃圾收集回收的区域不同,垃圾收集主要分为:2.1 Young GC(⼜称Minor GC、YGC)新⽣代内存的垃圾收集事件称为 Young GC(⼜称 Minor GC),当 JVM ⽆法为新对象分配在新⽣代内存空间时总会触发 Young GC。
⽐如 Eden 区占满时,新对象分配频率越⾼,Young GC 的频率就越⾼。
Young GC 每次都会引起全线停顿(Stop-The-World),暂停所有的应⽤线程,停顿时间相对⽼年代 GC 造成的停顿,⼏乎可以忽略不计。
2.2 Old GC(⼜称Major GC)只清理⽼年代空间的 GC 事件,只有 CMS 的并发收集是这个模式。
2.3 Full GC清理整个堆的GC事件,包括新⽣代、⽼年代、元空间等。
2.4 Mixed GC清理整个新⽣代以及部分⽼年代的 GC,只有 G1 有这个模式。
3、常⽤参数总结3.1 堆设置-Xms:初始堆⼤⼩-Xmx:最⼤堆⼤⼩-Xmn:新⽣代⼤⼩-Xss:线程堆栈⼤⼩,默认为1M-XX:NewRatio=n:设置新⽣代和年⽼代的⽐值,默认为1:2。
如为3,表⽰新⽣代与年⽼代⽐值为1:3,年轻代占整个年轻代年⽼代和的1/4-XX:SurvivorRatio=n:年轻代中Eden区与两个Survivor区的⽐值。
注意Survivor区有两个。
Java虚拟机JVM各调优参数说明Java虚拟机(JVM)是Java程序运行的环境,它负责将Java源代码编译为字节码,并在运行时执行这些字节码。
JVM的性能对于Java应用程序的性能至关重要。
为了优化JVM的性能,我们可以通过调整一些参数来改变其行为。
下面是JVM各调优参数的详细说明。
1. -Xms和-Xmx:这两个参数用于设置JVM的初始堆大小和最大堆大小。
初始堆大小表示JVM在启动时申请的内存大小,最大堆大小表示JVM所能申请的最大内存大小。
可以使用以下命令设置初始堆大小为1GB,最大堆大小为2GB:-Xms1g -Xmx2g。
2. -XX:NewSize和-XX:MaxNewSize:这两个参数用于设置新生代的初始大小和最大大小。
新生代是JVM堆的一部分,用于存放新创建的对象。
可以使用以下命令设置新生代的初始大小为256MB,最大大小为512MB:-XX:NewSize=256m -XX:MaxNewSize=512m。
3. -XX:SurvivorRatio:这个参数用于设置新生代中Eden区和Survivor区的比例。
Eden区是新对象的分配区域,Survivor区是用于存放幸存的对象的区域。
可以使用以下命令设置Eden区和Survivor区的比例为8:1:-XX:SurvivorRatio=84. -XX:MaxTenuringThreshold:这个参数用于设置对象在Survivor区中的最大年龄。
当对象在Survivor区中存活的时间超过这个阈值时,它将被晋升到老年代。
可以使用以下命令设置最大年龄为15:-XX:MaxTenuringThreshold=155. -XX:PermSize和-XX:MaxPermSize:这两个参数用于设置永久代的初始大小和最大大小。
永久代用于存放类的元数据、静态变量和常量池等信息。
可以使用以下命令设置永久代的初始大小为128MB,最大大小为256MB:-XX:PermSize=128m -XX:MaxPermSize=256m。
jvm 垃圾回收参数指标JVM(Java虚拟机)的垃圾回收参数指标是用来调整和优化垃圾回收行为的设置。
这些参数可以影响垃圾回收的性能、内存利用率和应用程序的响应时间。
下面是一些常见的JVM垃圾回收参数指标:1. -Xmx,这个参数用来设置JVM的最大堆内存大小。
增加该值可以提高应用程序的性能,但也会增加垃圾回收的时间。
2. -Xms,这个参数用来设置JVM的初始堆内存大小。
合理设置该值可以减少垃圾回收的频率,提高应用程序的启动速度。
3. -Xmn,这个参数用来设置年轻代的大小。
年轻代是垃圾回收的主要区域,较小的年轻代可以减少垃圾回收的时间,但可能导致更频繁的垃圾回收。
4. -XX:NewRatio,这个参数用来设置年轻代和老年代的比例。
增加该值可以增加老年代的大小,减少垃圾回收的频率。
5. -XX:SurvivorRatio,这个参数用来设置Eden区和Survivor区的比例。
合理设置该值可以平衡内存的利用率和垃圾回收的效率。
6. -XX:MaxTenuringThreshold,这个参数用来设置对象进入老年代的年龄阈值。
增加该值可以减少对象进入老年代的频率,减少垃圾回收的时间。
7. -XX:CMSInitiatingOccupancyFraction,这个参数用来设置CMS垃圾回收器的触发阈值。
当老年代的占用率达到该阈值时,将触发CMS垃圾回收。
8. -XX:+UseG1GC,这个参数用来启用G1垃圾回收器。
G1垃圾回收器是一种基于区域的垃圾回收器,可以更精确地控制垃圾回收的时间和内存利用率。
以上是一些常见的JVM垃圾回收参数指标。
根据具体的应用场景和需求,可以根据这些参数进行调整和优化,以达到更好的垃圾回收性能和应用程序的响应时间。
4.JVM垃圾回收机制4.1.新生代的GC4.1.1.串行GC(SerialGC)4.1.2.并行回收GC(Parallel Scavenge)4.1.3.并行GC(ParNew)4.2.GC(Minor GC、FullGC)4.2.1.Minor GC4.2.2.FullGC4.3.GC日志4.JVM垃圾回收机制JVM分别对新生代和老年代采用不同的垃圾回收机制。
4.1.新生代的GC新生代通常存活时间较短,因此基于复制算法来进行回收,所谓复制算法就是扫描出存活的对象,并复制到一块新的完全未使用的空间中,对应于新生代,就是在Eden和其中一个Survivor,复制到另一个之间Survivor空间中,然后清理掉原来就是在Eden和其中一个Survivor中的对象。
新生代采用空闲指针的方式来控制GC触发,指针保持最后一个分配的对象在新生代区间的位置,当有新的对象要分配内存时,用于检查空间是否足够,不够就触发GC。
当连续分配对象时,对象会逐渐从eden到 survivor,最后到老年代。
用java visualVM来查看,能明显观察到新生代满了后,会把对象转移到旧生代,然后清空继续装在,当旧生代也满了后,就会报OutOfMemory的异常。
在执行机制上JVM提供了串行GC(SerialGC)、并行回收GC(ParallelScavenge)和并行GC(ParNew)。
4.1.1.串行GC(SerialGC)在整个扫描和复制过程采用单线程的方式来进行,适用于单CPU、新生代空间较小及对暂停时间要求不是非常高的应用上,是client级别默认的GC方式,可以通过-XX:+UseSerialGC来强制指定。
4.1.2.并行回收GC(Parallel Scavenge)在整个扫描和复制过程采用多线程的方式来进行,适用于多CPU、对暂停时间要求较短的应用上,是server级别默认采用的GC方式,可用-XX:+UseParallelGC来强制指定,用-XX:ParallelGCThreads=4来指定线程数。
gc监控指标-回复GC(Garbage Collection)是指垃圾回收,是一种自动内存管理机制,用于检测和回收不再使用的内存。
在Java应用程序中,垃圾收集器是负责管理堆内存中对象的分配和释放的,以确保应用程序有效地使用内存资源。
GC监控指标是用于监视和分析GC行为的一系列度量指标,可以帮助我们了解垃圾收集器的性能表现、内存使用情况和应用程序的健康状况。
以下是一些常见的GC监控指标和它们的解释:1. 垃圾收集时间(GC Time):垃圾收集器在执行垃圾回收时花费的时间。
高垃圾收集时间可能会导致应用程序的停顿时间增加,降低应用程序的响应性能。
2. 垃圾收集器执行次数(GC Count):记录垃圾收集器执行垃圾回收的次数。
高垃圾收集器执行次数可能意味着堆内存的使用情况不佳,或者可能存在内存泄漏的问题。
3. 垃圾收集器执行耗时(GC Latency):衡量垃圾收集器执行垃圾回收所花费的时间。
高垃圾收集器执行耗时可能会导致应用程序的停顿时间增加,影响应用程序的性能。
4. 垃圾回收器堆内存使用量(Heap Usage):记录堆内存的使用情况,包括堆内存的总容量、已使用容量和剩余容量。
高垃圾回收器堆内存使用量可能意味着内存使用不均衡,或者可能存在内存泄漏的问题。
5. 内存分配速率(Allocation Rate):记录在单位时间内分配的新对象的数量。
高内存分配速率可能会导致频繁的垃圾回收,增加垃圾收集器的负担。
6. 晋升对象数量(Promotion Count):记录从新生代到老年代晋升的对象数量。
过多的晋升对象可能会导致老年代的内存使用过于频繁,增加垃圾收集器的工作量。
7. 年轻代回收频率(Young Generation Collection Frequency):记录年轻代(包括Eden区和Survivor区)垃圾回收的频率。
过于频繁的年轻代回收可能会对应用程序的性能产生负面影响。
8. 老年代回收频率(Old Generation Collection Frequency):记录老年代垃圾回收的频率。
JVM的三种常见GC:MinorGC、MajorGC与FullGC 文章目录••ooo▪▪▪oo▪JVM的GCGC:垃圾回收GC英文全称为Garbage Collection,即垃圾回收。
Java中的GC就是对内存的GC。
Java的内存管理实际上就是对象的管理,其中包括对象的分配和释放。
Java对象的分配,程序员可以通过new关键字,Class的new-Instance方法等来显示的分配;而对象的释放,程序员不能实时的进行释放,这就需要GC来完成。
JVM GC的种类JVM常见的GC包括三种:Minor GC,Major GC与Full GC针对HotSpot VM的实现,它里面的GC按照回收区域又分为两大种类型:•一种是部分收集(Partial GC)•一种是整堆收集(Full GC)部分收集(Partial GC):不是完整收集整个Java堆的垃圾收集,其中又分为:•新生代收集(Minor GC/Young GC):只是新生代的垃圾收集•老年代收集(Major GC/Old GC):只是老年代的垃圾收集•混合收集(Mixed GC):收集整个新生代以及部分老年代的垃圾收集,目前,只有G1 GC会有这种行为整堆收集(Full GC):收集整个Java堆和方法区的垃圾收集注意:JVM在进行GC时,并非每次都对所有区域(新生代,老年代,方法区)一起回收的,大部分时候回收的都是指新生代GC的触发机制年轻代GC(Minor GC)触发机制触发机制:•当年轻代空间不足时,就会触发Minor GC,这里的年轻代空间不足指的是Eden区满,Survivor区满不会触发GC(每次Minor GC 会清理年轻代的内存)因为Java对象大多具备朝生夕死的特新,所以Minor GC非常频繁,一般回收速度也比较快.Minor GC会引发STW,暂停其他用户线程,等垃圾回收结束,用户线程才恢复运行老年代GC(Major GC/Full GC)触发机制指发生在老年代的GC,对象从老年代消失时,我们说"Major GC 或Full GC"发生了、一般出现Major GC,经常会伴随至少一次的Minor GC(但非绝对的,在Parallel Scavenge收集器的收集策略里就有直接进行Major GC的策略选择过程)触发机制:•也就是老年代空间不足时,会先尝试触发Minor GC,如果之后空间还不足,则触发Major GCPS:Major GC的速度一般会比Minor GC慢10倍以上,STW的时间更长如果Major GC后,内存还不足,就报OOM了Major GC的速度一般会比Minor GC慢10倍以上Full GC触发机制触发Full GC执行的情况有如下五种:•调用System.gc(),系统建议执行Full GC,但是不必然执行•老年代空间不足•方法区空间不足•通过Minor GC后进入老年代的平均大小大于老年代的可用内存•由Eden区,from区向to区复制时,对象大小大于to区可用内存,则把对象转存到老年代,并且老年代的可用内存小于该对象大小(那要是GC之后还不够呢?那还用说:OOM异常送上)另外要特别注意: full GC是开发或调优中尽量要避免的为什么需要把Java堆分代?经研究,不同对象的生命周期不同,70%-99%的对象是临时对象其实不分代完全可以,分代的唯一理由就是优化GC性能,如果没有分代,那所有的对象都在一个区域,当需要进行GC的时候就需要把所有的对象都进行遍历,GC的时候会暂停用户线程,那么这样的话,就非常消耗性能,然而大部分对象都是朝生夕死的,何不把活得久的朝生夕死的对象进行分代呢,这样的话,只需要对这些朝生夕死的对象进行回收就行了.总之,容易死的区域频繁回收,不容易死的区域减少回收.扩展:分代回收机制的三个假说当前商业虚拟机的垃圾收集器,大多数都遵循了“分代收集”(GenerationalCollection)[插图]的理论进行设计,分代收集名为理论,实质是一套符合大多数程序运行实际情况的经验法则,它建立在两个分代假说之上:1.弱分代假说(Weak Generational Hypothesis):绝大多数对象都是朝生夕灭的。
g1gc调优参数G1GC(Garbage-First Garbage Collector)是一种用于Java虚拟机的垃圾回收器,它的目标是在有限的时间内实现高吞吐量和低延迟。
下面是一些常用的G1GC调优参数:1. -XX:+UseG1GC:启用G1GC垃圾回收器。
2. -XX:MaxGCPauseMillis=<n>:设置期望的最大垃圾回收停顿时间(毫秒)。
默认值是200毫秒。
3. -XX:G1HeapRegionSize=<n>:设置堆区域的大小。
默认值是堆的1/2000。
较小的区域大小可以提高垃圾回收的吞吐量,但会增加垃圾回收的开销。
4. -XX:ConcGCThreads=<n>:设置并发垃圾回收线程的数量。
默认值是处理器核心数的1/4。
5. -XX:InitiatingHeapOccupancyPercent=<n>:设置触发并发垃圾回收的堆占用率百分比。
默认值是45%。
6. -XX:G1ReservePercent=<n>:设置作为保留空间的堆大小百分比。
默认值是10%。
7. -XX:MaxTenuringThreshold=<n>:设置对象经过多少次垃圾回收后进入老年代。
默认值是15。
8. -XX:G1MixedGCLiveThresholdPercent=<n>:设置混合垃圾回收周期中存活对象的阈值百分比。
默认值是85%。
9. -XX:G1MixedGCCountTarget=<n>:设置混合垃圾回收周期的目标回收次数。
默认值是8。
10. -XX:G1HeapWastePercent=<n>:设置堆中可浪费的最大空间百分比。
默认值是5%。
这些参数可以根据具体的应用场景和系统配置进行调整。
一般来说,可以通过监控应用程序的垃圾回收性能和内存使用情况,逐步调整参数值,以达到最佳的性能和吞吐量。
深入JVM-垃圾收集器常用的GC参数
1.与串行回收器相关的参数
-XX:+UseSerialGC:在新生代和老年代使用串行收集器
-XX:SurvivorRatio:设置eden区大小和survivor区大小的比例
-XX:PretenureSizeThreshold:设置大对象直接进入老年代的阈值。
当对象的大小超过这个值时,将直接在老年代分配。
-XX:MaxTenuringThreshold:设置对象进入老年代的年龄的最大值。
每一次Minor GC后,对象年龄就加1。
任何大于这个年龄的对象,一定会进入老年代。
2.与并行GC相关的参数
-XX:+UseParNewGC:在新生代使用并行收集器
-XX:+UseParallelOldGC:老年代使用并行回收收集器
-XX:ParallelGCThreads:设置用于垃圾回收的线程数。
通常情况下可以和CPU 数量相等,但在CPU数量较多的情况下,设置相对较小的数值也是合理的。
-XX:MaxGCPauseMillis:设置最大垃圾收集停顿时间。
他的值是一个大于0的整数。
收集器在工作时,会调整Java堆大小或者其他参数,尽可能把停顿时间控制在MaxGCPauseMillis以内。
-XX:GCTimeRatio:设置吞吐量大小。
它是0-100的整数。
假设GCTimeRatio的值为n,那么系统将花费不超过1/(1+n)的时间用于垃圾收集。
-XX:+UseAdaptiveSizePolicy:打开自适应GC策略。
在这种模式下,新生代的大小、eden和survivor的比例、晋升老年代的对象年龄等参数会被自动调整,已达到在堆大小、吞吐量和停顿时间之间的平衡点。
3.与CMS回收期相关的参数
-XX:+UseConcMarkSweepGC:新生代使用并行收集器,老年代使用CMS+串行收集器
-XX:ParallelCMSThreads:设定CMS的线程数量
-XX:CMSInitiatingOccupancyFraction:设置CMS收集器在老年代空间被使用多少后触发,默认为68%
-XX:+UseCMSCompactAtFullCollection:设置CMS收集器完成垃圾收集后是否要进行一次内存碎片的整理
-XX:CMSFullGCsBeforeCompaction:设定进行多少次CMS垃圾回收后,进行一次内存压缩
-XX:+CMSClassUnloadingEnabled:允许对类元数据区进行回收
-XX:CMSInitiatingPermOccupancyFraction:当永久区占用率达到这一百分比时,启动CMS回收(前提是-XX:+CMSClassUnloadingEnabled激活了)
-XX:UseCMSInitiatingOccupancyOnlyn:表示只在到达阈值的时候才进行CMS 回收
-XX:+CMSIncrementalMode:使用增量模式,比较适合单CPU。
增量模式在JDK 8中标记为废弃,并将在JDK 9中彻底移除。
4.与G1回收期相关的参数
-XX:+UseG1GC:使用G1回收器
-XX:MaxGCPauseMillis:设置最大垃圾收集停顿时间
-XX:GCPauseIntervalMillis:设置停顿间隔时间
5.TLAB相关
-XX:+UseTLAB:开启TLAB分配
-XX:+PrintTLAB:打印TLAB相关分配信息
-XX:TLABSize:设置TLAB大小
-XX:+ResizeTLAB:自动调整TLAB大小
6.其他参数
-XX:+DisableExplicitGC:禁用显式GC
-XX:+ExplicitGCInvokesConcurrent:使用并发方式处理显式GC。