收藏 分享(赏)

JAVA内存优化-毕玄.doc

上传人:精品资料 文档编号:10823927 上传时间:2020-01-12 格式:DOC 页数:15 大小:476.50KB
下载 相关 举报
JAVA内存优化-毕玄.doc_第1页
第1页 / 共15页
JAVA内存优化-毕玄.doc_第2页
第2页 / 共15页
JAVA内存优化-毕玄.doc_第3页
第3页 / 共15页
JAVA内存优化-毕玄.doc_第4页
第4页 / 共15页
JAVA内存优化-毕玄.doc_第5页
第5页 / 共15页
点击查看更多>>
资源描述

1、1、Java 虚拟机运行时的数据区2、常用的内存区域调节参数-Xms:初始堆大小,默认为物理内存的 1/64(输出到日志文件来查看 GC 的状况; 3)jmap heap 可用于查看各个内存空间的大小;5)断代法可用 GC 汇总一、新生代可用 GC1)串行 GC(Serial Copying):client 模式下默认 GC 方式,也可通过-XX:+UseSerialGC 来强制指定;默认情况下 eden、s0、s1的大小通过-XX:SurvivorRatio 来控制,默认为 8,含义 为 eden:s0 的比例,启动后可通过 jmap heap pid来查看。默认情况下,仅在 TLAB 或

2、eden 上分配,只有两种情况下会在老生代分配: 1、需要分配的内存大小超过 eden space 大小; 2、在配置了 PretenureSizeThreshold 的情况下,对象大小大于此值。默认情况下,触发 Minor GC 时:之前 Minor GC 晋级到 old 的平均大小 = eden space 的一半大小,如是就直接在老生代上分配;默认情况下的垃圾回收规则:1、在回收前 PS GC 会先检测之前每次 PS GC 时,晋升到老生代的平均大小是否大于老生代的剩余空间,如大于则直接触发 full GC;2、在回收后,也会按照上面的规则进行检测。默认情况下的新生代对象晋升到老生代的规

3、则:1、经历多次 minor gc 仍存活的对象,可通过以下参数来控制:AlwaysTenure ,默认 false,表示只要 minor GC 时存活,就晋升到老生代;NeverTenure,默认 false,表示永不晋升到老生代;上面两个都没设置的情冴下,如 UseAdaptiveSizePolicy,启动时以 InitialTenuringThreshold 值作为存活次数的阈值,在每次 ps gc 后会动态调整,如不使用 UseAdaptiveSizePolicy,则以MaxTenuringThreshold 为准。2、to space 放不下的,直接放入老生代。在回收后,如 UseA

4、daptiveSizePolicy,PS GC 会根据运行状态动态调整 eden、to 以及 TenuringThreshold 的大小。如果不希望动态调整可设置-XX:-UseAdaptiveSizePolicy。如希望跟踪每次的变化情况,可在启劢参数上增加: PrintAdaptiveSizePolicy。二、老生代可用 GC1、串行 GC(Serial Copying):client 方式下默认 GC 方式,可通过-XX:+UseSerialGC 强制指定。触发机制汇总:1)old gen 空间不足;2)perm gen 空间不足;3)minor gc 时的悲观策略;4)minor GC

5、 后在 eden 上分配内存仍然失败;5)执行 heap dump 时;6)外部调用 System.gc,可通过-XX:+DisableExplicitGC 来禁止。2、并行回收 GC(Parallel Scavenge): server 模式下默认 GC 方式,可通过-XX:+UseParallelGC 强制指定; 并行的线程数为当cpu core= eden space 的一半,如是,则直接在老生代分配;3)如分配仍然失败,且 gc 已超过频率,则抛出 OOM;4)进入基本分配策略失败的模式;5)执行 PS GC,在 eden 上分配;6)执行非最大压缩的 full gc,在 eden 上

6、分配;7)在旧生代上分配;8)执行最大压缩 full gc,在 eden 上分配;9)在旧生代上分配;10)如还失败,回到 2。最悲惨的情况,分配触发多次 PS GC 和多次 Full GC,直到 OOM。完整内存回收策略1)如 gc 所执行的时间超过,直接结束;2)先调用 invoke_nopolicy2.1 先检查是不是要尝试 scavenge;2.1.1 to space 必须为空,如不为空,则返回 false;2.1.2 获取之前所有 minor gc 晋级到 old 的平均大小,并对比目前 eden+from 已使用的大小,取更小的一个值,如老生代剩余空间小于此值,则返回 false

