JVM参数配置

JVM参数设置
 

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

控制参数

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

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

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

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
    数。并行收集线程数。
————————————————
版权声明:本文为CSDN博主「徒步凉城-Jasper」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_37195606/article/details/82805216

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值