当前位置:首页 > 科技  > 软件

面试官:说说Netty对象池的实现原理?

来源: 责编: 时间:2024-06-05 17:44:42 72观看
导读Netty 作为一个高性能的网络通讯框架,它内置了很多恰夺天工的设计,目的都是为了将网络通讯的性能做到极致,其中「对象池技术」也是实现这一目标的重要技术。1.什么是对象池技术?对象池技术是一种重用对象以减少对象创建和

CWA28资讯网——每日最新资讯28at.com

Netty 作为一个高性能的网络通讯框架,它内置了很多恰夺天工的设计,目的都是为了将网络通讯的性能做到极致,其中「对象池技术」也是实现这一目标的重要技术。CWA28资讯网——每日最新资讯28at.com

1.什么是对象池技术?

对象池技术是一种重用对象以减少对象创建和销毁带来的开销的方法。在对象池中,只有第一次访问时会创建对象,并将其维护在内存中,当再次需要使用对象时,会直接从对象池中获取对象,并在使用完毕后归还给对象池,而不是频繁地创建和销毁对象。CWA28资讯网——每日最新资讯28at.com

使用对象池技术的优点有以下几个:CWA28资讯网——每日最新资讯28at.com

  • 提高性能:复用对象可以减少对象的创建和销毁次数,降低系统开销,提高系统性能和吞吐量。
  • 减少内存碎片:对象池可以避免频繁地创建和销毁对象,减少内存碎片的产生,提高内存利用率。
  • 避免频繁GC:减少了对象的创建和销毁,可以减少垃圾回收(GC)的频率,降低系统的负担,提高系统的稳定性。

2.对象池基本使用

Netty 对象池技术的核心实现类为 Recycler,Recycler 主要提供了以下 3 个方法:CWA28资讯网——每日最新资讯28at.com

  • get():获取一个可重复使用的对象,如果对象池中有空闲对象,则返回其中一个;否则会创建一个新对象。
  • recycle(T, Handle):回收一个对象,将对象放回对象池中以便下次复用。
  • newObject(Handle):当对象池中没有可用对象时,此方法会被调用以创建新的对象实例。

接下来我们写一个 Recycler 对象池的使用 Demo,假设我们有一个 User 类,需要实现 User 对象的复用,具体实现代码如下:CWA28资讯网——每日最新资讯28at.com

public class UserRecyclerDemo {    private static final Recycler<User> userRecycler = new Recycler<User>() {        @Override        protected User newObject(Handle<User> handle) {            return new User(handle);        }    };    static final class User {        private String name;        private Recycler.Handle<User> handle;        public void setName(String name) {            this.name = name;        }        public String getName() {            return name;        }        public User(Recycler.Handle<User> handle) {            this.handle = handle;        }        public void recycle() {            handle.recycle(this);        }    }    public static void main(String[] args) {        User user1 = userRecycler.get();  // 1.从对象池获取 User 对象        user1.setName("zhangsan");    // 2.设置 User 对象的属性        user1.recycle();      // 3.回收对象到对象池        User user2 = userRecycler.get();  // 4.从对象池获取对象        System.out.println(user1 == user2);        System.out.println(user2.getName());    }}

以上程序的执行结果如下:CWA28资讯网——每日最新资讯28at.com

trueCWA28资讯网——每日最新资讯28at.com

zhangsanCWA28资讯网——每日最新资讯28at.com

从上述结果可以看出,当第一次调用 userRecycler.get() 时,因为对象池中尚未存在 user 对象,所以创建了 name 为“zhangsan”的对象。但第二次再调用 userRecycler.get() 时,因为对象池中已经存在了 user 对象,所以直接从对象池中取出了 user 对象,所以 user1==user2 时,得到的结果是 true。CWA28资讯网——每日最新资讯28at.com

3.对象池技术应用

在 Netty 中,使用 Recycler 对象池管理对象的常见类有以下几个:CWA28资讯网——每日最新资讯28at.com

  • PooledHeapByteBuf:管理堆内存中的 ByteBuf 对象。
  • PooledDirectByteBuf:管理堆外内存中的 ByteBuf 对象。
  • ChannelOutboundBuffer.Entry:Netty 出站缓冲区(ChannelOutboundBuffer)中,每一个待发送的消息都包装在一个 Entry 对象中。

4.实现原理

要搞清楚 Netty 对象池技术的实现原理,就要搞清楚 Netty 对象池的核心组件,以及组件之间的关系。CWA28资讯网——每日最新资讯28at.com

Netty 对象池技术的实现依靠以下 4 大组件:CWA28资讯网——每日最新资讯28at.com