7、,如大于则返回 true;2.2 如不需要尝试 scavenge,则返回 false,否则继续;2.3 多线程扫描活的对象,并基亍 copying 算法回收,回收时相应的晋升对象到旧生代;2.4 如 UseAdaptiveSizePolicy,那么重新计算 to space 和 tenuringThreshold 的值,并调整。3)如 invoke_nopolicy 返回的是 false,或之前所有 minor gc 晋级到老生代的平均大小 旧生代的剩余空间,那么继续下面的步骤,否则结束;4)如 UseParallelOldGC,则执行 PSParallelCompact,如不是 UsePar

8、allelOldGC,则执行 PSMarkSweep。老生代并行 CMS GC:优缺点:1) 大部分时候和应用并发进行,因此只会造成很短的暂停时间;2)浮动垃圾,没办法,所以内存空间要稍微大一点;3)内存碎片,-XX:+UseCMSCompactAtFullCollection 来解决;4) 争抢 CPU,这 GC 方式就这样;5)多次 remark,所以总的 gc 时间会比并行的长;6)内存分配,free list 方式,so 性能稍差,对 minor GC 会有一点影响;7)和应用并发,有可能分配和回收同时,产生竞争,引入了锁,JVM 分配优先。11、TLAB 的解释堆内的对象数据是各个线

9、程所共享的,所以当在堆内创建新的对象时,就需要进行锁操作。锁操作是比较耗时,因此 JVM 为每个线在堆上分配了一块“自留地” TLAB(全称是 Thread Local Allocation Buffer),位于堆内存的新生代,也就是 Eden 区。每个线程在创建新的对象时,会首先尝试在自己的 TLAB 里进行分配,如果成功就返回,失败了再到共享的 Eden 区里去申请空间。在线程自己的TLAB 区域创建对象失败一般有两个原因:一是对象太大,二是自己的 TLAB 区剩余空间不够。通常默认的 TLAB 区域大小是 Eden 区域的 1%,当然也可以手工进行调整,对应的 JVM 参数是-XX:TL

10、ABWasteTargetPercent。 Java 虚拟机性能优化1. 堆大小设置JVM 中最大堆大小有三方面限制:相关操作系统的数据模型(32-bt 还是 64-bit)限制;系统的可用虚拟内存限制;系统的可用物理内存限制。32 位系统下,一般限制在 1.5G2G;64 为操作系统对内存无限制。我在 Windows Server 2003 系统,3.5G 物理内存, JDK5.0 下测试,最大可设置为 1478m。典型设置: o java -Xmx3550m -Xms3550m -Xmn2g -Xss128k-Xmx3550m:设置 JVM 最大可用内存为 3550M。-Xms3550m:

11、设置 JVM 促使内存为 3550m。此值可以设置与 -Xmx 相同,以避免每次垃圾回收完成后 JVM 重新分配内存。-Xmn2g:设置年轻代大小为 2G。整个 JVM 内存大小=年轻代大小 + 年老代大小 + 持久代大小。持久代一般固定大小为 64m,所以增大年轻代后,将会减小年老代大小。此值对系统性能影响较大,Sun 官方推荐配置为整个堆的 3/8。-Xss128k:设置每个线程的堆栈大小。JDK5.0 以后每个线程堆栈大小为 1M,以前每个线程堆栈大小为256K。更具应用的线程所需内存大小进行调整。在相同物理内存下,减小这个值能生成更多的线程。但是操作系统对一个进程内的线程数还是有限制的

12、,不能无限生成,经验值在 30005000 左右。o 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,则两个 Su

13、rvivor 区与一个 Eden 区的比值为 2:4,一个 Survivor 区占整个年轻代的 1/6-XX:MaxPermSize=16m:设置持久代大小为 16m。-XX:MaxTenuringThreshold=0:设置垃圾最大年龄。如果设置为 0 的话,则年轻代对象不经过 Survivor区,直接进入年老代。对于年老代比较多的应用,可以提高效率。如果将此值设置为一个较大值,则年轻代对象会在 Survivor 区进行多次复制,这样可以增加对象再年轻代的存活时间,增加在年轻代即被回收的概论。 2. 回收器选择JVM 给了三种选择:串行收集器、并行收集器、并发收集器,但是串行收集器只适用于小

