Java中如何限制方法访问的并发数

10 篇文章 1 订阅
8 篇文章 0 订阅

主要是采用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]

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值