精华内容
下载资源
问答
  • jvm参数设置
    千次阅读
    2021-10-20 10:22:21

    一、堆参数设置

    -XX:+PrintGC 使用这个参数,虚拟机启动后,只要遇到GC就会打印日志
    -XX:+UseSerialGC 配置串行回收器
    -XX:+PrintGCDetails 可以查看详细信息,包括各个区的情况
    -Xms:设置Java程序启动时初始化堆大小
    -Xmx:设置Java程序能获得最大的堆大小
    -Xmx20m -Xms5m -XX:+PrintCommandLineFlags:可以将隐式或者显示传给虚拟机的参数输出

    二、新生代参数配置

    -Xmn:可以设置新生代的大小,设置一个比较大的新生代会减少老年代的大小,这个参数对系统性能以及GC行为有很大的影响,新生代大小一般会设置整个堆空间的1/3到1/4左右。
    -XX:SurvivorRatio:用来设置新生代中eden空间和from/to空间的比例。含义:-XX:SurvivorRatio=eden/from=eden/to。
    不同的堆分布情况,对系统执行会产生一定的影响,在实际工作中,应该根据系统的特点做出合理的配置,基本策略:尽可能将对象预留在新生代,减少老年代的GC次数。
    除了可以设置新生代的绝对大小(-Xmn),还可以使用(-XX:NewRatio)设置新生代和老年代的比例:-XX:NewRatio=老年代/新生代。

    配置运行时参数:-Xms20m -Xmx20m -Xmn1m -XX:SurvivorRatio=2 -XX:+PrintGCDetails
    -XX:+UseSerialGC

    三、堆溢出参数配置

    在Java程序的运行过程中,如果对空间不足,则会抛出内存溢出的错误(Out Of Memory)OOM,一旦这类问题发生在生产环境,则可能引起严重的业务中断,Java虚拟机提供了-XX:+HeapDumpOnOutOfMemoryError,
    使用该参数可以在内存溢出时导出整个堆信息,与之配合使用的还有参数-XX:HeapDumpPath,可以设置导出堆的存放路径。
    内存分析工具:Memory Analyzer

    配置运行时参数 -Xms1m -Xmx1m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=d:/Demo3.dump

    四、栈参数配置

    Java虚拟机提供了参数-Xss来指定线程的最大栈空间,整个参数也直接决定了函数可调用的最大深度。

    配置运行时参数:-Xss1m

    五、方法区参数配置

    和Java堆一样,方法区是一块所有线程共享的内存区域,它用于保存系统的类信息,方法区(永久区)可以保存多少信息可以对其进行配置,在默认情况下,-XX:MaxPermSize为64M,
    如果系统运行时生产大量的类,就需要设置一个相对合适的方法区,以免出现永久区内存溢出的问题。

    -XX:PermSize=64M -XX:MaxPermSize=64M

    六、直接内存参数配置

    直接内存也是Java程序中非常重要的组成部分,特别是广泛用在NIO中,直接内存跳过了Java堆,使用Java程序可以直接访问原生堆空间,因此在一定程度上加快了内存空间的访问速度。
    但是说直接内存一定就可以提高内存访问速度也不见得,具体情况具体分析。

    相关配置参数:-XX:MaxDirectMemorySize,如果不设置,默认值为最大堆空间,即-Xmx。直接内存使用达到上限时,就会触发垃圾回收,如果不能有效的释放空间,就会引起系统的OOM。

    七、对象进入老年代的参数配置

    一般而言,对象首次创建会被放置在新生代的eden区,如果没有GC介入,则对象不会离开eden区,那么eden区的对象如何进入老年代呢?
    通常情况下,只要对象的年龄达到一定的大小,就会自动离开年轻代进入老年代,对象年龄是由对象经历数次GC决定的,在新生代每次GC之后如果对象没有被回收,则年龄加1。
    虚拟机提供了一个参数来控制新生代对象的最大年龄,当超过这个年龄范围就会晋升老年代。
    -XX:MaxTenuringThreshold,默认情况下为15

    配置运行时参数:-Xmx64M -Xms64M -XX:+PrintGCDetails

    结论:对象首次创建会被放置在新生代的eden区,因此输出结果中from和to区都为0%。

    根据设置MaxTenuringThreshold参数,可以指定新生代对象经过多少次回收后进入老年代。另外,大对象新生代eden区无法装入时,也会直接进入老年代。
    JVM里有个参数可以设置对象的大小超过在指定的大小之后,直接晋升老年代。
    -XX:PretenureSizeThreshold=15

    参数:-Xmx1024M -Xms1024M -XX:+UseSerialGC -XX:MaxTenuringThreshold=15 -XX:+PrintGCDetails

    使用PretenureSizeThreshold可以进行指定进入老年代的对象大小,但是要注意TLAB区域优先分配空间。虚拟机对于体积不大的对象 会优先把数据分配到TLAB区域中,因此就失去了在老年代分配的机会.

    参数:-Xmx30M -Xms30M -XX:+UseSerialGC -XX:+PrintGCDetails -XX:PretenureSizeThreshold=1000 -XX:-UseTLAB

    八、TLAB参数配置

    TLAB全称是Thread Local Allocation Buffer即线程本地分配缓存,从名字上看是一个线程专用的内存分配区域,是为了加速对象分配对象而生的。
    每一个线程都会产生一个TLAB,该线程独享的工作区域,Java虚拟机使用这种TLAB区来避免多线程冲突问题,提高了对象分配的效率。
    TLAB空间一般不会太大,当大对象无法在TLAB分配时,则会直接分配到堆上。
    -XX:+UseTLAB使用TLAB
    -XX:+TLABSize设置TLAB大小
    -XX:TLABRefillWasteFraction设置维护进入TLAB空间的单个对象大小,它是一个比例值,默认为64,即如果对象大于整个空间的1/64,则在堆创建对象。
    -XX:+PrintTLAB查看TLAB信息
    -XX:ResizeTLAB自调整TLABRefillWasteFraction阈值。

    参数:-XX:+UseTLAB -XX:+PrintTLAB -XX:+PrintGC -XX:TLABSize=102400 -XX:-ResizeTLAB -XX:TLABRefillWasteFraction=100 -XX:-DoEscapeAnalysis -server

    更多相关内容
  • JVM参数设置,提供java虚拟机运行时的参数设置
  • JVM参数设置

    万次阅读 多人点赞 2018-09-21 17:55:05
    JVM参数设置 基本参数 通过一张图来了解如何通过参数来控制各区域的内存大小 控制参数 -Xms设置堆的最小空间大小。 -Xmx设置堆的最大空间大小。 -XX:NewSize设置新生代最小空间大小。 -XX:MaxNewSize设置...

    JVM参数设置

    基本参数

    通过一张图来了解如何通过参数来控制各区域的内存大小

    image

    控制参数

    • -Xms设置堆的最小空间大小。
    • -Xmx设置堆的最大空间大小。
    • -XX:NewSize设置新生代最小空间大小。
    • -XX:MaxNewSize设置新生代最大空间大小。
    • -XX:PermSize设置永久代最小空间大小。
    • -XX:MaxPermSize设置永久代最大空间大小。
    • -Xss设置每个线程的堆栈大小。

    没有直接设置老年代的参数,但是可以设置堆空间大小和新生代空间大小两个参数来间接控制。

    老年代空间大小=堆空间大小-年轻代大空间大小

    image

    VM内存区域总体分两类,heap区 和 非heap 区 。

    • heap区: 堆区分为Young Gen(新生代),Tenured Gen(老年代-养老区)。其中新生代又分为Eden Space(伊甸园)、Survivor Space(幸存者区)。
    • 非heap区: Code Cache(代码缓存区)、Perm Gen(永久代)、Jvm Stack(java虚拟机栈)、Local Method Statck(本地方法栈)。

    为什么要区分新生代和老生代?

    堆中区分的新生代和老年代是为了垃圾回收,新生代中的对象存活期一般不长,
    而老年代中的对象存活期较长,所以当垃圾回收器回收内存时,新生代中垃圾回收效果较好,
    会回收大量的内存,而老年代中回收效果较差,内存回收不会太多。

    不同代采用的算法区别?

    基于以上特性,新生代中一般采用复制算法,因为存活下来的对象是少数,
    所需要复制的对象少,而老年代对象存活多,不适合采用复制算法,
    一般是标记整理和标记清除算法。
    因为复制算法需要留出一块单独的内存空间来以备垃圾回收时复制对象使用,
    所以将新生代分为eden区和两个survivor区,每次使用eden和一个survivor区,
    另一个survivor作为备用的对象复制内存区。

    请看下面题目:

    对于jvm内存配置参数:

    -Xmx10240m -Xms10240m -Xmn5120m -XXSurvivorRatio=3

    其最小内存值和Survior区总大小分别是: 10240m,2048m

    我们只需要知道Survior区有两个,就是图中的S0和S1,
    而Eden区只用一个, -XXSurvivorRatio参数是Eden区和单个Survior区的比例,
    所以应该有(3+1+1)*Survior=5012m,图中问的是Survior总大小(需乘2)

    全局参数

    JVM参数设置、分析

    典型配置举例

    堆大小设置

    • 年轻代的设置很关键

    JVM 中最大堆大小有三方面限制:相关操作系统的数据模型(32-bt 还是 64-bit)限制;系
    统的可用虚拟内存限制;系统的可用物理内存限制。 32 位系统下,一般限制在 1.5G~2G;
    64 为操作系统对内存无限制。在 Windows Server 2003 系统, 3.5G 物理内存, JDK5.0 下
    测试,最大可设置为 1478m。

    典型配置

    java -Xmx3550m -Xms3550m -Xmn2g –Xss128k

    • -Xmx3550m: 设置 JVM 最大可用内存为 3550M。

    • -Xms3550m: 设置 JVM 初始内存为 3550m。此值可以设置与-Xmx 相同,以避免每次垃圾
      回收完成后 JVM 重新分配内存。

    • -Xmn2g: 设置年轻代大小为 2G。整个堆大小=年轻代大小 + 年老代大小 + 持久代大小。
      持久代一般固定大小为 64m,所以增大年轻代后,将会减小年老代大小。此值对系统性能
      影响较大, Sun 官方推荐配置为整个堆的 3/8。

    • -Xss128k: 设置每个线程的堆栈大小。 JDK5.0 以后每个线程堆栈大小为 1M,以前每个线
      程堆栈大小为 256K。更具应用的线程所需内存大小进行调整。在相同物理内存下,减小这
      个值能生成更多的线程。但是操作系统对一个进程内的线程数还是有限制的,不能无限生成,
      经验值在 3000~5000 左右。

    java -Xmx3550m -Xms3550m -Xss128k -XX:NewRatio=4 -XX:SurvivorRatio=4 -XX:MaxPermSize=16m -XX:MaxTenuringThreshold=0

    • -XX:NewRatio=4: 设置年轻代(包括 Eden 和两个 Survivor 区)与年老代的比值(除去持久
      代)。设置为 4,则年轻代与年老代所占比值为 1: 4,年轻代占整个堆栈的 1/5

    • -XX:SurvivorRatio=4: 设置年轻代中 Eden 区与 Survivor 区的大小比值。设置为 4,则两
      个 Survivor 区与一个 Eden 区的比值为 2:4,一个 Survivor 区占整个年轻代的 1/6

    • -XX:MaxPermSize=16m: 设置持久代大小为 16m。

    • -XX:MaxTenuringThreshold=0: 设置垃圾最大年龄。如果设置为 0 的话,则年轻代对象
      不经过 Survivor 区,直接进入年老代。对于年老代比较多的应用,可以提高效率。如果将
      此值设置为一个较大值,则年轻代对象会在 Survivor 区进行多次复制,这样可以增加对象
      再年轻代的存活时间,增加在年轻代即被回收的概论

    回收器选择

    JVM 给了三种选择: 串行收集器、并行收集器、并发收集器,但是串行收集器只适用于小
    数据量的情况,所以这里的选择主要针对并行收集器和并发收集器。默认情况下, JDK5.0
    以前都是使用串行收集器,如果想使用其他收集器需要在启动时加入相应参数。 JDK5.0 以
    后, JVM 会根据当前系统配置进行判断。

    吞吐量优先的并行收集器

    如上文所述,并行收集器主要以到达一定的吞吐量为目标,适用于科学技术和后台处理等。

    典型配置

    java -Xmx3800m -Xms3800m -Xmn2g -Xss128k -XX:+UseParallelGC -XX:ParallelGCThreads=20

    • -XX:+UseParallelGC: 选择垃圾收集器为并行收集器。 此配置仅对年轻代有效。即上述配
      置下,年轻代使用并发收集,而年老代仍旧使用串行收集。
    • -XX:ParallelGCThreads=20: 配置并行收集器的线程数,即:同时多少个线程一起进行垃
      圾回收。此值最好配置与处理器数目相等。

    java -Xmx3550m -Xms3550m -Xmn2g -Xss128k -XX:+UseParallelGC -XX:ParallelGCThreads=20 -XX:+UseParallelOldGC

    • -XX:+UseParallelOldGC: 配置年老代垃圾收集方式为并行收集。 JDK6.0 支持对年老代并
      行收集。

    java -Xmx3550m -Xms3550m -Xmn2g -Xss128k -XX:+UseParallelGC -XX:MaxGCPauseMillis=100

    • -XX:MaxGCPauseMillis=100: 设置每次年轻代垃圾回收的最长时间,如果无法满足此时间,
      JVM 会自动调整年轻代大小,以满足此值。

    java -Xmx3550m -Xms3550m -Xmn2g -Xss128k -XX:+UseParallelGC -XX:MaxGCPauseMillis=100 -XX:+UseAdaptiveSizePolicy

    • -XX:+UseAdaptiveSizePolicy:设置此选项后,并行收集器会自动选择年轻代区大小和相
      应的 Survivor 区比例,以达到目标系统规定的最低相应时间或者收集频率等,此值建议使
      用并行收集器时,一直打开。

    响应时间优先的并发收集器

    如上文所述,并发收集器主要是保证系统的响应时间,减少垃圾收集时的停顿时间。适用于
    应用服务器、 电信领域等。

    典型配置

    java -Xmx3550m -Xms3550m -Xmn2g -Xss128k -XX:ParallelGCThreads=20 -XX:+UseConcMarkSweepGC -XX:+UseParNewGC

    • -XX:+UseConcMarkSweepGC: 设置年老代为并发收集。测试中配置这个以后,
      -XX:NewRatio=4 的配置失效了,原因不明。所以,此时年轻代大小最好用-Xmn 设置。
    • -XX:+UseParNewGC: 设置年轻代为并行收集。可与 CMS 收集同时使用。 JDK5.0 以上,
      JVM 会根据系统配置自行设置,所以无需再设置此值。

    java -Xmx3550m -Xms3550m -Xmn2g -Xss128k -XX:+UseConcMarkSweepGC -XX:CMSFullGCsBeforeCompaction=5 -XX:+UseCMSCompactAtFullCollection

    • -XX:CMSFullGCsBeforeCompaction: 由于并发收集器不对内存空间进行压缩、整理,所
      以运行一段时间以后会产生“碎片”,使得运行效率降低。此值设置运行多少次 GC 以后对内
      存空间进行压缩、整理。
    • -XX:+UseCMSCompactAtFullCollection: 打开对年老代的压缩。可能会影响性能,但是
      可以消除碎片

    辅助信息

    JVM 提供了大量命令行参数,打印信息,供调试使用。主要有以下一些:

    • -XX:+PrintGC: 输出形式: [GC 118250K->113543K(130112K), 0.0094143 secs] [Full GC 121376K->10414K(130112K), 0.0650971 secs]

    • -XX:+PrintGCDetails: 输出形式: [GC [DefNew: 8614K->781K(9088K), 0.0123035 secs] 118250K->113543K(130112K), 0.0124633 secs] [GC [DefNew: 8614K->8614K(9088K), 0.0000665 secs][Tenured: 112761K->10414K(121024K), 0.0433488 secs] 121376K->10414K(130112K), 0.0436268 secs]

    • -XX:+PrintGCTimeStamps -XX:+PrintGC: PrintGCTimeStamps 可与上面两个混合使用
      输出形式:11.851: [GC 98328K->93620K(130112K), 0.0082960 secs]

    • -XX:+PrintGCApplicationConcurrentTime: 打印每次垃圾回收前,程序未中断的执行时
      间。可与上面混合使用。输出形式:Application time: 0.5291524 seconds

    • -XX:+PrintGCApplicationStoppedTime: 打印垃圾回收期间程序暂停的时间。可与上面
      混合使用。输出形式: Total time for which application threads were stopped: 0.0468229 seconds

    • -XX:PrintHeapAtGC: 打印 GC 前后的详细堆栈信息。输出形式:
      34.702: [GC {Heap before gc invocations=7: def new generation total 55296K, used 52568K [0x1ebd0000, 0x227d0000, 0x227d0000) eden space 49152K, 99% used [0x1ebd0000, 0x21bce430, 0x21bd0000) from space 6144K, 55% used [0x221d0000, 0x22527e10, 0x227d0000) to space 6144K, 0% used [0x21bd0000, 0x21bd0000, 0x221d0000) tenured generation total 69632K, used 2696K [0x227d0000, 0x26bd0000, 0x26bd0000) the space 69632K, 3% used [0x227d0000, 0x22a720f8, 0x22a72200, 0x26bd0000) compacting perm gen total 8192K, used 2898K [0x26bd0000, 0x273d0000, 0x2abd0000) the space 8192K, 35% used [0x26bd0000, 0x26ea4ba8, 0x26ea4c00, 0x273d0000) ro space 8192K, 66% used [0x2abd0000, 0x2b12bcc0, 0x2b12be00, 0x2b3d0000) rw space 12288K, 46% used [0x2b3d0000, 0x2b972060, 0x2b972200, 0x2bfd0000) 34.735: [DefNew: 52568K->3433K(55296K), 0.0072126 secs] 55264K->6615K(124928K)Heap after gc invocations=8: def new generation total 55296K, used 3433K [0x1ebd0000, 0x227d0000, 0x227d0000) eden space 49152K, 0% used [0x1ebd0000, 0x1ebd0000, 0x21bd0000) from space 6144K, 55% used [0x21bd0000, 0x21f2a5e8, 0x221d0000) to space 6144K, 0% used [0x221d0000, 0x221d0000, 0x227d0000) tenured generation total 69632K, used 3182K [0x227d0000, 0x26bd0000, 0x26bd0000) the space 69632K, 4% used [0x227d0000, 0x22aeb958, 0x22aeba00, 0x26bd0000) compacting perm gen total 8192K, used 2898K [0x26bd0000, 0x273d0000, 0x2abd0000) the space 8192K, 35% used [0x26bd0000, 0x26ea4ba8, 0x26ea4c00, 0x273d0000) ro space 8192K, 66% used [0x2abd0000, 0x2b12bcc0, 0x2b12be00, 0x2b3d0000) rw space 12288K, 46% used [0x2b3d0000, 0x2b972060, 0x2b972200, 0x2bfd0000) } , 0.0757599 secs]

    • -Xloggc:filename: 与上面几个配合使用,把相关日志信息记录到文件以便分析

    常见配置汇总

    堆设置

    • -Xms: 初始堆大小
    • -Xmx: 最大堆大小
    • -XX:NewSize=n: 设置年轻代大小
    • -XX:NewRatio=n: 设置年轻代和年老代的比值。如:为 3,表示年轻代与年老代比值为 1:3,年轻代占整个年轻代年老代和的 1/4
    • -XX:SurvivorRatio=n: 年轻代中 Eden 区与两个 Survivor 区的比值。注意 Survivor 区有两
      个。如: 3,表示 Eden: Survivor=3: 2,一个 Survivor 区占整个年轻代的 1/5
    • -XX:MaxPermSize=n: 设置持久代大小

    收集器设置

    • -XX:+UseSerialGC: 设置串行收集器
    • -XX:+UseParallelGC: 设置并行收集器
    • -XX:+UseParalledlOldGC: 设置并行年老代收集器
    • -XX:+UseConcMarkSweepGC: 设置并发收集器

    垃圾回收统计信息

    • -XX:+PrintGC
    • -XX:+PrintGCDetails
    • -XX:+PrintGCTimeStamps
    • -Xloggc:filename

    并行收集器设置

    • -XX:ParallelGCThreads=n: 设置并行收集器收集时使用的 CPU 数。并行收集线程数。
    • -XX:MaxGCPauseMillis=n: 设置并行收集最大暂停时间
    • -XX:GCTimeRatio=n: 设置垃圾回收时间占程序运行时间的百分比。公式为 1/(1+n)

    并发收集器设置

    • -XX:+CMSIncrementalMode: 设置为增量模式。适用于单 CPU 情况。
    • -XX:ParallelGCThreads=n: 设置并发收集器年轻代收集方式为并行收集时,使用的 CPU
      数。并行收集线程数。
    展开全文
  • JVM 参数设置

    千次阅读 2021-03-15 02:17:34
    不管是YGC还是Full GC,GC过程中都会对导致程序运行中中断,正确的选择不同的GC策略,调整JVM、GC的参数,可以极大的减少由于GC工作,而导致的程序运行中断方面的问题,进而适当的提高Java程序的工作效率。但是调整GC是...

    0818b9ca8b590ca3270a3433284dd417.png

    不管是YGC还是Full GC,GC过程中都会对导致程序运行中中断,正确的选择不同的GC策略,调整JVM、GC的参数,可以极大的减少由于GC工作,而导致的程序运行中断方面的问题,进而适当的提高Java程序的工作效率。但是调整GC是以个极为复杂的过程,由于各个程序具备不同的特点,如:web和GUI程序就有很大区别(Web可以适当的停顿,但GUI停顿是客户无法接受的),而且由于跑在各个机器上的配置不同(主要cup个数,内存不同),所以使用的GC种类也会不同(如何选择见GC种类及如何选择)。本文将注重介绍JVM、GC的一些重要参数的设置来提高系统的性能。

    JVM内存组成及GC相关内容请见之前的文章:JVM内存组成 GC策略&内存申请。

    JVM参数的含义实例见实例分析

    参数名称

    含义

    默认值

    -Xms

    初始堆大小

    物理内存的1/64(<1GB)

    默认(MinHeapFreeRatio参数可以调整)空余堆内存小于40%时,JVM就会增大堆直到-Xmx的最大限制.

    -Xmx

    最大堆大小

    物理内存的1/4(<1GB)

    默认(MaxHeapFreeRatio参数可以调整)空余堆内存大于70%时,JVM会减少堆直到 -Xms的最小限制

    -Xmn

    年轻代大小(1.4or lator)

    注意:

    整个堆大小=年轻代大小 + 年老代大小

    增大年轻代后,将会减小年老代大小.此值对系统性能影响较大,Sun官方推荐配置为整个堆的3/8

    -XX:NewSize

    设置年轻代大小(for 1.3/1.4)

    -XX:MaxNewSize

    年轻代最大值(for 1.3/1.4)

    -XX:PermSize

    设置持久代(perm gen)初始值

    物理内存的1/64

    -XX:MaxPermSize

    设置持久代最大值

    物理内存的1/4

    -Xss

    每个线程的堆栈大小

    JDK5.0以后每个线程堆栈大小为1M,以前每个线程堆栈大小为256K.更具应用的线程所需内存大小进行 调整.在相同物理内存下,减小这个值能生成更多的线程.但是操作系统对一个进程内的线程数还是有限制的,不能无限生成,经验值在3000~5000左右

    一般小的应用, 如果栈不是很深, 应该是128k够用的 大的应用建议使用256k。这个选项对性能影响比较大,需要严格的测试。(校长)

    和threadstacksize选项解释很类似,官方文档似乎没有解释,在论坛中有这样一句话:"”

    -Xss is translated in a VM flag named ThreadStackSize”

    一般设置这个值就可以了。

    -XX:ThreadStackSize

    Thread Stack Size

    (0 means use default stack size) [Sparc: 512; Solaris x86: 320 (was 256 prior in 5.0 and earlier); Sparc 64 bit: 1024; Linux amd64: 1024 (was 0 in 5.0 and earlier); all others 0.]

    -XX:NewRatio

    年轻代(包括Eden和两个Survivor区)与年老代的比值(除去持久代)

    -XX:NewRatio=4表示年轻代与年老代所占比值为1:4,年轻代占整个堆栈的1/5

    Xms=Xmx并且设置了Xmn的情况下,该参数不需要进行设置。

    -XX:SurvivorRatio

    Eden区与Survivor区的大小比值

    设置为8,则两个Survivor区与一个Eden区的比值为2:8,一个Survivor区占整个年轻代的1/10

    -XX:LargePageSizeInBytes

    内存页的大小不可设置过大, 会影响Perm的大小

    =128m

    -XX:+UseFastAccessorMethods

    原始类型的快速优化

    -XX:+DisableExplicitGC

    关闭System.gc()

    这个参数需要严格的测试

    -XX:MaxTenuringThreshold

    垃圾最大年龄

    如果设置为0的话,则年轻代对象不经过Survivor区,直接进入年老代. 对于年老代比较多的应用,可以提高效率.如果将此值设置为一个较大值,则年轻代对象会在Survivor区进行多次复制,这样可以增加对象再年轻代的存活 时间,增加在年轻代即被回收的概率

    该参数只有在串行GC时才有效.

    -XX:+AggressiveOpts

    加快编译

    -XX:+UseBiasedLocking

    锁机制的性能改善

    -Xnoclassgc

    禁用垃圾回收

    -XX:SoftRefLRUPolicyMSPerMB

    每兆堆空闲空间中SoftReference的存活时间

    1s

    softly reachable objects will remain alive for some amount of time after the last time they were referenced. The default value is one second of lifetime per free megabyte in the heap

    -XX:PretenureSizeThreshold

    对象超过多大是直接在旧生代分配

    0

    单位字节 新生代采用Parallel Scavenge GC时无效

    另一种直接在旧生代分配的情况是大的数组对象,且数组中无外部引用对象.

    -XX:TLABWasteTargetPercent

    TLAB占eden区的百分比

    1%

    -XX:+CollectGen0First

    FullGC时是否先YGC

    false

    GC性能方面的考虑

    对于GC的性能主要有2个方面的指标:吞吐量throughput(工作时间不算gc的时间占总的时间比)和暂停pause(gc发生时app对外显示的无法响应)。

    1. Total Heap

    默认情况下,vm会增加/减少heap大小以维持free space在整个vm中占的比例,这个比例由MinHeapFreeRatio和MaxHeapFreeRatio指定。

    一般而言,server端的app会有以下规则:

    对vm分配尽可能多的memory;

    将Xms和Xmx设为一样的值。如果虚拟机启动时设置使用的内存比较小,这个时候又需要初始化很多对象,虚拟机就必须重复地增加内存。

    处理器核数增加,内存也跟着增大。

    2. The Young Generation

    另外一个对于app流畅性运行影响的因素是young generation的大小。young generation越大,minor collection越少;但是在固定heap size情况下,更大的young generation就意味着小的tenured generation,就意味着更多的major collection(major collection会引发minor collection)。

    NewRatio反映的是young和tenured generation的大小比例。NewSize和MaxNewSize反映的是young generation大小的下限和上限,将这两个值设为一样就固定了young generation的大小(同Xms和Xmx设为一样)。

    如果希望,SurvivorRatio也可以优化survivor的大小,不过这对于性能的影响不是很大。SurvivorRatio是eden和survior大小比例。

    一般而言,server端的app会有以下规则:

    首先决定能分配给vm的最大的heap size,然后设定最佳的young generation的大小;

    如果heap size固定后,增加young generation的大小意味着减小tenured generation大小。让tenured generation在任何时候够大,能够容纳所有live的data(留10%-20%的空余)。

    经验&&规则

    年轻代大小选择

    响应时间优先的应用:尽可能设大,直到接近系统的最低响应时间限制(根据实际情况选择).在此种情况下,年轻代收集发生的频率也是最小的.同时,减少到达年老代的对象.

    吞吐量优先的应用:尽可能的设置大,可能到达Gbit的程度.因为对响应时间没有要求,垃圾收集可以并行进行,一般适合8CPU以上的应用.

    避免设置过小.当新生代设置过小时会导致:1.YGC次数更加频繁 2.可能导致YGC对象直接进入旧生代,如果此时旧生代满了,会触发FGC.

    年老代大小选择

    响应时间优先的应用:年老代使用并发收集器,所以其大小需要小心设置,一般要考虑并发会话率和会话持续时间等一些参数.如果堆设置小了,可以会造成内存碎 片,高回收频率以及应用暂停而使用传统的标记清除方式;如果堆大了,则需要较长的收集时间.最优化的方案,一般需要参考以下数据获得:

    并发垃圾收集信息、持久代并发收集次数、传统GC信息、花在年轻代和年老代回收上的时间比例。

    吞吐量优先的应用:一般吞吐量优先的应用都有一个很大的年轻代和一个较小的年老代.原因是,这样可以尽可能回收掉大部分短期对象,减少中期的对象,而年老代尽存放长期存活对象.

    较小堆引起的碎片问题

    因为年老代的并发收集器使用标记,清除算法,所以不会对堆进行压缩.当收集器回收时,他会把相邻的空间进行合并,这样可以分配给较大的对象.但是,当堆空间较小时,运行一段时间以后,就会出现"碎片",如果并发收集器找不到足够的空间,那么并发收集器将会停止,然后使用传统的标记,清除方式进行回收.如果出现"碎片",可能需要进行如下配置:

    -XX:+UseCMSCompactAtFullCollection:使用并发收集器时,开启对年老代的压缩.

    -XX:CMSFullGCsBeforeCompaction=0:上面配置开启的情况下,这里设置多少次Full GC后,对年老代进行压缩

    用64位操作系统,Linux下64位的jdk比32位jdk要慢一些,但是吃得内存更多,吞吐量更大

    XMX和XMS设置一样大,MaxPermSize和MinPermSize设置一样大,这样可以减轻伸缩堆大小带来的压力

    使用CMS的好处是用尽量少的新生代,经验值是128M-256M, 然后老生代利用CMS并行收集, 这样能保证系统低延迟的吞吐效率。 实际上cms的收集停顿时间非常的短,2G的内存, 大约20-80ms的应用程序停顿时间

    系统停顿的时候可能是GC的问题也可能是程序的问题,多用jmap和jstack查看,或者killall -3 java,然后查看java控制台日志,能看出很多问题。(相关工具的使用方法将在后面的blog中介绍)

    仔细了解自己的应用,如果用了缓存,那么年老代应该大一些,缓存的HashMap不应该无限制长,建议采用LRU算法的Map做缓存,LRUMap的最大长度也要根据实际情况设定。

    采用并发回收时,年轻代小一点,年老代要大,因为年老大用的是并发回收,即使时间长点也不会影响其他程序继续运行,网站不会停顿

    JVM参数的设置(特别是 –Xmx –Xms –Xmn -XX:SurvivorRatio  -XX:MaxTenuringThreshold等参数的设置没有一个固定的公式,需要根据PV old区实际数据 YGC次数等多方面来衡量。为了避免promotion faild可能会导致xmn设置偏小,也意味着YGC的次数会增多,处理并发访问的能力下降等问题。每个参数的调整都需要经过详细的性能测试,才能找到特定应用的最佳配置。

    java.lang.StackOverflowError:(很少)

    java.lang.OutOfMemoryError:heap space(比较常见)

    java.lang.OutOfMemoryError: PermGen space (经常出现)

    java.lang.OutOfMemoryError: PermGen space 这个异常比较常见,是说JVM里的Perm内存区的异常溢出,由于JVM在默认的情况下,Perm默认为64M,而很多程序需要大量的Perm区内存,尤其使用到像spring等框架的时候,由于需要使用到动态生成类,而这些类不能被GC自动释放,所以导致OutOfMemoryError: PermGen space异常。解决方法很简单,增大JVM的 -XX:MaxPermSize 启动参数,就可以解决这个问题

    java.lang.OutOfMemoryError:heap space或 其它OutOfMemoryError,这个异常实际上跟上面的异常是一个异常,但解决方法不同,所以分开来写。上面那个异常是因为JVM的perm区内存区分少了引起的(JVM的内存区分为 young,old,perm三种)。而这个异常是因为JVM堆内存或者说总体分少了。解决方法是更改 -Xms -Xmx 启动参数,通常是扩大1倍。xms是管理启动时最小内存量的,xmx是管里JVM最大的内存量的

    在单线程操作中,无论是栈深度无限增加,还是栈帧(每个方法调用执行时都会在栈中创建一个栈帧,用来存储局部变量,操作数栈,动态链表,方法出口等信息)占的空间太大,都出现的是StackOverflowError

    展开全文
  • docker容器jvm参数设置测试

    千次阅读 2021-06-26 15:39:32
    1.当容器中jvm的内存大于容器限定内存时,容器将会被杀死,jdk8191后提供两个参数用于限制容器中jvm的大小: -XX:+UseContainerSupport 默认是开启的 -XX:MaxRAMPercentage=80.0 默认百分之25 所以在启动容器时只需...

    1.当容器中jvm的内存大于容器限定内存时,容器将会被杀死,jdk8191后提供两个参数用于限制容器中jvm的大小:
    -XX:+UseContainerSupport 默认是开启的
    -XX:MaxRAMPercentage=80.0 默认百分之25
    所以在启动容器时只需指定-XX:MaxRAMPercentage=80.0即课,必须double型
    2.测试:

    docker run -m 200m --rm  openjdk:8-jre-alpine java  -XshowSettings:vm  -version
    

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    经测试,若容器限制在250m之前,该百分比无效,系统会自动分配,百分之五十,具体分配算法未细致研究
    当关闭容器感知时,以系统内存进行分配,此时百分比依然有效

    docker run -m 1000m --rm  openjdk:8-jre-alpine java  -XX:-UseContainerSupport -XX:MaxRAMPercentage=20.0  -XshowSettings:vm  -version
    

    在这里插入图片描述

    当显示指定jvm堆大小时,百分比失效,以显示指定为主,此种方式如果容器和jvm堆内存设置不对会导致容器启动失败,推荐百分比设置方式

    docker run -m 500m --rm  openjdk:8-jre-alpine java -XX:MaxRAMPercentage=80.0   -Xmx450m  -XshowSettings:vm  -version
    

    在这里插入图片描述

    展开全文
  • was JVM参数设置

    千次阅读 2021-01-14 15:27:25
    设置部署完毕以后 访问部署的系统日志提示的错误如下[12-2-22 20:26:12:252 CST] 00000026 ServletWrappe I SRVE0242I: [cas_war] [/cas] [cas]: 初始化成功。[12-2-22 20:26:12:252 CST] 00000026 VirtualHost I ...
  • docker 中 jvm 参数设置的坑

    千次阅读 2020-12-31 10:38:48
    比如jvm 的内存在30g的时候,以为还有内存,不会做gc,然后就被docker 杀死了。这个就是为什么,过一段时间,我们的程序就被kill,但是也不做gc 释放内存。youngc 的时间特别长我们的 eden 大概10个g,...
  • jvmjvm 参数设置查看与设置

    千次阅读 2020-08-30 15:21:05
    我们使用java -X可以看到java的-X系列的参数,Xmx和Xms是相对应的。 一个是memory max(Xmx) 一个是memory start (Xms)。 Xmx代表程序最大可以从操作系统中获取的内存...JVM参数 宿主机 默认情况下,JVM...
  • 是时候升级java11了-03虚拟机Jvm参数设置 是时候升级java11了-04微服务内http2通信之http2 Clear Text(h2c) 是时候升级java11了-05微服务内h2c通信的阻碍和问题解决 前言 紧接前2篇文章,我们今天来聊聊升级 ...
  • tomcat服务器jvm参数设置

    千次阅读 2017-12-13 14:37:00
    方法一:在配置文件中设置Windows下,在文件/bin/catalina.bat,Unix下,在文件/bin/catalina.sh的前面,增加如下设置: JAVA_OPTS=’-Xms【初始化内存大小】 -Xmx【可以使用的最大内存】’ 需要把这个两个参数值...
  • #堆内存最大最小值为4g,新生代内存2g -Xms4g -Xmx4g -Xmn2g #元空间128m,最大320m ...#使用G1垃圾收集器,在低延迟和高吞吐间寻找平衡,可以调整最大停止时间,设置新生代大小来提高吞吐量,让出cpu资源 -XX:+
  • JVM之——生产环境jvm参数设置建议

    千次阅读 2016-12-16 13:13:20
    生产环境下,jvm参数可以设置如下: -server –Xms256m –Xmx2G -XX:MaxPermSize=256m -XX:-UseGCOverheadLimit -XX:+UseParallelOldGC -XX:+UseParallelGC -XX:CompileThreshold=10 -XX:MaxInlineSize=1024 -Djava...
  • IDEA中JVM参数设置

    千次阅读 2021-04-02 10:08:56
    常用配置: ...-Xmx:设置堆内存Heap最大值(运行期间最大内存),超出了这个设置值,就会抛出OutOfMemory异常。 <内存取决于硬件物理内存的大小,建议-Xms与-Xmx都设置为物理内存的1/2> -Xss:设置
  • JVM参数设置 如何调优

    2021-02-28 14:37:27
    在IDE的后台打印GC日志:既然学习JVM,阅读GC日志是处理Java虚拟机内存问题的基础技能,它只是一些人为确定的规则,没有太多技术含量。既然如此,那么在IDE的控制台打印GC日志是必不可少的了。现在就告诉你怎么打印...
  • springboot jar包启动项目,jvm参数设置

    千次阅读 2019-10-08 22:49:28
    spring启动脚本 java -jar -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=128m -Xms1024m -Xmx1024m -Xmn256m -Xss256k -XX:SurvivorRatio=8 -XX:+UseConcMarkSweepGC newframe-...jvm参数的含义 -XX:Metasp...
  • 一,基本的启动参数的位置public class TestJVM {public static void main(String[] args) {long maxM = Runtime.getRuntime().maxMemory();long totalM = Runtime.getRuntime().totalMemory();long usedM = Runtime...
  • tomcat中jvm参数设置

    万次阅读 2015-12-14 09:42:26
    Tomcat的内存溢出本质就是JVM内存溢出,所以在本文开始时,应该先对Java JVM有关内存方面的知识进行详细介绍。一、Java JVM内存介绍JVM管理两种类型的内存,堆和非堆。按照官方的说法:“Java 虚拟机具有一个堆,堆...
  • ## 10秒入门 springboot jar包启动及JVM参数设置 java -Xms512m -Xmx1024m -jar test.jar
  • Java:JVM参数设置

    千次阅读 2014-06-01 22:07:30
    1、Eclipse设置JVM参数 在eclipse.ini中: -startup plugins/org.eclipse.equinox.launcher_1.3.0.v20120522-1813.jar --launcher.library plugins/org.eclipse.equinox.launcher.win32.win32.x86_1.1.200.v20120913...
  • tomcat设置jvm参数

    2022-04-10 16:00:54
    由于启动服务的时候报了错,所以找原因呀,找到了jvm内存这块,上网搜了搜解决了,所以来简单记录一下子~ 默认的java虚拟机的大小比较小,在...二、JVM内存分配设置参数有四个: -XMX JAVA HEAP最大值,默认值为物理
  • JVM参数设置-Xss

    千次阅读 2020-09-20 16:51:51
    -Xss 解释:设置栈内存的大小,设置的栈的大小决定了函数调用的最大深度
  • ②、JVM参数设置时的注意点 ③、简单的GC垃圾回收过程描述 ④、最终JVM参数配置指南 本文为转载文章,原作者:蓝山牧童, 原文地址:jdk1.8——jvm分析与调优 JVM运行时数据区分析 下面将主要分析下 1.7、1.8 两
  • 主要介绍了IDEA设置JVM运行参数的方法步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
  • java设置JVM参数

    2021-02-28 11:37:10
    Arguments-》jvm。如图: 1.确保是当前程序(TestDemo15) 2. 参数: -Xms3M -Xmx5M 即初始给堆3M空间,最大是5M空间 IDEA 编辑栏点击当前项目-》选择Edit Configurations->VM options。如图: ...
  • eclipse设置运行JVM参数

    2022-04-18 08:07:08
    Eclipse设置JVM参数:->Run Configurations ->VM arguments,如下:
  • [JVM]Eclipse JVM参数设置

    千次阅读 2018-05-29 14:26:54
    启动或编译项目内存溢出 或者JAVA HEAP SPACE解决方法和JVM参数设置设置参数:-Xverify:none -Xms512m -Xmx512m -Xmn128m -XX:PermSize=96m -XX:MaxPermSize=96m -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 296,433
精华内容 118,573
关键字:

jvm参数设置

友情链接: New folder.rar