Java性能调优(三):程序执行和JVM调优

释放双眼,带上耳机,听听看~!

程序执行慢情况分析

有些情况是资源消耗不多,但程序执行仍然慢,这种现象多出现访问量不是非常大的情况下,造成这种原因有三种:

锁竞争激烈

锁竞争激烈直接会造成程序执行慢。例如一个典型的例子是数据库连接池,通常数据库连接池提供的连接数是有限的。

未充分使用硬件资源

可以优化程序,充分发挥硬件资源的座椅哦难过,此时可进行一定的优化充分使用硬件资源,提升程序的执行速度。

数据量的增长

数据量增长通常也是造成程序执行慢的典型原因。

调优

JVM调优

常用的内存管理调优的方法,这些方法都是为了尽量降低GC所导致应用暂停时间。

代大小的调优

minot GC会远快于Full GC,各个代的大小设置直接决定了minor GC 和Full GC 触发的时机,在代大小的调优上,最关键的参数是-Xms -Xmx -Xmn -XX:SurivivorRatio -XX:MaxTenuringThreshold

-Xmn决定了新生代的空间大小,新生代Eden、S0和S1三个区域的比率可以通过-XX :SurvivorRatio来控制。

-XX:MaxTenuringThreshold控制对象经历多少次Minor GC后转入旧生代,通常又将此致值称为新生代存活周期,此参数只有在串行GC时有效,其他GC方式则有SunJDK自行决定。

1.避免新生代的大小设置过小

新生代设置过小,会产生两种比较明显的现象,一是minor GC的次数更加频繁;二是有可能导致minor GC对象直接进入旧生代,此时如进入旧生代的对象占据旧生代剩余空间,则出发FUll GC。

如果调大新生代大小外,如果能够调大JVM Heap的大小,那就更好了,但JVM Heap调大通常意味着单次GC时间的增加。

调整时的原则是在不能调大JVm Heap的情况下,尽可能方法新生代年代空间,尽量让对象在minor GC阶段被回收,但新生代空间也不可过大;在能够调大JM Heap的情况下,可以按照增加的新生代空间大小增加JVM Heap大小,以保证旧生代空间够用。

2.避免新生代设置过大

新生代设置过大会带来两个典型想象,一是旧生代变小了,有可能导致Full GC频繁执行;二是minor GC的耗时大幅增加。

新生代通常不能设置过大,大多数场景都应设置得比旧生代小,通常推荐的比例是新生代占JVM Heap区大小的33%左右。

3.避免Survior区过小或过大

在无法调整JVM Heap以及新生代的大小时,合理调整Survivor区的带下也能带来一些效果。调大SurvivorRatio值意味着Eden区域变大,minor GC的触发次数会降低,但此时Surivor区域空间变小,如有超过Survivor空间大小的对象在minor GC欧仍没有被回收,则会直接进入旧生代;调小SurvivorRatio则意味着Eden区域变小,minorGC的触发次数增加,Survivor区域变大,就意味着可以存储更多在minor GC后存活的对象,避免起进入旧生代。

4.合理设置新生代存活周期

-Xms、-Xmx是用户调整整个JVM Heap区大小,在内存不够用的情况下可适当加大此值,这个值能调整到多大取决于操作系统位数以及CPU能力。

-Xmn适用于调整新生代的大小,新生代的大小决定了多少比例的对象有机会在minor GC阶段被回收,此值对应的也决定旧生代的带下。新生代越大,通常意味着多数对象能够在minor GC阶段被回收掉,但同时意味着旧生代的空间变小,可能造成更频繁的Full GC甚至时OutOfMemoryError。

在清楚掌握minorGC、FullGC的触发时机以及代大小的调整后,结合应用的状况通常就可较好设置代的大小,减少GC所占用的时间。

给TA打赏
共{{data.count}}人
人已打赏
安全技术

用node.js做cluster,监听异常的邮件提醒服务

2021-12-21 16:36:11

安全技术

从零搭建自己的SpringBoot后台框架(二十三)

2022-1-12 12:36:11

个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索