14、数据量的情况,所以这里的选择主要针对并行收集器和并发收集器。默认情况下,JDK5.0 以前都是使用串行收集器,如果想使用其他收集器需要在启动时加入相应参数。JDK5.0 以后,JVM 会根据当前系统配置进行判断。 1. 吞吐量优先的并行收集器如上文所述,并行收集器主要以到达一定的吞吐量为目标,适用于科学技术和后台处理等。典型配置: java -Xmx3800m -Xms3800m -Xmn2g -Xss128k -XX:+UseParallelGC -XX:ParallelGCThreads=20-XX:+UseParallelGC:选择垃圾收集器为并行收集器。此配置仅对年轻代有效。即上述配置

15、下,年轻代使用并发收集,而年老代仍旧使用串行收集。-XX:ParallelGCThreads=20:配置并行收集器的线程数,即:同时多少个线程一起进行垃圾回收。此值最好配置与处理器数目相等。 java -Xmx3550m -Xms3550m -Xmn2g -Xss128k -XX:+UseParallelGC -XX:ParallelGCThreads=20 -XX:+UseParallelOldGC-XX:+UseParallelOldGC:配置年老代垃圾收集方式为并行收集。JDK6.0 支持对年老代并行收集。 java -Xmx3550m -Xms3550m -Xmn2g -Xss128k

16、 -XX:+UseParallelGC -XX:MaxGCPauseMillis=100-XX:MaxGCPauseMillis=100:设置每次年轻代垃圾回收的最长时间,如果无法满足此时间,JVM 会自动调整年轻代大小,以满足此值。 java -Xmx3550m -Xms3550m -Xmn2g -Xss128k -XX:+UseParallelGC -XX:MaxGCPauseMillis=100 -XX:+UseAdaptiveSizePolicy-XX:+UseAdaptiveSizePolicy:设置此选项后,并行收集器会自动选择年轻代区大小和相应的Survivor 区比例,以达到目

17、标系统规定的最低相应时间或者收集频率等,此值建议使用并行收集器时,一直打开。 2. 响应时间优先的并发收集器如上文所述,并发收集器主要是保证系统的响应时间,减少垃圾收集时的停顿时间。适用于应用服务器、电信领域等。典型配置: java -Xmx3550m -Xms3550m -Xmn2g -Xss128k -XX:ParallelGCThreads=20 -XX:+UseConcMarkSweepGC -XX:+UseParNewGC-XX:+UseConcMarkSweepGC:设置年老代为并发收集。测试中配置这个以后,-XX:NewRatio=4的配置失效了,原因不明。所以,此时年轻代大小最

18、好用-Xmn 设置。-XX:+UseParNewGC:设置年轻代为并行收集。可与 CMS 收集同时使用。 JDK5.0 以上,JVM 会根据系统配置自行设置,所以无需再设置此值。 java -Xmx3550m -Xms3550m -Xmn2g -Xss128k -XX:+UseConcMarkSweepGC -XX:CMSFullGCsBeforeCompaction=5 -XX:+UseCMSCompactAtFullCollection-XX:CMSFullGCsBeforeCompaction:由于并发收集器不对内存空间进行压缩、整理,所以运行一段时间以后会产生“ 碎片” ,使得运行效率

19、降低。此值设置运行多少次 GC 以后对内存空间进行压缩、整理。-XX:+UseCMSCompactAtFullCollection:打开对年老代的压缩。可能会影响性能,但是可以消除碎片 3. 辅助信息JVM 提供了大量命令行参数,打印信息,供调试使用。主要有以下一些: o -XX:+PrintGC输出形式:GC 118250K-113543K(130112K), 0.0094143 secs Full GC 121376K-10414K(130112K), 0.0650971 secs o -XX:+PrintGCDetails输出形式:GC DefNew: 8614K-781K(9088K)

