Netty对JDK做了哪些定制和优化

死磕 Netty 之内存篇:探索那个不为人知的堆外内存 在 Java 开发中我们知道 new 一个 Java 对象,我们就要给这个对象分配内存,这个对象是在堆内内存分配的,堆内内存完全由 JVM 虚拟机管所管理。对于整个机器而言,堆内内存以外的都是堆外内存。堆内内存由 JVM 虚拟机所管理,它有自己的垃圾回收算法,对于开发者而言我们不需要关心对象是如何分配和回收的,但是堆外内存则不受 JVM 管理,它对开发者来说是未知的。通常来说,未知的都是有风险的,那为什么还使用堆外内存呢?使用堆外内存可以减少一次内存拷贝。 阅读详情

Netty在JDK的基础上做了部分定制和优化,使之更适合高并发、网络通信的场景。举例如下:

1. ThreadLocal实现

就底层的哈希算法而言,ThreadLocal是基于非波拉契散列法和开放寻址,计算结果在空间分布上更加均匀。

而Netty的FastThreadLocal是基于数组下标递增,有效避免了哈希碰撞,并降低了rehash的开销,更适合高并发的场景。

2. 堆外内存释放机制

JDK提供堆外内存的封装类DirectByteBuffer,初始化时会默认开启Cleaner,作用是当DirectByteBuffer被GC时能自动调用Cleaner.clean()清理堆外内存,避免泄漏。

但Cleaner在内存分配和回收上会带来额外的性能开销。为此Netty提供了No Cleaner策略,不再创建Cleaner,而是通过retain/release操作手动释放,从而获得性能提升。

不过,或许是认识到了该策略带来的内存泄漏风险,Netty 5又将No Cleaner策略设置为默认不开启,作为可选择的高阶用法,需要通过指定JVM启动参数来开启。

3. 线程池实现

JDK的线程池内部维护了一个类型为BlockingQueue的taskqueue来保存任务队列,当线程从该队列获取任务会产生锁竞争降低性能。

Netty的解决办法是,每个channel创建时固定绑定到一个IO线程(NioEventLoop)上,其后channel上产生的IO任务也固定由这个线程处理,避免了线程池级别上的任务竞争。

不过你可能会提出疑问:除了IO任务,IO线程还会处理一些其他线程提交的异步任务和定时任务
呀,在线程内部不是仍然会发生任务队列竞争吗?

原来Netty在这里使用了JCTools提供的MpscQueue(多生产者单消费者队列),它内部使用CAS避免了JDK中BlockingQueue的锁竞争,从来带来更好的性能。

Netty在内部大量使用了MpscQueue,如HashedWheelTimer、Recycler、PoolThreadCache,这些场合都适合使用这种无锁非阻塞队列。

netty如何实现优化百万并发http请求 问题引入:如果项目存在数量大的并发,如何优化项目性能 首先判断项目性能瓶颈是什么, CPU,还是I/O请求 大部分是网络I/o瓶颈,主要是因为网络请求是阻塞,导致太慢 Netty 是一个异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端。 JDK 原生 NIO 程序的问题 JDK 原生也有一套网络应用程序 API,但是存在一系列问题,主要如下: NIO 的类库和 API 繁杂,使用麻烦。你需要熟练掌握 Selector、ServerSocketChannel、SocketC. 阅读详情

相关推荐

STM32+EC800M-CN 4G模块数据透传踩坑实录:从AT指令调试到花生壳内网穿透

本文详细介绍了STM32与移远EC800M-CN 4G模块的数据透传实现过程,包括硬件连接、AT指令调试、TCP连接建立以及花生壳内网穿透配置。通过实战案例和代码示例,帮助开发者快速解决4G通信模块在物联网应用中的常见问题,提升数据传输稳定性。

weixin_42715608的博客 322

Netty学习十:内存管理之Netty堆外内存

Netty学习系列

weixin_41402069的博客 3675

华为云CodeHub代码托管

