JVM堆参数设置及GC参数设置
阅读数:143 评论数:0
跳转到新版页面分类
python/Java
正文
一、概述
标准参数(-) | 向后兼容 |
非标准参数(-X) | 不向后兼容 |
非稳定参数(-XX) | 各JVM会有不同,也可能被取消 |
二、年轻代
用来存放新创建的对象,默认值是堆大小的$\frac{1}{15}$,可以通过-Xmx参数设置年经代为固定大小,也可以通过-XX: NewRatio来设置年代与年老代的大小比例。
年轻代的特点是产生大量的死亡对象,并且要是产生连续可用的空间, 所以使用复制清除算法和并行收集器进行垃圾回收.对年轻代的垃圾回收称作初级回收 (minor gc)。
初级回收将年轻代分为三个区域, 一个新生代 , 2个大小相同的复活代, 应用程序只能使用一个新生代和一个复活代, 当发生初级垃圾回收的时候,gc挂起程序, 然后将新生代和复活代中的存活对象复制到另外一个非活动的复活代中,然后一次性清除新生代和复活代,将原来的非复活代标记成为活动复活代。将在指定次数回收后仍然存在的对象移动到老年代中,初级回收后,得到一个空的可用的新生代。
对象在 Survivor 区每熬过一次 Minor GC,就将对象的年龄 + 1,当对象的年龄达到某个值时 ( 默认是 15 岁,可以通过参数 -XX:MaxTenuringThreshold 来设定 ),这些对象就会成为老年代。 但这也不是一定的,对于一些较大的对象 ( 即需要分配一块较大的连续内存空间 ) 则是直接进入到老年代。
三、老年代
Full GC 是发生在老年代的垃圾收集动作,所采用的是标记-清除算法。
Full GC 发生的次数不会有 Minor GC 那么频繁,并且做一次 Full GC 要比进行一次 Minor GC 的时间更长。另外,标记-清除算法收集垃圾的时候会产生许多的内存碎片 ( 即不连续的内存空间 ),此后需要为较大的对象分配内存空间时,若无法找到足够的连续的内存空间,就会提前触发一次 GC 的收集动作。
四、永久代
在Java 8中,永久代被彻底移除,取而代之的是另一块与堆不相连的本地内存——元空间。
永久代或者“Perm Gen”包含了JVM需要的应用元数据,这些元数据描述了在应用里使用的类和方法。注意,永久代不是Java堆内存的一部分。永久代存放JVM运行时使用的类。永久代同样包含了Java SE库的类和方法。永久代的对象在full GC时进行垃圾收集。
五、JVM常用参数
-XX:+PrintGCDetails:打印gc日志详细信息
-XX:+PrintGCTimeStamps:打印gc发生时相对jvm启动的时间戳,(后来加入了PrintGCDateStamps,打印gc发生的日期)
-Xloggc:设置gc日志的生成位置
-Xms4096M:堆容量初始值
-Xmx4096M:堆容量最大值
-Xmn1024M:新生代容量,所以老年代容量 = 堆容量 - 新生代容量 = 3072M
-Xss256K:线程堆栈空间大小
-XX:MaxDirectMemorySize:Direct Buffer Memory大小
-XX:NewRatio 用来来指定新生代和整个堆的大小比例,或者直接用–XX:NewSize来指定所需的新生代空间
-XX:SurvivorRatio Eden区与Survivor区的大小比值
-XX:MaxTenuringThreshold 设置对象在新生代中最大的存活次数,最大值15,并行回收机制默认为15,CMS默认为4。每经过一次YGC,年龄加1,当survivor区的对象年龄达到TenuringThreshold时,表示该对象是长存活对象,就会直接晋升到老年代
-XX:TargetSurvivorRatio 设定survivor区的目标使用率。默认50,即survivor区对象目标使用率为50%,最高90%
-XX:PretenureSizeThreshold 对象超过多大是直接在旧生代分配
-XX:+CMSParallelRemarkEnabled 降低标记停顿
-XX:MaxPermSize:设置持久代最大值 物理内存的1/4
-XX:PermSize:设置持久代(perm gen)初始值 物理内存的1/64
六、GC算法CMS
CMS,全称Concurrent Low Pause Collector,主要适合场景是对响应时间的重要性需求 大于对吞吐量的要求。
XX:+UseConcMarkSweepGC //启用CMS
CMS是不会整理堆碎片的,因此为了防止堆碎片引起full gc,通过会开启CMS阶段进行合并碎片选项:-XX:+UseCMSCompactAtFullCollection,开启这个选项一定程度上会影响性能,可以通过配置适当的CMSFullGCsBeforeCompaction来调整性能。
开启并行remark: -XX:+CMSParallelRemarkEnabled
为了避免Perm区满引起的full gc,建议开启CMS回收Perm区选项:
+CMSPermGenSweepingEnabled -XX:+CMSClassUnloadingEnabled
默认CMS是在tenured generation占满68%的时候开始进行CMS收集,如果你的年老代增长不是那么快,并且希望降低CMS次数的话,可以适当调高此值:
-XX:CMSInitiatingOccupancyFraction=70