20、, 0.0123035 secs 118250K-113543K(130112K), 0.0124633 secs GC DefNew: 8614K-8614K(9088K), 0.0000665 secsTenured: 112761K-10414K(121024K), 0.0433488 secs 121376K-10414K(130112K), 0.0436268 secs o -XX:+PrintGCTimeStamps -XX:+PrintGC:PrintGCTimeStamps 可与上面两个混合使用输出形式:11.851: GC 98328K-93620K(130112K), 0.

21、0082960 secso -XX:+PrintGCApplicationConcurrentTime:打印每次垃圾回收前,程序未中断的执行时间。可与上面混合使用输出形式:Application time: 0.5291524 secondso -XX:+PrintGCApplicationStoppedTime:打印垃圾回收期间程序暂停的时间。可与上面混合使用输出形式:Total time for which application threads were stopped: 0.0468229 secondso -XX:PrintHeapAtGC:打印 GC 前后的详细堆栈信息输出形式:3

22、4.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, 0x221d00

23、00)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, 0x27

24、3d0000)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 0x

25、1ebd0000, 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 s

26、pace 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

27、 12288K, 46% used 0x2b3d0000, 0x2b972060, 0x2b972200, 0x2bfd0000), 0.0757599 secs o -Xloggc:filename:与上面几个配合使用,把相关日志信息记录到文件以便分析。 4. 常见配置汇总 1. 堆设置 -Xms:初始堆大小 -Xmx:最大堆大小 -XX:NewSize=n:设置年轻代大小 -XX:NewRatio=n:设置年轻代和年老代的比值。如:为 3,表示年轻代与年老代比值为 1:3,年轻代占整个年轻代年老代和的 1/4 -XX:SurvivorRatio=n:年轻代中 Eden 区与两个 Survi

28、vor 区的比值。注意 Survivor 区有两个。如:3,表示 Eden:Survivor=3:2,一个 Survivor 区占整个年轻代的 1/5 -XX:MaxPermSize=n:设置持久代大小 2. 收集器设置 -XX:+UseSerialGC:设置串行收集器 -XX:+UseParallelGC:设置并行收集器 -XX:+UseParalledlOldGC:设置并行年老代收集器 -XX:+UseConcMarkSweepGC:设置并发收集器 3. 垃圾回收统计信息 -XX:+PrintGC -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -Xl

29、oggc:filename 4. 并行收集器设置 -XX:ParallelGCThreads=n:设置并行收集器收集时使用的 CPU 数。并行收集线程数。 -XX:MaxGCPauseMillis=n:设置并行收集最大暂停时间 -XX:GCTimeRatio=n:设置垃圾回收时间占程序运行时间的百分比。公式为 1/(1+n) 5. 并发收集器设置 -XX:+CMSIncrementalMode:设置为增量模式。适用于单 CPU 情况。 -XX:ParallelGCThreads=n:设置并发收集器年轻代收集方式为并行收集时,使用的 CPU 数。并行收集线程数。 四、调优总结1. 年轻代大小选择

30、 o 响应时间优先的应用:尽可能设大,直到接近系统的最低响应时间限制(根据实际情况选择)。在此种情况下,年轻代收集发生的频率也是最小的。同时,减少到达年老代的对象。 o 吞吐量优先的应用:尽可能的设置大,可能到达 Gbit 的程度。因为对响应时间没有要求,垃圾收集可以并行进行,一般适合 8CPU 以上的应用。 2. 年老代大小选择 o 响应时间优先的应用:年老代使用并发收集器,所以其大小需要小心设置,一般要考虑并发会话率和会话持续时间等一些参数。如果堆设置小了,可以会造成内存碎片、高回收频率以及应用暂停而使用传统的标记清除方式;如果堆大了,则需要较长的收集时间。最优化的方案,一般需要参考以下数

31、据获得: 并发垃圾收集信息 持久代并发收集次数 传统 GC 信息 花在年轻代和年老代回收上的时间比例 减少年轻代和年老代花费的时间,一般会提高应用的效率 o 吞吐量优先的应用:一般吞吐量优先的应用都有一个很大的年轻代和一个较小的年老代。原因是,这样可以尽可能回收掉大部分短期对象,减少中期的对象,而年老代尽存放长期存活对象。 3. 较小堆引起的碎片问题因为年老代的并发收集器使用标记、清除算法,所以不会对堆进行压缩。当收集器回收时,他会把相邻的空间进行合并,这样可以分配给较大的对象。但是,当堆空间较小时,运行一段时间以后,就会出现“碎片” ,如果并发收集器找不到足够的空间,那么并发收集器将会停止,