什么是代码托管 代码托管(CodeHub)是面向软件开发者的基于Git的在线代码托管服务,是具备安全管控、成员/权限管理、分支保护/合并、在线编辑、统计服务等功能的云端代码仓库,旨在解决软件开发者在跨地域协同、多分支并发、代码版本管理、安全性等方面的问题。 代码托管具有以下特性 · 在线代码阅读、修改、提交,随时随地开发,不受地域限制。 · 在线分支管理,包含分支新建、切换、合并,实现多分支并行开发,效率高。 master分支:最为稳定,功能比较完整,随时可发布的代码。 develop分支:用于平时开

LUJINYUANA的博客 1万+

Netty 内存回收之 noCleaner 策略

前言 对于堆外内存,使用 System.gc() 是不靠谱的,依赖老年代 FGC 也是不靠谱的,而且大部分调优指南都设置了 -DisableExplicitGC 禁用 System.gc()。所以主动回收比较靠谱, JDK 在 DirectByteBuffer 中提供了 Cleaner 用来主动释放内存。同时还有 Unsafe 的 freeMemory 方法也可以。 下面看看他是怎么做的。这里以...

weixin_33762130的博客 701

Cadence 17.4 PSpice仿真555定时器输出方波

这里利用555定时器组成多谐振荡器产生1Hz的方波并用PSpice仿真其输出的方波波形。555定时器是一种广泛应用的中规模集成电路。根据其内部组成的不同,可分为双极型(555B)和CMOS型(555C)两类。两种类型的定时器各有所长。双极型定时器具有较大的驱动能力,其输出电流可达200mA,可直接驱动发光二级管、扬声器、继电器等负载。而CMOS型定时器的输入阻抗高、功耗低。

tj_nonstoper的博客 1万+

基于 Simulink 的三相四线制整流器在三相不平衡负载下的中点电位平衡控制实战教程。

本文介绍了三相四线制整流器在不平衡负载下的中点电位平衡控制方法。首先分析了中点电位漂移的物理机理和控制策略(零序电压注入)。接着详细讲解了Simulink建模步骤:搭建三相四线制主电路、设计平衡控制算法、实现PWM调制。通过对比有无平衡控制的仿真结果,验证了控制方法的有效性。最后提供了工程建议:零序注入需限幅、考虑中性线寄生电感影响、采用稳健的PI参数。该方案能有效抑制中点电位波动,保障三电平系统在不平衡工况下的稳定运行。

MHD0815的博客 60

Netty堆外内存泄漏排查,这一篇全讲清楚了

上篇文章介绍了Netty内存模型原理,由于Netty使用不当会导致堆外内存泄漏,网上关于这方面的资料比较少,所以写下这篇文章,基于Netty4.1.43.Final,专门介绍排查Nett...

Java笔记虾 6011

RAGFlow升级指南(纯小白都看得懂)

升级背景:RAGFlow项目原来的版本是0.17.0版本,在使用过程中,发现当知识库检索为空的时候并且使用到rerank模型的时候,就会输出错误的信息;为了解决这个版本问题,特意升级到最新的版本0.17.2(截止2025-3-14时最新版本就是0.17.2了)官方升级文档https://ragflow.io/docs/dev/upgrade_ragflow官方文档对小白还是不太友好,作者也是捣鼓了十多分钟,特出下面的升级指南前提:旧版本的RAGFlow项目是启动好了的1.在ragflow目录下执行(拉取最新

Ven%的博客 3596

Netty高级优化

Netty高级优化使用EventLoop的任务调度减少ChannelPipline的调用长度减少ChannelHandler的创建BOSS与Worker线程配置优化BOSS线程优化Worker(I/O)线程池优化线程隔离优化接收和发送缓冲区优化一些配置参数的设置 使用EventLoop的任务调度 在EventLoop的支持线程外使用channel.eventLoop().execute,而不是直接使用channel.writeAndFlush(data)。 channel.eventLoop().execu

Hello World 1172

YOLOv13-SWC (ShiftWise Convolution) 完整移植与原理深度解析教程

