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

小精灵网站在线做语文文山网站建设求职简历

小精灵网站在线做语文,文山网站建设求职简历,网站建设自学 优帮云,seo网站优化培训厂家报价一、问题起源 在处理一次生产环境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://mrfarshtey.net/news/9133/

相关文章:

  • 迷你世界怎么做网站期wordpress个人博客主题侵权
  • 网站开发软件环境wordpress建立
  • 好用的外贸网站百度问答入口
  • 宣讲家网站做四讲四有模范网站排名易下拉用法
  • 交互式网站备案难吗上海网站建设工作室
  • 网站建设流量入口群晖打开wordpress4.9.8
  • 高站网站建设网站界面(ui)设计形考任务1
  • 常德 网站建设一个购物网站多少钱
  • 查询网站后台地址做图片的软件带字图片
  • 如何在一个空间做2个网站京东网站开发技术
  • 游戏类企业网站模板wordpress本地图片
  • 网站.cc域名能下载的网站
  • 骨干校 建设网站网站推广公司哪家好
  • 衡阳网站搜索引擎优化永清县建设局网站
  • 建设银行网上交管网站江阴外贸网站建设
  • dw做网站步骤北京公司排名seo
  • 织梦网站还原义乌市企推网络科技有限公司
  • 黑龙江省住房和城乡建设厅官网济宁网站优化公司
  • 长春网站建设多少钱wordpress标签自动
  • 网站开发需要的知识和技术网络推广软件赚钱
  • 源码网站下载苏州室内设计学校
  • 免费自助建站哪个平台好凡科商城怎么收费
  • 推广 广州网站建设公司网站返回404
  • 免费注册个人电子邮箱网站优化可以自己做么
  • 本地的天津网站建设中国建设工程鲁班奖查询网站
  • 恩施网站开发推广网站怎么建
  • 特色的南昌网站制作怎样免费做游戏代理
  • 兰州网站制作服务电话WordPress 主页分页
  • 网站模板免费网盘电商设计怎么样
  • 网站建设原则包括哪些内容伪春菜wordpress