32、然后使用传统的标记、清除方式进行回收。如果出现“碎片” ,可能需要进行如下配置: o -XX:+UseCMSCompactAtFullCollection:使用并发收集器时,开启对年老代的压缩。 o -XX:CMSFullGCsBeforeCompaction=0:上面配置开启的情况下,这里设置多少次 Full GC 后,对年老代进行压缩 转载之:http:/ JDK1.5 引入的新功能 Ergonomic Settings(自动优化的参数)对于有 2 块 CPU 和 2GB 内存及更佳配置的服务器,Sun 的 hotspot jdk 默认设置了如下参数: -server :服务器模式编译 -

33、XX:+UseParallelGC 并行收集 -Xms 设置为服务器物理内存的 1/64 -Xmx 设置为服务器物理内存的 1/4(最大为 1G)我在网上发现了这篇文章,也是根据那篇 PDF 写的,基本都翻译过来了,那我就不再做造轮子的过程了。有些自己的想法会用红色标出。摘自 原文链接 堆大小设置 JVM 中最大堆大小有三方面限制:相关操作系统的数据模型(32-bt 还是 64-bit)限制;系统的可用虚拟内存限制;系统的可用物理内存限制。32 位系统 下,一般限制在 1.5G2G;64 为操作系统对内存无限制。我在 Windows Server 2003 系统,3.5G 物理内存,JDK5.

34、0 下测试,最大可设置为 1478m。 典型设置(例子中的堆分配的都比较大,注意自己平台的限制,下文同): java -Xmx3550m -Xms3550m -Xmn2g -Xss128k-Xmx3550m:设置 JVM 最大可用内存为 3550M。 -Xms3550m:设置 JVM 促使内存为 3550m。此值可以设置与-Xmx 相同,以避免每次垃圾回收完成后 JVM 重新分配内存(就是收缩和扩张,分代回收加上 Sun 内存分配的算法,避免了 IBM JDK 最小堆和最大堆一样上的缺陷,但是这对-Xms 和-Xmx 的设置有了更高的要求,应该是多次试验确定一个合适的大小)。-Xmn2g:设置

35、年轻代大小为 2G。整个堆大小=年轻代大小 + 年老代大小 + 持久代大小。持久代一般固定大小为 64m,所以增大年轻代后,将会减小年老代大小。此值对系统性能影响较大,Sun 官方推荐配置为整个堆的 3/8。从下图,应该可以看到整个堆大小=年轻代大小 + 年老代大小,Xms 和 Xmx 不包括 Perm Size。o -Xss128k: 设置每个线程的堆栈大小。JDK5.0 以后每个线程堆栈大小为 1M,以前每个线程堆栈大小为 256K。更具应用的线程所需内存大小进行调整。在相同物理内 存下,减小这个值能生成更多的线程。但是操作系统对一个进程内的线程数还是有限制的,不能无限生成,经验值在 30

36、005000 左右。o 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 区与一个 E

37、den 区的比值为2:4,一个 Survivor 区占整个年轻代的 1/6-XX:MaxPermSize=16m:设置持久代大小为 16m。-XX:MaxTenuringThreshold=0:设置垃圾最大年龄。如果设置为 0 的话,则年轻代对象不经过 Survivor 区,直接进入年老代。对于年老代比较多的应用,可以提高效率。如果将此值设置为一个较大值,则年轻代对象会在 Survivor 区进行多次复制,这样可以增加对象再年轻代的存活时间,增加在年轻代即被回收的概率。下面要介绍的 CMS(并发)收集器,SurvivorRatio 默认为 1024 MaxTenuringThreshold 默

38、认为 0,可以手动调整,降低年老代的回收压力,即照顾到吞吐率,又关注到相应时间。 回收器选择 JVM 给了三种选择:串行收集器、并行收集器、并发收集器,但是串行收集器只适用于小数据量的情况,所以这里的选择主要针对并行收集器和并发收集器。默认情况下,JDK5.0 以前都是使用串行收集器,如果想使用其他收集器需要在启动时加入相应参数。JDK5.0 以后,JVM 会根据当前系统配置进行判断。 吞吐量优先的并行收集器如上文所述,并行收集器主要以到达一定的吞吐量为目标,适用于科学技术和后台处理等。 典型配置:o java -Xmx3800m -Xms3800m -Xmn2g -Xss128k -XX:+