YOLOv13-SWC模型移植与原理解析 本文详细介绍了YOLOv13-SWC模型的完整移植过程与核心技术原理。YOLOv13-SWC在YOLOv8架构基础上引入ShiftWise Convolution(SWC)模块,通过创新性的位移操作、重参数化大核卷积和LoRA分解技术,显著提升了模型性能。文章包含三个核心部分: 模型移植实现:包括配置文件创建、任务模块修改和核心代码实现,重点介绍了SWC模块的掩码机制和LoRA卷积分解策略。 ShiftWise操作原理:深入解析了将大核卷积分解为小核卷积位移组合的数

FJN110的博客 504

【Windows Server 2019】发布服务器 | 远程桌面服务的安装与配置 Ⅰ——理论,实验拓扑和安装基于RemoteAPP的RDS

博客介绍了Windows Server中远程桌面服务的理论,实验拓扑以及基于RemoteAPP的RDS安装。博文介绍了如何在Windows Server上部署发布服务器。

VMware, Windows, Linux, Cisco, Container, Kubernetes, Kali 6128

为什么在netty的眼里jdk的许多实现都不是非常高效?

高开必备基础知识之一,深入浅出,通俗易懂讲清楚来龙去脉。

java架构师进阶之路的博客 1111

【WRF-Chem第二期】WRF-Chem有关 namelist 详解

【WRF-Chem第二期】WRF-Chem有关 namelist 详解

WW、forever的博客 2156

Netty源码系列 之 HashedWheelTimer源码

Netty源码之HashedWheelTimer

Eriksen的博客 1330

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

netty与socket对比_java原生各种IO和Netty框架的对比

异步非阻塞I/OJDK 1.4的NIO框架经常被称为异步非阻塞I/O,但是,如果严格按照UNIX网络编程模型和JDK的实现进行区分,实际上它只能被称为非阻塞I/O,不能叫异步非阻塞I/O。JDK 1.4和1.5 update10版本之前,JDK的Selector是基于select/poll模型实现的,它是基于I/O复用技术的非阻塞I/O,不是异步I/O。在JDK 1.5 update10和Linu...

weixin_39747334的博客 1761

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

Netty做什么?第一个Netty服务如何写?Netty的IO和Reactor模型?Netty组件是什么?ByteBuf是什么?(Netty一)

一 概述 目录 一 概述 1.1 初步了解Netty 1.2 Netty的架构是什么? 二 Netty中的模型 2.1 常见IO模型 2.1.1 BIO模型 2.1.2 NIO模型 2.1.3 AIO模型 2.2 常见Reactor模型 2.2.1 Reactor模型概述 2.2.1 单线程模型 2.2.2 多线程模型 2.2.3 主从多线程模型 2.2.4 Netty模型(主要是主从多线程模型) 三 第一个Netty服务 3.1 服务端 3.2 客户端 四 Netty

weixin_60425050的博客 859

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Netty 是什么,我们为什么使用 Netty

为什么要学习Netty: 在java的网络编程方面,最开始的BIO 到现在被广泛使用的NIO,它们都能完成网络编程的工作,但是使用原生的java API去完成网络编程,往往非常困难。连接管理、消息分割、数据编解码,还有对应应用层协议的实现,这些对开发人员的要求非常高。所以使用和学习Netty这样的网络框架是非常有必要的。 Netty是什么: Netty是对 Java NIO 的进一步封装,实现了众多的协议,并且提供了更加易用的API来帮助我们进行网络编程。本篇博客对Netty的概念进行了详细说名,并且介绍

不会骑摩托的程序员不是好的摄影师 4611

Netty 入门实战:从零搭建 Discard、Echo 和 Time 服务器

Netty是一个异步事件驱动的网络应用框架,用于快速开发高性能、可扩展的协议服务器和客户端。文章通过三个示例演示Netty基础用法:Discard服务器(丢弃数据)、Echo服务器(回显数据)和Time服务器(主动发送时间后关闭连接),展示了Netty的核心概念如ChannelHandler、ByteBuf管理和异步操作。这些示例为学习Netty网络编程打下基础,后续可深入编解码器、性能调优等高级主题。Netty简化了网络编程,同时保证了性能和稳定性。

ywl470812087的博客 15万+

【Netty】模型篇一:Netty 线程模型架构 & 工作原理 解读

