对于前端的性能优化涉及到QPS三要素、优化模版、优化大数据处理、优化JVM参数设置
一、QPS三要素
1、多少个线程比较合适?
因为涉及到线程的数量,会导致FULL GC发生
2、响应时间
线程数量=线程执行总时间/瓶颈资源时间*瓶颈资源并行数 在计算对于同一类资源的消耗时间进行合并
QPS=1000/瓶颈资源时间*瓶颈资源并行数
什么是瓶颈资源?
前台系统的特点:动态页面渲染输出、页面非常大、数据来自多个远程服务(uc、sc、IC 等)、除了日志几乎没有对磁盘的读写
影响系统QPS的瓶颈主要是CPU、内存GC hold
二、优化模版
优化大数据处理搜索结果解析char to byte,序列化方式选择thrift、protobuffer 注意尽量使的自己模版空格较少 空格要压缩
规模效益:取决于脚本(判断、循环、比较、赋值)占整个模版的比例
减少模版的大小:
1、压缩模版的空白字符
2、重复数据合并 代码里面涉及到循环,并且里面有静态内容输出均可以采用此方法
3、异步渲染数据,不要进行假异步渲染 将页面中静态并且相对不重要的内容抽取出来,利用专门服务器优势CDN化 和cache化
10%-100%的内容的节省 QPS的提升10%-80%
三、JVM参数的调整
某系统操作系统32位升级到64位,注意的就是原始jvm参数的配置需要将OLD和yong区大小调整一倍,因为root set集合中的指针也扩展字节数,所以指针也占用了一定量的内存
yong区大小至少要大于每次请求内存消耗的100倍,OLD区被挤占的问题
将yong区变大
单次minorgc是否会变长的问题?
因为前台的系统返回的数据一般对象生命周期很短,minor gc会把无用的对象回收掉不会产生赋值的代价,增长的时间只会扫描上产生对象存活时有一点时间的限制,所以对于前台的应用系统适当增加yong区大小是不会产生时间变长。前台系统的数据只有缓存的数据才会存放在OLD区域。
下面是内存区域:
垃圾回收的基本步骤:
数据进入年老代的三个途径:
1、直接进入OLD区域,超过指定size的数据比较少见,一般一下子申请大片缓冲区
2、minorGC触发时。交换分区S0或者S1放不下
缓存数据,因为线程执行周期缓慢(线程数量比较多已经由于某些资源线程被阻塞)导致未释放的对象量太多
3、足够老的数据在交换区拷贝次数超过了上限(XX:MaxTenuringThreshold=15)一般情况会这样但有特例
缓存数据、因为线程执行周期缓慢导致未释放的对象
四、平均单次请求内存消耗计算方法
每个请求占用的内存=Eden/(QPS*minorGC的平均间隔时间(秒)),还有一种简单的计算就是JDK1.6.25版本支持一个API函数