加入收藏 | 设为首页 | 会员中心 | 我要投稿 南通站长网 (https://www.0513zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长资讯 > 评论 > 正文

了解高并发大对象处理

发布时间:2021-04-11 17:16:35 所属栏目:评论 来源:互联网
导读:年浸润在互联网高并发中的同学,在写代码时会有一些约定俗成的规则:宁可将请求拆分成10个1秒的,也不去做一个耗时5秒的请求;宁可将对象拆成1000个10KB的,也尽量避免生成一个1MB的对象。 为什么?这是对于大的恐惧。 大对象,是一个泛化的概念,它可能存放在

年浸润在互联网高并发中的同学,在写代码时会有一些约定俗成的规则:宁可将请求拆分成10个1秒的,也不去做一个耗时5秒的请求;宁可将对象拆成1000个10KB的,也尽量避免生成一个1MB的对象。

为什么?这是对于“大”的恐惧。

“大对象”,是一个泛化的概念,它可能存放在JVM中,也可能正在网络上传输,也可能存在于数据库中。

为什么大对象会影响我们的应用性能呢?有三点原因。

大对象占用的资源多,垃圾回收器要花一部分精力去对它进行回收;

大对象在不同的设备之间交换,会耗费网络流量,以及昂贵的I/O;

对大对象的解析和处理操作是耗时的,对象职责不聚焦,就会承担额外的性能开销。

接下来,xjjdog将从数据的结构纬度和时间维度,来逐步看一下一些把对象变小,把操作聚焦的策略。

1. String的substring方法

我们都知道,String在Java中是不可变的,如果你改动了其中的内容,它就会生成一个新的字符串。我们的借鉴意义是。如果你创建了比较大的对象,并基于这个对象生成了一些其他的信息。这个时候,一定要记得去掉和这个大对象的引用关系。

2. 集合大对象扩容

对象扩容,在Java中是司空见惯的现象。比如StringBuilder、StringBuffer,HashMap,ArrayList等。概括来讲,Java的集合,包括List、Set、Queue、Map等,其中的数据都不可控。在容量不足的时候,都会有扩容操作。

我们先来看下StringBuilder的扩容代码。代码大家可自行查看,也是阻塞性的,扩容策略是原长度的1.5倍。

由于集合在代码中使用的频率非常高,如果你知道具体的数据项上限,那么不妨设置一个合理的初始化大小。比如,HashMap需要1024个元素,需要7次扩容,会影响应用的性能。

但是要注意,像HashMap这种有负载因子的集合(0.75),初始化大小=需要的个数/负载因子+1。如果你不是很清楚底层的结构,那就不妨保持默认。

3. 保持合适的对象粒度

曾经碰到一个并发量非常高的业务系统,需要频繁使用到用户的基本数据。由于用户的基本信息,都是存放在另外一个服务中,所以每次用到用户的基本信息,都需要有一次网络交互。更加让人无法接受的是,即使

(编辑:南通站长网)

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

    热点阅读