当前位置: 首页 > news >正文

可做商业用途的图片网站深圳网站建设外包公司哪家好

可做商业用途的图片网站,深圳网站建设外包公司哪家好,简网站建设流程步骤,全景网站是怎么做的一、问题起源 在处理一次生产环境cpu拉满问题时#xff0c;把日志拉下来看发现很多http请求调用出错#xff0c;项目使用的是okhttp 3.8.1版本。 二、问题描述 问题出在okhttp3.Dispatcher.finished(Dispatcher.java:201)代码如下#xff1a; void finished(AsyncCall c…一、问题起源 在处理一次生产环境cpu拉满问题时把日志拉下来看发现很多http请求调用出错项目使用的是okhttp 3.8.1版本。 二、问题描述 问题出在okhttp3.Dispatcher.finished(Dispatcher.java:201)代码如下 void finished(AsyncCall call) {finished(runningAsyncCalls, call, true); } void finished(RealCall call) {finished(runningSyncCalls, call, false); } private T void finished(DequeT calls, T call, boolean promoteCalls) {int runningCallsCount;Runnable idleCallback;synchronized (this) { //201行if (!calls.remove(call)) throw new AssertionError(Call wasnt in-flight!);if (promoteCalls) promoteCalls();runningCallsCount runningCallsCount();idleCallback this.idleCallback;}if (runningCallsCount 0 idleCallback ! null) {idleCallback.run();} }private void promoteCalls() {if (runningAsyncCalls.size() maxRequests) return; // Already running max capacity.if (readyAsyncCalls.isEmpty()) return; // No ready calls to promote.for (IteratorAsyncCall i readyAsyncCalls.iterator(); i.hasNext(); ) {AsyncCall call i.next();if (runningCallsForHost(call) maxRequestsPerHost) {i.remove();runningAsyncCalls.add(call);executorService().execute(call);}if (runningAsyncCalls.size() maxRequests) return; // Reached max capacity.} } 三、分析代码 在OkHttpClient中final Dispatcher dispatcher; 作为成员对象而我们代码中OkHttpClient作为连接池是单例的这里是对dispatcher做synchronized。 追踪代码发现在finished的调用方法中我们方法中使用的是异步AsyncCall而这里synchronized方法中的promoteCalls被置为true。所以会调用promoteCalls()方法 而promoteCalls()方法中会继续调用executorService().execute(call);就是这里问题大了synchronized中执行http请求那上面代码中的超时不就长时间占用锁了怪不得进程blocked了。 关于线程的BLOCKED需要知道 java.lang.Thread.State: BLOCKED等待监视器锁而被阻塞的线程的线程状态当进入 synchronized 块/方法或者在调用 wait()被唤醒/超时之后重新进入 synchronized 块/方法 但是锁被其它线程占有这个时候被操作系统挂起状态为阻塞状态。若是有线程长时间处于 BLOCKED 状态要考虑是否发生了死锁deadlock的情况。blocked的线程不会消耗cpu但频繁的频繁切换线程上下文会导致cpu过高。线程被频繁唤醒,而又由于抢占锁失败频繁地被挂起. 因此也会带来大量的上下文切换, 消耗系统的cpu资源。 四、解决方案 okttp关于这个问题已经有过解答 Dispatcher no longer has quadratic behaviour by iamdanfox · Pull Request #4581 · square/okhttp · GitHub [improvement] okhttp 3.12.0 - 3.13.1, to pick up perf improvements to okhttp3.Dispatcher by iamdanfox · Pull Request #940 · palantir/conjure-java-runtime · GitHub 解决方案就简单多了升级okhttp到3.14.9虽然目前最新稳定版本为4.9.3但是OkHttp 4发布,从Java切换到Kotlin。谨慎一点还是小版本升级吧。 在3.14.9中这部分代码被优化为 private boolean promoteAndExecute() {assert (!Thread.holdsLock(this));ListAsyncCall executableCalls new ArrayList();boolean isRunning;synchronized (this) {for (IteratorAsyncCall i readyAsyncCalls.iterator(); i.hasNext(); ) {AsyncCall asyncCall i.next();if (runningAsyncCalls.size() maxRequests) break; // Max capacity.if (asyncCall.callsPerHost().get() maxRequestsPerHost) continue; // Host max capacity.i.remove();asyncCall.callsPerHost().incrementAndGet();executableCalls.add(asyncCall);runningAsyncCalls.add(asyncCall);}isRunning runningCallsCount() 0;}for (int i 0, size executableCalls.size(); i size; i) {AsyncCall asyncCall executableCalls.get(i);asyncCall.executeOn(executorService());}return isRunning; } 执行HTTP请求被移出了synchronized方法了。
http://www.zqtcl.cn/news/250560/

相关文章:

  • 建立局域网网站怎么做外国网站
  • 绍兴专业网站建设公司网站seo设计
  • 开发网站需要多久建设银行招聘网站
  • 靖江 建设局网站安阳做网站的公司有哪些
  • 网站title在哪里用discuz做的门户网站
  • 郑州定制网站推广工具产品网络舆情管理
  • 个人网站的建设方法和过程七牛云存储代替WordPress
  • 网站应用网站开发android开发工具有哪些
  • 农业信息门户网站建设方案教做糕点的网站
  • 网站上的分享手机网站免费建设平台
  • 有哪个网站专业做漫画素材的wordpress显示问题
  • 网站开发工程师月薪网站网页设计培训机构
  • 专业网站运营备案名称网站名称
  • 盐城市建设局网站企业网站建设流程与方法 论文
  • 青岛信息推广网站营销自己的网站
  • wp博客 婚庆网站模板摄影网页面制作
  • 大型商城网站建设学计算机前端好就业吗
  • 杭州 电子商务网站建设专门做酒店自助餐的网站
  • 如何备份网站数据库网站用户体验模型
  • 网站域名注册流程办公室装修风格
  • a站免费最好看的电影片推荐方正隶变简体可以做网站用么
  • 创同盟做网站找公司做网站需要咨询什么问题
  • 西安行业网站株洲高端网站建设
  • 优化网站流量商城网站建设软件
  • dw属于什么的网页制作工具网络建站优化科技
  • 百度网站首页的设计理念南京高新区规划建设局网站
  • 虚拟机做实验的网站网站以个人名义备案
  • 自定义表单网站网站建设营销型号的区别
  • 有个网站做彩盒的贵阳网站建设托管
  • 网站制作属于什么专业做网站需要什么配置服务器吗