39、UseParallelGC -XX:ParallelGCThreads=20-XX:+UseParallelGC:选择垃圾收集器为并行收集器。此配置仅对年轻代有效。即上述配置下,年轻代使用并发收集,而年老代仍旧使用串行收集。 -XX:ParallelGCThreads=20:配置并行收集器的线程数,即:同时多少个线程一起进行垃圾回收。此值最好配置与处理器数目相等。应该等于或者小于 cpu 数量(核),否则没有意义,而当服务器的 CPU 数小于等于 2 时,用并发收集和串行收集效率一样。o java -Xmx3550m -Xms3550m -Xmn2g -Xss128k -XX:+UsePara

40、llelGC -XX:ParallelGCThreads=20 -XX:+UseParallelOldGC -XX:+UseParallelOldGC:配置年老代垃圾收集方式为并行收集。JDK6.0 支持对年老代并行收集。o java -Xmx3550m -Xms3550m -Xmn2g -Xss128k -XX:+UseParallelGC -XX:MaxGCPauseMillis=100 -XX:MaxGCPauseMillis=100:设置每次年轻代垃圾回收的最长时间,如果无法满足此时间,JVM 会自动调整年轻代大小,以满足此值。-XX:GCTimeRatio=参数则是设置 GC 时间和

41、运行时间的比值,GC 时间占整个运行时间的 1 / (1 + )。这两个参数PauseMillis 的优先级比 GCTimeRatio 高,且仅对并行收集器有效。但是从“Additionally, as an implicit goal the throughput collector will try to met the other goals in the smallest heap that it can.”觉得 JVM 并非自动调整年轻代,而是整个堆的大小,个人觉得此时应该设置堆大小的一个范围,且不能手动设置-Xmn2g,否则如何调整?可惜文档中未有清晰写明,不过幸运的是一般调整也不

42、必到如此细致的地步。o java -Xmx3550m -Xms3550m -Xmn2g -Xss128k -XX:+UseParallelGC -XX:MaxGCPauseMillis=100 -XX:+UseAdaptiveSizePolicy -XX:+UseAdaptiveSizePolicy:设置此选项后,并行收集器会自动选择年轻代区大小和相应的Survivor 区比例,以达到目标系统规定的最低相应时间或者收集频率等,此值建议使用并行收集器时,一直打开。在 1.5 版本中默认打开 http:/ 中有详细描述。 响应时间优先的并发收集器如上文所述,并发收集器主要是保证系统的响应时间,减少

43、垃圾收集时的停顿时间。适用于应用服务器、电信领域等。 典型配置:o java -Xmx3550m -Xms3550m -Xmn2g -Xss128k -XX:ParallelGCThreads=20 -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:+UseConcMarkSweepGC:设置年老代为并发收集。测试中配置这个以后,-XX:NewRatio=4 的配置失效了,原因不明。所以,此时年轻代大小最好用-Xmn 设置。 -XX:+UseParNewGC:设置年轻代为并行收集。可与 CMS 收集同时使用。JDK5.0 以上,JVM 会根据系统配置自行

44、设置,所以无需再设置此值。o java -Xmx3550m -Xms3550m -Xmn2g -Xss128k -XX:+UseConcMarkSweepGC -XX:CMSFullGCsBeforeCompaction=5 -XX:+UseCMSCompactAtFullCollection-XX:CMSFullGCsBeforeCompaction:由于并发收集器不对内存空间进行压缩、整理,所以运行一段时间以后会产生“碎片”,使得运行效率降低。此值设置运行多少次 GC 以后对内存空间进行压缩、整理。 -XX:+UseCMSCompactAtFullCollection:打开对年老代的压缩。

45、可能会影响性能,但是可以消除碎片 辅助信息 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

46、(9088K), 0.0000665 secsTenured: 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:打印每次垃圾回收前,程序未中断的执行时间。可与上面混合使用输出

47、形式: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

48、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 0x2

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报