主要是采用AOP的方式控制方法的并发数量,防止频繁的fullgc
没有控制并发前的gc日志,可以看到41分到42分短时间内就6次fullgc
2022-05-24T18:41:30.406+0800: 3.271: [GC (Allocation Failure) [PSYoungGen: 109568K->13290K(122880K)] 109568K->13783K(396288K), 0.0122903 secs] [Times: user=0.00 sys=0.00, real=0.01 secs]
2022-05-24T18:41:30.963+0800: 3.829: [GC (Allocation Failure) [PSYoungGen: 122858K->13281K(122880K)] 123351K->17716K(396288K), 0.0107896 secs] [Times: user=0.09 sys=0.02, real=0.01 secs]
2022-05-24T18:41:31.679+0800: 4.545: [GC (Allocation Failure) [PSYoungGen: 122849K->13300K(122880K)] 127284K->23162K(396288K), 0.0108024 secs] [Times: user=0.02 sys=0.00, real=0.01 secs]
2022-05-24T18:41:32.277+0800: 5.142: [GC (Allocation Failure) [PSYoungGen: 122868K->13283K(122880K)] 132730K->32297K(396288K), 0.0110120 secs] [Times: user=0.13 sys=0.00, real=0.01 secs]
2022-05-24T18:41:47.849+0800: 20.715: [GC (Allocation Failure) [PSYoungGen: 122851K->13281K(122880K)] 141865K->51704K(396288K), 0.0177010 secs] [Times: user=0.09 sys=0.02, real=0.02 secs]
2022-05-24T18:41:51.021+0800: 23.887: [GC (Allocation Failure) [PSYoungGen: 122849K->13306K(122880K)] 161272K->76291K(396288K), 0.0206812 secs] [Times: user=0.13 sys=0.00, real=0.02 secs]
2022-05-24T18:41:51.220+0800: 24.086: [GC (Allocation Failure) [PSYoungGen: 122874K->13293K(122880K)] 185859K->130195K(396288K), 0.0271210 secs] [Times: user=0.13 sys=0.00, real=0.03 secs]
2022-05-24T18:41:54.280+0800: 27.146: [GC (Allocation Failure) [PSYoungGen: 122861K->13292K(122880K)] 239763K->181071K(396288K), 0.0274046 secs] [Times: user=0.08 sys=0.03, real=0.03 secs]
2022-05-24T18:41:57.350+0800: 30.215: [GC (Allocation Failure) [PSYoungGen: 122860K->13290K(122880K)] 290639K->225370K(396288K), 0.0208794 secs] [Times: user=0.08 sys=0.05, real=0.02 secs]
2022-05-24T18:41:57.371+0800: 30.236: [Full GC (Ergonomics) [PSYoungGen: 13290K->0K(122880K)] [ParOldGen: 212079K->77152K(273408K)] 225370K->77152K(396288K), [Metaspace: 47561K->47200K(1093632K)], 0.1791549 secs] [Times: user=0.81 sys=0.00, real=0.18 secs]
2022-05-24T18:42:00.573+0800: 33.439: [GC (Allocation Failure) [PSYoungGen: 109531K->13281K(122880K)] 186684K->128497K(396288K), 0.0203833 secs] [Times: user=0.22 sys=0.00, real=0.02 secs]
2022-05-24T18:42:03.396+0800: 36.263: [GC (Allocation Failure) [PSYoungGen: 122842K->13304K(122880K)] 238059K->171402K(396288K), 0.0187550 secs] [Times: user=0.13 sys=0.00, real=0.02 secs]
2022-05-24T18:42:06.450+0800: 39.316: [GC (Allocation Failure) [PSYoungGen: 122872K->13308K(122880K)] 280970K->211100K(396288K), 0.0189560 secs] [Times: user=0.23 sys=0.00, real=0.02 secs]
2022-05-24T18:42:09.482+0800: 42.348: [GC (Allocation Failure) [PSYoungGen: 122876K->13308K(122880K)] 320668K->250966K(396288K), 0.0222119 secs] [Times: user=0.23 sys=0.02, real=0.02 secs]
2022-05-24T18:42:09.504+0800: 42.370: [Full GC (Ergonomics) [PSYoungGen: 13308K->0K(122880K)] [ParOldGen: 237657K->82201K(273408K)] 250966K->82201K(396288K), [Metaspace: 47202K->47202K(1093632K)], 0.1183514 secs] [Times: user=0.50 sys=0.00, real=0.12 secs]
2022-05-24T18:42:12.481+0800: 45.347: [GC (Allocation Failure) [PSYoungGen: 109456K->13286K(122880K)] 191658K->136057K(396288K), 0.0182786 secs] [Times: user=0.25 sys=0.00, real=0.02 secs]
2022-05-24T18:42:15.525+0800: 48.391: [GC (Allocation Failure) [PSYoungGen: 122854K->13308K(122880K)] 245625K->176298K(396288K), 0.0181934 secs] [Times: user=0.13 sys=0.00, real=0.02 secs]
2022-05-24T18:42:18.565+0800: 51.431: [GC (Allocation Failure) [PSYoungGen: 122876K->13299K(122880K)] 285866K->214721K(396288K), 0.0219468 secs] [Times: user=0.13 sys=0.00, real=0.02 secs]
2022-05-24T18:42:21.550+0800: 54.416: [GC (Allocation Failure) [PSYoungGen: 122865K->13304K(122880K)] 324287K->258323K(396288K), 0.0196709 secs] [Times: user=0.13 sys=0.00, real=0.02 secs]
2022-05-24T18:42:21.570+0800: 54.436: [Full GC (Ergonomics) [PSYoungGen: 13304K->0K(122880K)] [ParOldGen: 245019K->79325K(273408K)] 258323K->79325K(396288K), [Metaspace: 47284K->47284K(1093632K)], 0.1572274 secs] [Times: user=0.81 sys=0.00, real=0.16 secs]
2022-05-24T18:42:24.763+0800: 57.629: [GC (Allocation Failure) [PSYoungGen: 109568K->13291K(122880K)] 188893K->129842K(396288K), 0.0196051 secs] [Times: user=0.22 sys=0.00, real=0.02 secs]
2022-05-24T18:42:27.775+0800: 60.642: [GC (Allocation Failure) [PSYoungGen: 122831K->13295K(122880K)] 239382K->170432K(396288K), 0.0288579 secs] [Times: user=0.25 sys=0.00, real=0.03 secs]
2022-05-24T18:42:30.703+0800: 63.569: [GC (Allocation Failure) [PSYoungGen: 122743K->13308K(122880K)] 279879K->213030K(396288K), 0.0188593 secs] [Times: user=0.11 sys=0.00, real=0.02 secs]
2022-05-24T18:42:33.731+0800: 66.597: [GC (Allocation Failure) [PSYoungGen: 122876K->13304K(122880K)] 322598K->252712K(396288K), 0.0182215 secs] [Times: user=0.24 sys=0.02, real=0.02 secs]
2022-05-24T18:42:33.749+0800: 66.615: [Full GC (Ergonomics) [PSYoungGen: 13304K->0K(122880K)] [ParOldGen: 239407K->78210K(273408K)] 252712K->78210K(396288K), [Metaspace: 47297K->47297K(1093632K)], 0.1277893 secs] [Times: user=0.55 sys=0.00, real=0.13 secs]
2022-05-24T18:42:36.756+0800: 69.621: [GC (Allocation Failure) [PSYoungGen: 109501K->13299K(122880K)] 187712K->129811K(396288K), 0.0174075 secs] [Times: user=0.13 sys=0.00, real=0.02 secs]
2022-05-24T18:42:39.783+0800: 72.649: [GC (Allocation Failure) [PSYoungGen: 122682K->13304K(122880K)] 239193K->170102K(396288K), 0.0195140 secs] [Times: user=0.11 sys=0.00, real=0.02 secs]
2022-05-24T18:42:42.819+0800: 75.685: [GC (Allocation Failure) [PSYoungGen: 122872K->13304K(122880K)] 279670K->208175K(396288K), 0.0177271 secs] [Times: user=0.13 sys=0.00, real=0.02 secs]
2022-05-24T18:42:45.827+0800: 78.693: [GC (Allocation Failure) [PSYoungGen: 122855K->13304K(122880K)] 317726K->247553K(396288K), 0.0184142 secs] [Times: user=0.13 sys=0.00, real=0.02 secs]
2022-05-24T18:42:45.846+0800: 78.711: [Full GC (Ergonomics) [PSYoungGen: 13304K->0K(122880K)] [ParOldGen: 234249K->79053K(273408K)] 247553K->79053K(396288K), [Metaspace: 47297K->47297K(1093632K)], 0.1570252 secs] [Times: user=0.70 sys=0.00, real=0.16 secs]
2022-05-24T18:42:49.024+0800: 81.890: [GC (Allocation Failure) [PSYoungGen: 109568K->13299K(122880K)] 188621K->131342K(396288K), 0.0185288 secs] [Times: user=0.13 sys=0.00, real=0.02 secs]
2022-05-24T18:42:51.899+0800: 84.765: [GC (Allocation Failure) [PSYoungGen: 122709K->13308K(122880K)] 240751K->173910K(396288K), 0.0209237 secs] [Times: user=0.13 sys=0.02, real=0.02 secs]
2022-05-24T18:42:54.943+0800: 87.809: [GC (Allocation Failure) [PSYoungGen: 122866K->13285K(122880K)] 283468K->215479K(396288K), 0.0309276 secs] [Times: user=0.24 sys=0.00, real=0.03 secs]
2022-05-24T18:42:58.005+0800: 90.871: [GC (Allocation Failure) [PSYoungGen: 122853K->13309K(122880K)] 325047K->255072K(396288K), 0.0278661 secs] [Times: user=0.25 sys=0.00, real=0.03 secs]
2022-05-24T18:42:58.034+0800: 90.899: [Full GC (Ergonomics) [PSYoungGen: 13309K->0K(122880K)] [ParOldGen: 241763K->75513K(273408K)] 255072K->75513K(396288K), [Metaspace: 47297K->47297K(1093632K)], 0.1385806 secs] [Times: user=0.47 sys=0.00, real=0.14 secs]
控制方法的并发后45分到50分一次fullgc也没有出现
2022-05-24T18:45:44.214+0800: 3.463: [GC (Allocation Failure) [PSYoungGen: 109568K->13292K(122880K)] 109568K->13824K(396288K), 0.0109543 secs] [Times: user=0.09 sys=0.00, real=0.01 secs]
2022-05-24T18:45:44.777+0800: 4.026: [GC (Allocation Failure) [PSYoungGen: 122860K->13287K(122880K)] 123392K->17728K(396288K), 0.0112472 secs] [Times: user=0.11 sys=0.00, real=0.01 secs]
2022-05-24T18:45:45.497+0800: 4.746: [GC (Allocation Failure) [PSYoungGen: 122855K->13298K(122880K)] 127296K->23948K(396288K), 0.0117427 secs] [Times: user=0.13 sys=0.00, real=0.01 secs]
2022-05-24T18:45:46.083+0800: 5.332: [GC (Allocation Failure) [PSYoungGen: 122866K->13280K(122880K)] 133516K->31624K(396288K), 0.0118475 secs] [Times: user=0.01 sys=0.00, real=0.01 secs]
2022-05-24T18:45:46.628+0800: 5.877: [GC (Allocation Failure) [PSYoungGen: 122848K->13304K(122880K)] 141192K->40919K(396288K), 0.0123222 secs] [Times: user=0.02 sys=0.00, real=0.01 secs]
2022-05-24T18:45:53.196+0800: 12.445: [GC (Allocation Failure) [PSYoungGen: 122872K->13311K(122880K)] 150487K->53602K(396288K), 0.0316788 secs] [Times: user=0.17 sys=0.01, real=0.03 secs]
2022-05-24T18:46:08.442+0800: 27.691: [GC (Allocation Failure) [PSYoungGen: 122879K->13286K(122880K)] 163170K->61857K(396288K), 0.0252515 secs] [Times: user=0.06 sys=0.00, real=0.03 secs]
2022-05-24T18:46:23.677+0800: 42.926: [GC (Allocation Failure) [PSYoungGen: 122782K->13300K(122880K)] 171353K->69076K(396288K), 0.0087848 secs] [Times: user=0.00 sys=0.00, real=0.01 secs]
2022-05-24T18:46:41.225+0800: 60.474: [GC (Allocation Failure) [PSYoungGen: 122868K->11539K(122880K)] 178644K->73292K(396288K), 0.0130072 secs] [Times: user=0.09 sys=0.00, real=0.01 secs]
2022-05-24T18:46:57.195+0800: 76.444: [GC (Allocation Failure) [PSYoungGen: 121107K->7860K(122880K)] 182860K->71956K(396288K), 0.0052002 secs] [Times: user=0.00 sys=0.00, real=0.01 secs]
2022-05-24T18:47:15.429+0800: 94.677: [GC (Allocation Failure) [PSYoungGen: 117428K->6941K(122880K)] 181524K->71405K(396288K), 0.0038666 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
2022-05-24T18:47:30.622+0800: 109.871: [GC (Allocation Failure) [PSYoungGen: 116509K->8514K(122880K)] 180973K->73050K(396288K), 0.0040599 secs] [Times: user=0.11 sys=0.00, real=0.01 secs]
2022-05-24T18:47:48.845+0800: 128.094: [GC (Allocation Failure) [PSYoungGen: 118054K->9395K(122880K)] 182590K->74003K(396288K), 0.0047540 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
2022-05-24T18:48:04.071+0800: 143.320: [GC (Allocation Failure) [PSYoungGen: 118943K->10369K(122880K)] 183551K->75049K(396288K), 0.0054549 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
2022-05-24T18:48:22.276+0800: 161.526: [GC (Allocation Failure) [PSYoungGen: 119937K->7036K(122880K)] 184617K->71788K(396288K), 0.0033902 secs] [Times: user=0.01 sys=0.00, real=0.00 secs]
2022-05-24T18:48:40.542+0800: 179.790: [GC (Allocation Failure) [PSYoungGen: 116604K->8101K(122880K)] 181356K->72909K(396288K), 0.0044560 secs] [Times: user=0.02 sys=0.00, real=0.00 secs]
2022-05-24T18:48:55.799+0800: 195.048: [GC (Allocation Failure) [PSYoungGen: 117644K->9985K(122880K)] 182452K->74865K(396288K), 0.0068082 secs] [Times: user=0.00 sys=0.00, real=0.01 secs]
2022-05-24T18:49:14.061+0800: 213.310: [GC (Allocation Failure) [PSYoungGen: 119553K->5669K(122880K)] 184433K->70613K(396288K), 0.0032307 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
2022-05-24T18:49:32.118+0800: 231.367: [GC (Allocation Failure) [PSYoungGen: 115121K->9047K(122880K)] 180065K->74079K(396288K), 0.0060365 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
2022-05-24T18:49:47.529+0800: 246.778: [GC (Allocation Failure) [PSYoungGen: 118596K->9152K(122880K)] 183628K->74256K(396288K), 0.0040944 secs] [Times: user=0.09 sys=0.02, real=0.00 secs]
2022-05-24T18:50:05.743+0800: 264.992: [GC (Allocation Failure) [PSYoungGen: 118720K->7022K(122880K)] 183824K->72214K(396288K), 0.0090756 secs] [Times: user=0.13 sys=0.00, real=0.01 secs]
aop代码如下
@Aspect
@Component
public class ConcurrentAspect {
Logger logger = LoggerFactory.getLogger(WebLogAspect.class);
private static Properties properties;
private static Map<String,Semaphore> classMap;
static {
properties= new Properties();
classMap = new HashMap<>();
InputStream inputStream = WebLogAspect.class.getClassLoader().getResourceAsStream("concurrentSettings.properties");
try {
properties.load(inputStream);
String list = properties.getProperty("list");
String[] split = list.split(">");
for (String s : split) {
String className = s.substring(0,s.lastIndexOf(":"));
String concurrentNum = s.substring(s.lastIndexOf(":")+1);
int var1=concurrentNum.indexOf("[")+1;
int var2=concurrentNum.indexOf("]");
concurrentNum=concurrentNum.substring(var1,var2);
//为每个方法添加并发数量
classMap.put(className,new Semaphore(Integer.valueOf(concurrentNum),true));
}
System.out.println(classMap);
} catch (IOException e) {
e.printStackTrace();
}
}
//改自己的包即可
@Pointcut("execution(* com.yujie.controller..*(..)) ")
public void b(){
}
@Around(value = "b()")
public Object concurrentSettings(ProceedingJoinPoint point) throws Throwable {
//获取包名类名 方法名
String className=point.getSignature().getDeclaringTypeName()+"."+ point.getSignature().getName();
String info = getClassAndMothodType(className,((MethodSignature) point.getSignature()).getParameterTypes());
Object proceed=null;
if(classMap.containsKey(info)){
Semaphore semaphore = classMap.get(info);
try{
//请求一个信号
semaphore.acquire();
proceed = point.proceed();
//释放一个信号
semaphore.release();
}catch (Exception e){
e.printStackTrace();
}
}else{
//执行不受并发限制的方法
proceed = point.proceed();
}
return proceed;
}
/**
* [权路径类名.方法]:[参数类型,int,long,java.lang.Integer,com.yujie.model]
*
*/
public static String getClassAndMothodType(String className,Class[] parameterTypes) {
StringBuilder sb = new StringBuilder();
if(null != className) {
sb.append("[").append(className).append("]:[");
}
for (Class parameterType : parameterTypes) {
sb.append(parameterType.getName()+",");
}
String s = sb.toString();
String newString=null;
if(s.lastIndexOf(",") != -1){
newString = s.substring(0, s.lastIndexOf(","))+"]";
}else{
newString=s+"]";
}
sb=new StringBuilder(newString);
return sb.toString();
}
}
concurrentSettings.properties配置文件,在配置文件中指定方法就可以达到控制并发的功能
#[类名.方法名]:[参数类型,参数类型]:[并发数量]
list=[com.yujie.controller.UserController.hello]:[]:[8]\
>[com.yujie.controller.UserController.hello2]:[int,java.lang.String,com.yujie.model.User]:[8]\
>[com.yujie.controller.UserController.hello3]:[]:[12]