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

 

 




相关推荐

1、基本类型 在程序设计中经常用到一系列类型(基本类型),它们需要特殊对待。对于这些类型,Java采取与C和C++相同的方法,也就是说,不用new来创建变量,于是创建一个并非引

1、直接常量 为了编译器可以准确的知道要生成什么样的类型,可以给直接常量后面添加后缀字符标志它的类型,若为L表示long,F表示float,D表示double。也可以利用前缀表示进制,0x表示十六进制

Java完全采用动态内存分配方式。每当想创建新对象时,就需要使用new关键字来构建此对象实例。 1、this 在构造器中,如果为this添加了参数列表,那么就有了

一、类的继承 1、说明 (1)extends关键字用于类的继承。 (2)在C++中,方法的动态绑定是使用virtual关键字来实现的,而在Java中,动态绑定是默认的形为,不需要添加额外的关键字。 (

1、类型信息 指程序能够在运行时发现和使用类型信息,我们一般使用两种方式来实现运行时对象和类的信息:传统的RTTI和反射机制。 (1)class对象 <p

用于描述Java源代码,使得我们能够以将由编译器来测试和验证的格式,存储有关程序的额外信息。使用时在@后面跟注解的名字。 1、预定义的三个注解<

一、创建线程 创建线程有四种方式:继承Thread类、实现Runnable接口、实现Callable接口、通过线程池创建。 1、继承Thread 重写run方法。 class A extends Th

一、Collection接口 Collection接口的iterator和toArray方法都用于获得集合中的“所有元素”。前者返回一个“iterator”对象,后者返回一个包含集合中所有元素的数组。

1.hashCode的存在主要用于查找的快捷性,如hashtable,hastmap等,hashcode是用来在散列存储结构中确定对象的存储地址的。 2.如果两个对象相同,就是适用

Java中的数据类型,可分为两类: 1.基本数据类型,它们之间的比较,应用双等号,比较的是它们的值。 2.复合数据类型(类) 当他们用双等号进行比较的时