zoukankan      html  css  js  c++  java
  • JVM参数

    基本常识

    堆内存 = Eden + old + Metaspace(perm)
    总内存 = 堆 + 栈 + 堆外内存 + jvm等内部使用的内存
    system.gc最常见的场景是RMI/NIO下的堆外内存分配等
    java -verbose:class -version:查看jvm启动时被加载的类

    OutOfMemoryError
    分配内存当Eden内存不够用的时候,某些情况下会尝试到Old里进行分配(比如说要分配的内存很大),如果还是没有分配成功,于是会触发一次ygc的动作,而ygc完成之后我们会再次尝试分配,如果仍不足以分配此时的内存,那会接着做一次full gc(不过此时的soft reference不会被强制回收),将老生代也回收一下,接着再做一次分配,仍然不够分配那会做一次强制将soft reference也回收的full gc,如果还是不能分配,那这个时候就抛出OutOfMemoryError

    perm用来存klass、method、constantPool等信息,klass是我们熟知的class文件在jvm里的运行时数据结构

    内存相关(常用)

    -Xms:设置程序启动时的初始堆大小(如 -Xms4g,jvm启动时,分配最小堆大小4g)
    -Xmx:设置程序能获得的最大堆大小(如 -Xmx4g,jvm启动时,允许分配的最大的堆大小4g。一般设定为同一个值,这是因为无论扩展还是缩减空间都需要进行full gc)
    -Xss:设置线程栈的大小(如 -Xss1m)

    -Xmn:年轻代大小(如 -Xmn2g,分配的年轻代大小2g)
    -XX:SurvivorRatio:新生代中eden区与Survivor区的比例,有两个surivior(如 -XX:SurvivorRatio=10)

    -XX:MetaspaceSize:元数据区默认大小。JDK8之后没有Perm区了(如 -XX:MetaspaceSize=256m)
    -XX:MaxMetaspaceSize:元数据的最大大小(如 -XX:MaxMetaspaceSize=256m)
    -XX:MaxDirectMemorySize:最大的堆外内存(如 -XX:MaxDirectMemorySize=1g)

    内存相关(jdk8及以上不管用)

    -XX:MinHeapFreeRatio:设置堆空间最小空闲比例。当堆空间的空闲内存小于这个数值时,JVM便会扩展堆空间。
    -XX:MaxHeapFreeRatio:设置堆空间最大空闲比例。当堆空间的空闲内存大于这个数值时,JVM便会压缩堆空间。
    -XX:NewSize:设置新生代初始化大小。
    -XX:MaxNewSize:设置年轻代最大值
    -XX:NewRatio:设置老年代和新生代的比例。
    -XX:MaxPermSize:设置永久代的最大值。
    -XX:PermSize:设置永久代的初始值。
    -XX:TargetSurvivorRatio:设置survivor取的可使用率。当survivor区的空间使用率达到这个数值时,会将对象送入老年代。

    GC相关

    -XX:+UseConcMarkSweepGC:使用CMS内存收集,新生代自动默认使用ParNew。
    -XX:ParallelGCThreads=4:设置并行收集器的线程数为4,一般跟cpu核数相等
    -XX:CMSMaxAbortablePrecleanTime=5000:指定CMS-concurrent-abortable-preclean阶段执行的时间,该阶段主要是执行一些预清理,减少应用暂停的时间
    -XX:+CMSClassUnloadingEnabled:对永久代区不再使用的class进行回收
    -XX:CMSInitiatingOccupancyFraction=80:使用80%后开始CMS收集
    -XX:+UseCMSInitiatingOccupancyOnly:使用手动或者自定义触发cms收集,同时也会禁止hostspot 自行触发CMS GC
    -XX:+ExplicitGCInvokesConcurrent:无论什么时候调用系统GC(system.gc()),都执行CMS GC,而不是Full GC
    -XX:CMSWaitDuration=10000:让CMS的initial-mark起来前,等待10sParNew的发生,ParNew可以减少GC root chain的数量。否则initial-mark会很长,不少会超过1s

    -Xloggc:/home/admin/logs/gc.log:gc打印的日志目录
    -XX:+PrintGCDetails:打印GC的详情信息
    -XX:+PrintGCDateStamps:打印GC的时间戳
    -XX:+HeapDumpOnOutOfMemoryError:当发生OOM错误 时,将内存DUMP下来
    -XX:HeapDumpPath=/home/admin/logs/java.hprof:设置内存DUMP的路径
    -XX:+PrintGCApplicationStoppedTime:打印垃圾回收器执行的暂停时间
    -XX:+PrintGCApplicationConcurrentTime:打印每次垃圾回收前,程序未中断的执行时间
    -XX:+PrintHeapAtGC:打印GC前的详细堆栈信息
    -XX:+PrintGCCause来打印原因
    -XX:+HeapDumpBeforeFullGC、-XX:+HeapDumpAfterFullGC:在Full GC前后分别对内存做一个dump
    -XX:+DisableExplicitGC:禁用认为GC

    优化相关

    -server、-client:client模式的特点是启动快、占用内存少、JIT编译器生成代码的速度也更快。Server模式则提供了更复杂的生成码优化功能,这个功能对于服务器程序而言尤为重要。
    -XX:LargePageSizeInBytes:内存页的大小
    -XX:+UseFastAccessorMethods:原始类型快速优化
    -XX:+AggressiveOpts:编译速度加快
    -XX:+UseBiasedLocking:启用偏向锁,优化锁机制改善性能
    -Xnoclassgc:禁用垃圾回收
    -XX:SofLRUPolicyMSPerMB:每兆堆空闲空间中SoftReference的存活空间,默认是1秒
    -XX:PretenureSizeThreshold:对象超过多大值时直接在旧生代中分配
    -XX:TLABWasteTargetPercent:TLAB占eden区的百分比,默认是1%
    -XX:+CollectGenOFist:FullGC时是否先YGC 默认是是false 不允许线YGC

    -XX:CICompilerCount=12:编译线程,加快编译速度

     

    其他GC收集器

    -XX:+UseSerialGC:设置串行收集器
    -XX:+UseParallelGC:设置并行收集器, Full GC 采用parallel MSC 就是年轻代使用并发收集,而年老代仍旧使用串行收集
    -XX:+UseParNewGC:设置年轻代为并行收集器,这个可以与cms收集同时使用,jdk5以上是不用配置的
    -XX:+UseParalledlOldGC:设置并行年老代收集器, jdk6以上新出的配置
    -XX:MaxGCPauseMillis:每次年轻代垃圾回收的最长时间,如果无法满足此事件,JVM会自动调整年轻代大小,以满足此值
    -XX:GCTimeRatio:设置垃圾回收时间站程序运行时间的百分比
    -XX:+ScavengeBeforeFullGC:Full GC前调用YGC 默认是true

    -XX:+AggressiveHeap:让JVM自动根据机器的内存和CPU数优化各种参
    -XX:CMSFullGCsBeforeCompaction :在多少次GC后进行内存压缩,这个是因为并行收集器不对内存空间进行压缩的,所以运行一段时间后会产生很多碎片,使得运行效率降
    -XX:+CMSParallelRemarkEnabled:降低标记停顿
    -XX:+UseCMSCompactAtFullCollection:在Full GC时对老年代压缩
    -XX:CMSInitiatingPermOccupancyFraction:设置perm gen使用达到多少%比时触发垃圾回收,默认是92%
    -XX:+CMSIncrementalMode:设置为增量模式

    调试相关

    -Xdebug
    -Xnoagent
    -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=8000

    其他

    -XX:+FailOverToOldVerifier:如果新的Class校验器检查失败,则使用老的校验器
    -XX:+HandlePromotionFailure:关闭新生代收集器,jdk5以前是不默认启动的 jdk6默认启用
    -XX:-MaxFDLimit:设置java进程可用文件描述符为操作系统允许的最大值
    -XX:+UseAltsigs:为了防止与其他发送信号的应用程序冲突,允许使用候补信号替代
    -XX:+UseBoundTherads:绑定所有的用户线程到内核线程,减少线程进入到饥饿状态次数
    -XX:+UseGCOverhedLimit:限制GC的运行时间。如果GC耗时过长,就抛OOM
    -XX:+UseLWPSynchronization :使用轻量级进程(cpu线程)替换线程同步
    -XX:+UseTLAB:启动线程本地缓存区
    -XX:+UseSplitVerifier:使用新的Class类型校验器
    -XX:+UseThreadPriorities:使用本地线程的优先级
    -XX:+UseVMInterruptibleIO:允许运行时中断线程
    -XX:-UseISM:启动solaris的ISM
    -XX:+UseLargePages:启动最大内存分页
    -XX:+UseBoundThreads:绑定所有的用户线程到内核线程
    -XX:ErrorFile=FileName.log:异常打印在错误文件上
    -XX:+PerfSaveDataToFile:退出时保存jvmstat二进制的文件
    -XX:+UseSpining:开启自旋锁
    -XX:PreBlockSpin=N:更改自旋锁的自旋次数
    -XX:+TraceClassLoading :跟踪类加载的信息(诊断内存泄露很有用)
    -XX:+TraceClassUnloading :跟踪类卸载的信息(诊断内存泄露很有用)
    -agentlib:libname[=options] :用于加载本地的lib
    -agentlib:hprof :用于获取JVM的运行情况
    -agentpath:pathnamep[=options] :加载制定路径的本地库
    -Dproperty=value :设置系统属性名/值对
    -jar :制定以jar包的形式执行一个应用程序
    -javaagent:jarpath[=options] :实现premain方法在main方法前执行可以利用该方式玩一个JVM层面的hook
    -verbose:jni :输出native方法的调用情况玩JNI必备技能
    -XX:+PrintCompilation:可以看到正在jit哪些方法,分别用了多少时间,代码块有多大等
    -XX:+TieredCompilation:将jit编译的过程分为了好几层进行逐步编译,这样每次编译带来的开销会比较小,相当于把一步到位的事情分解到了几个过程里,给cpu带来的影响也被分摊了
    -XX:MaxJavaStackTraceDepth=1024:JVM里对栈的输出条数
    -XX:CompilerThreadStackSize:编译器盏大小
    -XX:VMThreadStackSize:JVM盏大小
    -XX:StackYellowPages,-XX:StackRedPages,-XX:StackShadowPages:盏内存保护相关

    JVM常用调优

    Xms=Xmx。减少堆内存大小的调整,提高稳定性
    适当增大Xmn、XX:NewRatio。尽量将新生代对象留在新生代,避免新生的大对象直接进入老年代,适当调大Xmn、NewRatio,增加新生代的空间
    适当调整XX:PretenureSizeThreshold、XX:MaxTenuringThreshold。应该尽量阻止短命大对象进入老年代
    -Xss2m改为-Xss1m。减少线程栈的内存分配,避免内存的浪费
    XX:PermSize=196m改为256m。持久代的初始值和最大值都设为256M,避免持久代初始内存不足时因此内存的动态分配。
    适当调整堆外内存

    XX:+UseConcMarkSweepGC、XX:+UseCMSCompactAtFullCollection。在多核CPU上,可用并行垃圾回收器CMS。
    XX:ParallelGCThreads。并行的垃圾回收线程的数量,最好等于CPU数量
    Xincgc。使用增量式的GC
    XX:+DisableExplicitGC。禁用System.gc(),因为它会触发Full GC
    XX:CMSInitiatingOccupancyFraction和XX:+UseCMSInitiatingOccupancyOnly最好一起使用,做到可控,只有当old到达阀值(CMSInitiatingOccupancyFraction)时进行majorGC。

     

    JVM常用参数

     

    CATALINA_OPTS="-server"
    CATALINA_OPTS="${CATALINA_OPTS} -Xms4g -Xmx4g"
    CATALINA_OPTS="${CATALINA_OPTS} -Xmn2560m"
    CATALINA_OPTS="${CATALINA_OPTS} -XX:SurvivorRatio=10"
    CATALINA_OPTS="${CATALINA_OPTS} -XX:+UseConcMarkSweepGC"
    CATALINA_OPTS="${CATALINA_OPTS} -XX:+UseCMSCompactAtFullCollection"
    CATALINA_OPTS="${CATALINA_OPTS} -XX:CMSMaxAbortablePrecleanTime=5000"
    CATALINA_OPTS="${CATALINA_OPTS} -XX:+CMSClassUnloadingEnabled"
    CATALINA_OPTS="${CATALINA_OPTS} -XX:CMSInitiatingOccupancyFraction=80"
    CATALINA_OPTS="${CATALINA_OPTS} -XX:PermSize=512m -XX:MaxPermSize=512m -Xss1m"
    CATALINA_OPTS="${CATALINA_OPTS} -Xloggc:${MIDDLEWARE_LOGS}/gc.log"
    CATALINA_OPTS="${CATALINA_OPTS} -XX:+PrintGCDetails"
    CATALINA_OPTS="${CATALINA_OPTS} -XX:+PrintGCDateStamps"
    CATALINA_OPTS="${CATALINA_OPTS} -XX:+HeapDumpOnOutOfMemoryError"
    CATALINA_OPTS="${CATALINA_OPTS} -XX:HeapDumpPath=${APP_HOME}/logs/im.hprof"
    CATALINA_OPTS="${CATALINA_OPTS} -Djava.awt.headless=true"
    CATALINA_OPTS="${CATALINA_OPTS} -Dsun.net.client.defaultConnectTimeout=10000"
    CATALINA_OPTS="${CATALINA_OPTS} -Dsun.net.client.defaultReadTimeout=30000"
    # SETENV NEW OPTS
    CATALINA_OPTS="${CATALINA_OPTS} -XX:MaxDirectMemorySize=1g"
    CATALINA_OPTS="${CATALINA_OPTS} -XX:+UseCMSInitiatingOccupancyOnly"
    CATALINA_OPTS="${CATALINA_OPTS} -XX:+ExplicitGCInvokesConcurrent -Dsun.rmi.dgc.server.gcInterval=2592000000 -Dsun.rmi.dgc.client.gcInterval=2592000000"
    CATALINA_OPTS="${CATALINA_OPTS} -XX:ParallelGCThreads=${CPU_COUNT}"
    CATALINA_OPTS="${CATALINA_OPTS} -DJM.LOG.PATH=${MIDDLEWARE_LOGS}"
    CATALINA_OPTS="${CATALINA_OPTS} -Dfile.encoding=${JAVA_FILE_ENCODING}"
    CATALINA_OPTS="${CATALINA_OPTS} -Dhsf.publish.delayed=true"

     

    ZGC

    JAVA_GC_OPTS="-XX:+UnlockExperimentalVMOptions  -XX:+UseZGC   -Xlog:age*,gc*=info:file=logs/gc-%t.log:time,tid,tags:filecount=3,filesize=20m   -XX:+DisableExplicitGC"

    G1

    JAVA_GC_OPTS="-XX:+UnlockExperimentalVMOptions   -XX:+UseG1GC  -XX:+DisableExplicitGC -Xlog:age*,gc*=info:file=logs/gc.log:time,tid,tags:filecount=3,filesize=100m"

     

    看一个配置的例子

    -server -Xmx256m -Xms256m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=128m -Xss512k -XX:+DisableExplicitGC -XX:+UseConcMarkSweepGC -XX:+CMSParallelRemarkEnabled -XX:+UseCMSCompactAtFullCollection -XX:LargePageSizeInBytes=128m -XX:+UseFastAccessorMethods -XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=70 -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCTimeStamps -XX:+PrintHeapAtGC -Xloggc:/home/service/var/logs/gc.log  

    打印的gc日志

    Heap after GC invocations=1526 (full 2):
    par new generation total 78656K, used 1021K [0x00000000f0000000, 0x00000000f5550000, 0x00000000f5550000)
    eden space 69952K, 0% used [0x00000000f0000000, 0x00000000f0000000, 0x00000000f4450000)
    from space 8704K, 11% used [0x00000000f4450000, 0x00000000f454f710, 0x00000000f4cd0000)
    to space 8704K, 0% used [0x00000000f4cd0000, 0x00000000f4cd0000, 0x00000000f5550000)
    concurrent mark-sweep generation total 174784K, used 118121K [0x00000000f5550000, 0x0000000100000000, 0x0000000100000000)
    Metaspace used 83554K, capacity 86644K, committed 86912K, reserved 1126400K
    class space used 8387K, capacity 8996K, committed 9088K, reserved 1048576K
    }
    {Heap before GC invocations=1526 (full 2):
    par new generation total 78656K, used 70973K [0x00000000f0000000, 0x00000000f5550000, 0x00000000f5550000)
    eden space 69952K, 100% used [0x00000000f0000000, 0x00000000f4450000, 0x00000000f4450000)
    from space 8704K, 11% used [0x00000000f4450000, 0x00000000f454f710, 0x00000000f4cd0000)
    to space 8704K, 0% used [0x00000000f4cd0000, 0x00000000f4cd0000, 0x00000000f5550000)
    concurrent mark-sweep generation total 174784K, used 118121K [0x00000000f5550000, 0x0000000100000000, 0x0000000100000000)
    Metaspace used 83554K, capacity 86644K, committed 86912K, reserved 1126400K
    class space used 8387K, capacity 8996K, committed 9088K, reserved 1048576K
    2021-03-30T10:14:37.040+0800: 65348.027: [GC (Allocation Failure) 2021-03-30T10:14:37.040+0800: 65348.027: [ParNew: 70973K->1208K(78656K), 0.0065410 secs] 189095K->119338K(253440K), 0.0071690 secs] [Times: user=0.02 sys=0.01, real=0.00 secs]

    人生在勤,不索何获,坚持自有收获
  • 相关阅读:
    webpack基础+webpack配置文件常用配置项介绍+webpack-dev-server
    webpack 支持的模块方法
    在nodejs中引进模块要经历的步骤
    git 学习笔记(常用命令)
    http缓存(http caching)
    http协议——cookie详解
    JavaScript实现排序二叉树的相关算法
    JavaScript将小写金额转换成大写
    React——组件的生命周期函数
    React——高阶组件
  • 原文地址:https://www.cnblogs.com/quyf/p/14595613.html
Copyright © 2011-2022 走看看