本文通过与传统I/O模型以及三种Reactor模型进行对比,详细分析了Netty的线程模型是怎么设计的,以及它的工作流程。

正在努力工作的搬砖人 1万+

Netty做什么?第一个Netty服务如何写?Netty的IO和Reactor模型?Netty组件是什么?ByteBuf是什么?(Netty一)...

一 概述 1.1 初步了解Netty Netty是什么? Netty是一个高性能的、异步的、基于事件驱动的网络应用型框架。 为什么使用netty? a Netty是基于Java的NIO实现的,对各种API进行统一封装。 b 基于事件模型,我们可以在对应事件编码自己业务。让开发者聚焦业务。 c 高度可定制线程模型,单线程,一个或者多个线程池。 d Netty只依赖JDK...

lvlei19911108的博客 382

Netty

Netty

zhangyan_1010的专栏 1477

【Netty】一文入门Netty开发高性能网络框架

Netty不看重Windows上的使用,在Linux系统上,AIO的底层实现仍使用EPOLL,没有很好实现AIO,因此在性能上没有明显的优势,而且被JDK封装了一层不容易深度优化。 AIO还有个缺点是接收数据需要预先分配缓存, 而不是NIO那种需要接收时才需要分配缓存, 所以对连接数量非常大但流量小的情况, 内存浪费很多。 而且Linux上AIO不够成熟,处理回调结果速度跟不上处理需求。

xiaoxualg的博客 1607

Netty面试题(史上最全)

文章很长5万字,而且不断更新,建议收藏起来慢慢读!疯狂创客圈总目录 语雀版 | 总目录 码云版| 总目录 博客园版 为您奉上珍贵的学习资源 : 免费赠送 经典图书:《Java高并发核心编程(卷1)》 面试必备 + 大厂必备 +涨薪必备 加尼恩免费领 免费赠送 经典图书:《Java高并发核心编程(卷2)》 面试必备 + 大厂必备 +涨薪必备 加尼恩免费领 免费赠送 经典图书:《Netty Zookeeper Redis 高并发实战》 面试必备 + 大厂必备 +涨薪必备 加尼恩免费领 免

架构师尼恩 2万+

Netty实战入门详解——让你彻底记住什么是Netty(看不懂你来找我)

Netty 是基于 Java NIO 的异步事件驱动的网络应用框架,使用 Netty 可以快速开发网络应用,Netty 提供了高层次的抽象来简化 TCP 和 UDP 服务器的编程,但是你仍然可以使用底层的 API。Netty 的内部实现是很复杂的,但是 Netty 提供了简单易用的API从网络处理代码中解耦业务逻辑。Netty 是完全基于 NIO 实现的,所以整个 Netty 都是异步的。

qq_48811377的博客 4158

【netty】---- 第 4 章 Netty 概述

本文介绍了Netty网络框架的核心内容。首先分析了原生NIO存在的四大问题:API复杂、需多线程技能、开发难度大及JDK NIO的Epoll Bug。随后阐述了Netty作为异步事件驱动框架的优势,包括优雅的设计架构、易用性、高性能、安全支持及活跃社区。文章还说明了版本选择建议,推荐使用Netty4.x稳定版本。最后提供了Netty官网和下载地址,展现了Netty作为高性能网络应用框架的重要价值。

朱朱博客,分享技术 958

深入理解Netty及核心组件使用—上

Bootstrap 是 Netty 框架的启动类和主入口类,分为客户端类Bootstrap和服务器类ServerBootstrap两种。Channel 是 Java NIO 的一个基本构造。它代表一个到实体(如一个硬件设备、一个文件、一个网络套接字或者一个能够执行一个或者多个不同的 I/O 操作的程序组件)的开放连接,如读操作和写操作,目前,可以把 Channel 看作是传入(入站)或者传出(出站)数据的载体。因此,它可以被打开或者被关闭,连接或者断开连接。

尽力而为! 2008
上一篇: Java游戏服务器中定时任务的四种实现方式
下一篇: ArrayList 和 LinkedList 之间应该怎么选择
长三月
博客等级 码龄9年 228粉丝 80原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值