JVM 优化经验总结
2018-07-02 14:18:16 0 举报
AI智能生成
JVM优化经验总结
作者其他创作
大纲/内容
将新对象预留在年轻代
Full GC 的成本远远高于 Minor GC,某些情况下尽可能将对象分配在年轻代是明智的选择
内存空间不紧张时JVM会尝试在Eden区分配对象
内存空间紧张时JVM会将部分年轻对象提前向老年代压缩
JVM参数调优时分配一个合理的年轻代空间以避免此情况
让大对象进入年老代
大对象出现在年轻代可能扰乱年轻代GC,破坏年轻代原有对象结构
为了有足够空间容纳大对象,JVM不得不将年轻代中的对象挪到年老代
可能会导致移动大量年轻代的小对象到年老代,对GC不利
短命的大对象是GC的灾难,打乱了GC的基本思路,尽量避免使用
设置对象进入年老代的年龄
年轻代的对象经过N次GC(N=年龄)后,进入年老代
对象在Eden区经理第一次GC后存活的,年龄加1,移动到Survivor取
吞吐量优先
尽可能减少系统执行垃圾回收的总时间
可考虑关注系统吞吐量的并行回收收集器
示例参数:–Xmx3800m –Xms3800m –Xmn2G –Xss128k –XX:+UseParallelGC
–XX:ParallelGC-Threads=20 –XX:+UseParallelOldGC
–XX:ParallelGC-Threads=20 –XX:+UseParallelOldGC
尝试使用大的内存分页
Solaris系统中,JVM可以支持Large Page Size
使用大的内存分页可以增强CPU的内存寻址能力,从而提升性能
过大的内存分页会导致JVM在计算Heap内部分区(perm,new,old)内存占用比例时,出现超出正常值的划分
最坏情况下某个区会多占用一个页的大小
示例:java –Xmx2506m –Xms2506m –Xmn1536m –Xss128k –XX:++UseParallelGC
–XX:ParallelGCThreads=20 –XX:+UseParallelOldGC –XX:+LargePageSizeInBytes=256m
–XX:ParallelGCThreads=20 –XX:+UseParallelOldGC –XX:+LargePageSizeInBytes=256m
使用非占有的垃圾回收器
降低GC时的停顿
首先考虑使用关注系统停顿的CMS回收器
减少Full GC次数
尽可能将对象留在年轻代
年轻代Minor GC的成本远远小于年老代的Full GC
示例:java –Xmx3550m –Xms3550m –Xmn2g –Xss128k –XX:ParallelGCThreads=20
–XX:+UseConcMarkSweepGC –XX:+UseParNewGC –XX:+SurvivorRatio=8 –XX:TargetSurvivorRatio=90
–XX:MaxTenuringThreshold=31
–XX:+UseConcMarkSweepGC –XX:+UseParNewGC –XX:+SurvivorRatio=8 –XX:TargetSurvivorRatio=90
–XX:MaxTenuringThreshold=31
JVM
有自己完善的硬件架构
处理器
堆栈
寄存器
指令系统
屏蔽具体操作系统信息,使得字节码可以在多种平台运行
把字节码解析成机器指令执行
堆内存
稳定的堆
-Xms和-Xmx大小设置一致
减少GC次数
增加每次GC时间
动荡的堆
不需要使用大内存时,压缩堆空间
堆小时GC时间短
可以设置空间最小空闲比例和最大空闲比例来控制堆内存压缩
参数
GC
另一个文件有单独说明
https://www.processon.com/view/5ab21876e4b0a248b0d85dd1
其他
-Xmn2g
设置年轻代大小为2GB
-Xss128k
线程栈大小
小的线程栈可以支持更多的线程
-XX:MaxHeapFreeRatio=70
设置堆最大空闲比例
默认值70
堆空间的空闲内存大于这个数值时,JVM压缩堆空间
-Xms=-Xmx时,本参数无效
-XX:MinHeapFreeRatio=40
设置堆最小空闲比例
默认值40
堆空间的空闲内存小于这个数值时,JVM扩展堆空间
-Xms=-Xmx时,本参数无效
-XX:TargetSurvivorRatio=90
提高from区的利用率
from区90%时,再将对象送入年老戴
-XX:PetenureSizeThreshold=x
设置大对象直接进入年老代的阀值
对象的大小超过这个值时,直接进入年老代
XX:MaxTenuringThreshold=15
设置年轻对象经历N次GC后,进入年老代
默认为15
并不意味着一定是这个年龄才进入年老代,JVM会根据内存实际使用情况动态计算
–XX:+LargePageSizeInBytes=256m
使用大内存分页
此处设置页大小为256M
XX:+HeapDumpOnOutOfMemoryError
让JVM在发生内存溢出时自动的生成堆内存快照
-XX:MaxDirectMemorySize
用于配置直接内存大小 ,如果不设置,默认值为最大堆空间
当直接内存使用量达到设置的值时,就会触发垃圾回收
如果垃圾回收不能有效释放足够空间,仍然会引起OOM
如果堆外内存发生OOM,请检查此参数是否配置过小
1.8参数
-XX:MetaspaceSize
代替-XX:PermSize
在JDK1.8中已经使用元空间代替永久代
-XX:MaxMetaspaceSize
代替-XX:MaxPermSize
在JDK1.8中已经使用元空间代替永久代
0 条评论
下一页