  • Stack(栈):每个线程都关联一个 Stack(使用 FastThreadLocal 进行存储),用于存储和管理该线程回收的对象。Stack 中存储的是 DefaultHandle 对象,这些 DefaultHandle 对象包装了实际要重用的对象。Stack 是与线程绑定的,每个线程从自己的 Stack 中获取对象。
  • WeakOrderQueue(弱序队列):当某个线程(非主线程)回收对象时,这些对象不会直接放入主线程的 Stack 中,而是放入 WeakOrderQueue 中。WeakOrderQueue 存储的是从其他线程回收的对象,这些对象被包装在 DefaultHandle 中。WeakOrderQueue 与 Stack 关联,但属于非主线程。当主线程的 Stack 为空时,会尝试从 WeakOrderQueue 中获取对象。
  • Link(链表):WeakOrderQueue 中的存储单元,用于存储回收的对象。Link 中存储的是 DefaultHandle 对象数组,这些数组包含从其他线程回收的对象。
  • DefaultHandle:对象的包装类,在 Recycler 中缓存的对象都会包装成 DefaultHandle 类。DefaultHandle 中存储了实际要重用的对象,以及与之相关的元数据。

简单来说,这 4 个组件的关系是,(每个)线程为了保证线程安全和高效性操作,所以会把使用的对象放到 Stack 栈中,且每个线程都有自己的 Stack 栈。当线程中的对象不再被使用时(也就是被回收时),并不会将回收对象直接放到 Stack 中(因为当前线程已经不再使用了),此时会将对象存放到 WeakOrderQueue 队列中,因为 WeakOrderQueue 队列相当于“线程共享的区域”,这样其他线程就可以方便的从 WeakOrderQueue 中获取对象进行重用了。而 WeakOrderQueue 中的存储单元是 Link 链表,它存储的是对象池中的包装对象 DefaultHandle,这就是这四大核心组件之间的关系。CWA28资讯网——每日最新资讯28at.com

5.线程如何获取对象?

在 Netty 中,获取对象池中对象的流程如下:CWA28资讯网——每日最新资讯28at.com

  • 判断 Stack:线程首先会尝试从自己的 Stack 中获取对象。如果 Stack 中有对象,则直接弹出(pop)并返回。
  • Stack 为空:如果 Stack 为空,线程会检查 WeakOrderQueue。如果 WeakOrderQueue 中有对象,则按照一定的规则(如“1/7规则”,每 7 个移动 1 个)将部分对象转移到 Stack 中,然后从 Stack 中弹出并返回。
  • 创建新对象:如果 Stack 和 WeakOrderQueue 都为空,线程会调用 newObject() 方法创建一个新的对象,并包装成 DefaultHandle 后放入 Stack 中,然后返回该对象。

通过这样的设计,Netty 的 Recycler 对象池技术能够高效地重用对象,减少内存分配和垃圾收集的开销,提升性能。CWA28资讯网——每日最新资讯28at.com

本文链接://www.dmpip.com//www.dmpip.com/showinfo-26-92142-0.html面试官:说说Netty对象池的实现原理?

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: Python性能加速器:深度解析__slots__属性优化内存利用!

下一篇: 2024 年你可以使用的十大 Node.js 现代特性

标签:
  • 热门焦点
  • Rust中的高吞吐量流处理

    Rust中的高吞吐量流处理

    作者 | Noz编译 | 王瑞平本篇文章主要介绍了Rust中流处理的概念、方法和优化。作者不仅介绍了流处理的基本概念以及Rust中常用的流处理库,还使用这些库实现了一个流处理程序
  • 得物效率前端微应用推进过程与思考

    得物效率前端微应用推进过程与思考

    一、背景效率工程随着业务的发展,组织规模的扩大,越来越多的企业开始意识到协作效率对于企业团队的重要性,甚至是决定其在某个行业竞争中突围的关键,是企业长久生存的根本。得物
  • 破圈是B站头上的紧箍咒

    破圈是B站头上的紧箍咒

    来源 | 光子星球撰文 | 吴坤谚编辑 | 吴先之每年的暑期档都少不了瞄准追剧女孩们的古偶剧集,2021年有优酷的《山河令》,2022年有爱奇艺的《苍兰诀》,今年却轮到小破站抓住了追
  • 中国家电海外掘金正当时|出海专题

    中国家电海外掘金正当时|出海专题

    作者|吴南南编辑|胡展嘉运营|陈佳慧出品|零态LT(ID:LingTai_LT)2023年,出海市场战况空前,中国创业者在海外纷纷摩拳擦掌,以期能够把中国的商业模式、创业理念、战略打法输出海外,他们依
  • 品牌洞察丨服务本地,美团直播成效几何?

    品牌洞察丨服务本地,美团直播成效几何?

    来源:17PR7月11日,美团App首页推荐位出现&ldquo;美团直播&rdquo;的固定入口。在直播聚合页面,外卖&ldquo;神枪手&rdquo;直播间、美团旅行直播间、美团买菜直播间等均已上线,同时
  • 华为将推出盘古数字人大模型 可帮助用户12小时完成数字人生成

    华为将推出盘古数字人大模型 可帮助用户12小时完成数字人生成

    在今日举行的2023年华为云数字文娱AI创新峰会上,华为云全球Marketing与销售服务总裁石冀琳表示,华为云将在后续推出盘古数字人大模型,可帮助用户12小
  • 回归OPPO两年,一加赢了销量,输了品牌

    回归OPPO两年,一加赢了销量,输了品牌

    成为OPPO旗下主打性能的先锋品牌后,一加屡创佳绩。今年618期间,一加手机全渠道销量同比增长362%,凭借一加 11、一加 Ace 2、一加 Ace 2V三款爆品,一加
  • 苹果140W USB-C充电器:采用氮化镓技术

    苹果140W USB-C充电器:采用氮化镓技术

    据10 月 30 日 9to5 Mac 消息报道,当苹果推出新的 MacBook Pro 2021 时,该公司还推出了新的 140W USB-C 充电器,附赠在 MacBook Pro 16 英寸机型的盒子里,也支
  • 最薄的14英寸游戏笔记本电脑  Alienware X14已可以购买

    最薄的14英寸游戏笔记本电脑 Alienware X14已可以购买

    2022年1月份在国际消费电子展(CES2022)上首次亮相的Alienware新品——Alienware X14现在已经可以购买了,这款笔记本电脑被誉为世界上最薄的 14 英寸游戏笔
Top
Baidu
map