VisualVM 优化接口
最近测试接口的时候发现一个业务执行时间100ms左右的接口,返回时间竟然需要700-1800ms,有点太离谱了用VisualVM看看函数调用链情况。

时间基本全是花费在了日志切面上了,它调用了一个解析ip的http请求。我把ip归属字段内容改成“检查中。。。”,并将解析ip请求转移到原本就是异步的Log Listener中,优化后接口请求返回时间基本在70-100ms左右 应该很多开源项目都有这个问题,我后面打开了公司一个外包的项目,他们是基于一个购买的低代码平台上开发的,竟然也没处理这个问题。
又优化了一下,做了一个Map本地缓存,Map使用的是WeakHashMap,当GC时会清理掉缓存的数据,即不占用内存又能一定程度上缓解网络查询的压力
测试代码与日志
package org.mate.core.common.util;
import cn.hutool.core.thread.ThreadUtil;
import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONObject;
import lombok.extern.slf4j.Slf4j;
import java.util.HashMap;
import java.util.Map;
import java.util.WeakHashMap;
/**
* IP工具类
*
* @author pangu
*/
@Slf4j
public class IPUtil {
private final static boolean ipLocal = false;
private static Map<String, String> ipMap = new WeakHashMap<String, String>();
/**
* 根据ip获取详细地址
*/
public static String getCityInfo(String ip) {
if (ipLocal) {
//待开发
return null;
} else {
try{
return getHttpCityInfo(ip);
}catch (Exception e){
log.warn("whois查询失败: {}", e.getMessage());
return "whois查询失败";
}
}
}
/**
* 根据ip获取详细地址
* 临时使用,待调整
*/
public static String getHttpCityInfo(String ip) {
String city = ipMap.get(ip);
if (city != null) {
return city;
}
String api = String.format("http://whois.pconline.com.cn/ipJson.jsp?ip=%s&json=true", ip);
JSONObject object = JSON.parseObject((String) HttpUtil.getRequest(api, "gbk"));
city = object.getString("addr");
ipMap.put(ip, city);
i++;
System.out.println("x");
return city;
}
static int i = 0;
public static void main(String[] args) {
long startTime = System.currentTimeMillis();
for (int i = 0; i < 100; i++) {
for (int j = 0; j < 10000; j++) {
new String("24324324efwfewfwfwf"+RandomUtil.randomAddress());
}
System.err.println(getCityInfo(new String("220.248.12.158")));
}
System.out.println(i);
System.out.println(System.currentTimeMillis() - startTime);
}
}
测试日志 x 上海市 联通 上海市 联通 上海市 联通 上海市 联通 上海市 联通 上海市 联通 上海市 联通 x 上海市 联通 上海市 联通 上海市 联通 上海市 联通 上海市 联通 上海市 联通 上海市 联通 上海市 联通 上海市 联通 x 上海市 联通 上海市 联通 上海市 联通 上海市 联通 上海市 联通 上海市 联通 上海市 联通 上海市 联通 上海市 联通 上海市 联通 上海市 联通 上海市 联通 上海市 联通 上海市 联通 上海市 联通 上海市 联通 上海市 联通 上海市 联通 上海市 联通 上海市 联通 上海市 联通 x 上海市 联通 上海市 联通 上海市 联通 上海市 联通 上海市 联通 上海市 联通 上海市 联通 上海市 联通 上海市 联通 上海市 联通 上海市 联通 上海市 联通 上海市 联通 上海市 联通 上海市 联通 上海市 联通 上海市 联通 上海市 联通 上海市 联通 上海市 联通 上海市 联通 上海市 联通 上海市 联通 上海市 联通 上海市 联通 上海市 联通 上海市 联通 上海市 联通 上海市 联通 上海市 联通 上海市 联通 上海市 联通 23:37:51.286 [main] ERROR org.mate.core.common.util.HttpUtil - 连接失败 23:37:51.290 [main] WARN org.mate.core.common.util.IPUtil - whois查询失败: null whois查询失败 x 上海市 联通 上海市 联通 上海市 联通 上海市 联通 上海市 联通 上海市 联通 上海市 联通 上海市 联通 上海市 联通 上海市 联通 上海市 联通 上海市 联通 上海市 联通 上海市 联通 上海市 联通 上海市 联通 上海市 联通 上海市 联通 上海市 联通 上海市 联通 上海市 联通 上海市 联通 上海市 联通 上海市 联通 上海市 联通 上海市 联通 上海市 联通 上海市 联通 上海市 联通 上海市 联通 5 3216 GC清理了5次,网络请求5次