加入收藏 | 设为首页 | 会员中心 | 我要投稿 长春站长网 (https://www.0431zz.com.cn/)- 媒体智能、开发者工具、运维、低代码、办公协同!
当前位置: 首页 > 站长资讯 > 评论 > 正文

GSA:千兆LTE正衔枚疾进

发布时间:2021-01-29 17:01:09 所属栏目:评论 来源:互联网
导读:例如,由于IM系统与服务端会建立长连接,因此用户A发消息给B时,B会被动收到服务器的推送,而非主动拉取数据。 而瘦客户端在收到消息推送后,则会加上一个ACK的消息回复,表示消息已收到。 这样,就可以根据已读比例,对消息进行已读设置。 最新的技术要点,

例如,由于IM系统与服务端会建立长连接,因此用户A发消息给B时,B会被动收到服务器的推送,而非主动拉取数据。

而瘦客户端在收到消息推送后,则会加上一个“ACK”的消息回复,表示消息已收到。

这样,就可以根据已读比例,对消息进行已读设置。

最新的技术要点,测试技术人员在这次总结中,都进行了详细的分析和回顾。

……

而对于前端来说,今年的双11,同样是一场挑战。

这次的双11流量高峰期,由一个变成了两个,期间包括预售、预热等活动,大幅增加了前端的研发工作量。

面对暴增的工作压力,前端的程序员这次将设计稿生成代码(D2C)平台Imgcook,进行了全面升级,用于智能生成代码
 

  • leader从客户端收到一个写请求后生成一个新的事务并为这个事务生成一个唯一的ZXID,
  • leader将将带有 zxid 的消息作为一个提案(proposal)分发给所有 FIFO队列。
  • FIFO队列取出队头proposal给follower节点。
  • 当 follower 接收到 proposal,先将 proposal 写到硬盘,写硬盘成功后再向 leader 回一个 ACK。
  • FIFO队列把ACK返回给Leader。
  • 当leader收到超过一半以上的follower的ack消息,leader会进行commit请求,然后再给FIFO发送commit请求。
  • 当follower收到commit请求时,会判断该事务的ZXID是不是比历史队列中的任何事务的ZXID都小,如果是则提交,如果不是则等待比它更小的事务的commit(保证顺序性)

将quantity=100转化成了quantity - 1 > 0,大大减少了乐观锁的力度,效率得到很大的提升。

JVM中的CAS操作

Java调用new object()会创建一个对象,这个对象会被分配到JVM的堆中。那么这个对象到底是怎么在堆中保存的呢?

首先,new object()执行的时候,这个对象需要多大的空间,其实是已经确定的,因为java中的各种数据类型,占用多大的空间都是固定的。怎么去确定对象大小,可以参考我的这篇文章对象的内存布局,怎样确定对象的大小。那么接下来的工作就是在堆中找出那么一块空间用于存放这个对象。

在单线程的情况下,一般有两种分配策略:

  • 指针碰撞:这种一般适用于内存是绝对规整的(内存是否规整取决于内存回收策略)。用过的内存放在一边,空闲的内内存放在另外一边,之间有一个分界指针,分配空间的工作只是将分界指针向空闲内存一侧移动对象大小的距离即可。
  • 空闲列表:这种适用于内存非规整的情况,这种情况下JVM会维护一个内存列表,记录哪些内存区域是空闲的,大小是多少。给对象分配空间的时候去空闲列表里查询到合适的区域然后进行分配即可。

然而,对象的创建工作是很频繁的,为了保证效率,JVM可以并发地给对象分配内存空间。由于分配内存的时候不是原子性的操作,至少需要以下几步:查找空闲列表、分配内存、修改空闲列表等等,这是不安全的。解决并发时的安全问题也有两种策略:

  • CAS:实际上虚拟机采用CAS配合上失败重试的方式保证更新操作的原子性,原理和上面讲的一样。
  • TLAB:如果使用CAS其实对性能还是会有影响的,所以JVM又提出了一种更高级的优化策略:每个线程在Java堆中预先分配一小块内存,称为本地线程分配缓冲区(TLAB),线程内部需要分配内存时直接在TLAB上分配就行,避免了线程冲突。只有当缓冲区的内存用光需要重新分配内存的时候才会进行CAS操作分配更大的内存空间。 虚拟机是否使用TLAB,可以通过-XX:+/-UseTLAB参数来进行配置(jdk5及以后的版本默认是启用TLAB的)。

(编辑:长春站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读