java-jvm调优(二)

jvm内存调优不能只能看系统级别java进程所占用的内存,这个数值不能准确的反应内存真实占用情况,因为gc过后这个值是不会变化的,因此内存调优的时候要更多地使用jdk提供的内存查看工具,如 JConsole,java visualvm


对jvm内存的系统的调优主要的目的是减少gc的频率和full gc的次数,过多的gc和full gc 是会占用很多系统资源(主要是cpu),影响系统的吞吐量。特别要关注full gc,因为它会对这个堆进行整理,导致full gc 一般由于以下几种情况


旧生代空间不足

调优时尽量让对象在新生代gc时被回收,让对象在新生代多存活一段时间和不要创建过大的对象及数据避免之间在旧生代创建对象


持久代空间不足

增大持久代空间,避免太多静态对象


统计得到的gc后晋升到旧生代的平均大小大于旧生代剩余空间控制好新生代和旧生代的比例


system.gc()被显示调用

垃圾回收不要手动出发,尽量依靠jvm自身的机制


调优手段主要是控制堆内存的各个部分的比例和gc策略来实现,下面来看看各部分比例不良设置会导致什么后果


新生代设置过小

一是 新生代gc次数非常频繁,增大系统消耗;二是 导致大对象直接进入旧生代,占据了旧生代剩余空间,诱发full gc


新生代设置过大

一是新生代设置过大会导致旧生代过小(推不变),从而诱发 full gc,而是 新生代 gc 耗时大幅度增加,一般说来新生代占整个堆1/3比较合适


survivor设置过小

导致对象从eden直接到达旧生代,降低了在新生代的存活时间


survivor 设置过大

导致eden国小,增加gc频率

另外,通过-XX:MaxTenuringThreads=n来控制新生代存活时间,尽量让对象在新生代被回收


由于内存管理和垃圾回收可知新生代和旧生代都有很多种gc策略和组合搭配,选择这些策略对于我们这些开发人员是个难题,jvm提供两种较为简单的gc策略设置方式


吞吐量有优先

jvm以吞吐量为指标,自行选择相应gc策略及控制新生代与旧生代的大小比例,来达到吞吐量指标。这个值可由,-XX:GCTimeRatio=n来设置


暂停时间优先

jvm以暂停时间为指标,自行选择相应的gc策略及控制新生代与旧生代的大小比例,尽量保证每次gc造成的应用停止时间都在制定的数值范围内完成,这个值可由-XX:MaxGCPauseRatio=n来设置



jvm常见配置


推设置


-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数。并行收集线程数。













评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值