java接口传输数据太多怎么优化,一次接口性能优化实战

背景

系统前期设计不太合理,经常被用户吐槽系统慢,而且预计双十一双十二期间系统的访问量会飙升,所以系统的压测和优化势在必行

本次主要挑选首页的接口来分析

应用配置

2核4G,逻辑CPU40

应用启动2G内存

新生代老年代默认1:2

新生代GC收集器为parNew,老年代为CMS

优化前

压测数据

线程数

平均耗时

总调用次数

异常次数

平均吞吐量

120

1022

19822

8

107.2/S

为什么吞吐量会这么低呢?

通过jvisual发现系统的CPU使用只有3%左右,但是内存在1-2秒的时间内就会达到峰值然后触发GC

为什么GC会如此频繁?

初步猜想应该有大对象占用着,GC一直回收不了

通过 jmap -histo pid 命令查看可知字符类型数组在程序运行的时候占用着几百兆的内存, 为什么会这么大呢?

通过 jstack 查看线程的运行状态发现很多线程都WAITING在打印日志这里了.

通过代码分析, 我们的日志打印的太多了, 我们的日志打印模式是ASYNC异步的.

原来由于异步打印日志,打印的大对象就一直无法被回收掉,打印日志又会写盘,所以才会频繁GC而且吞吐量极低

"http-nio-8000-exec-193" #2041 daemon prio=5 os_prio=0 tid=0x00007fe91c031000 nid=0x120f waiting on condition [0x00007fe9304cc000]

java.lang.Thread.State: WAITING (parking)

at

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值