2023-09-13  阅读(33)
原文作者:https://blog.csdn.net/wangwei19871103/category_9681495_2.html 原文地址: https://blog.csdn.net/wangwei19871103/article/details/104735845

一行代码的秘密

我们今天就来看看一行代码里面的细节,涉及很多东西,有很多开始不会关心的一些问题。

    EventLoopGroup bossGroup = new NioEventLoopGroup(1);

NioEventLoopGroup的terminationFuture终止回调

202309132210573041.png
在初始化后面会给每个终止回调添加一个相同的终止回调,只有所有的子事件循环NioEventLoop终止了才会回调事件循环组NioEventLoopGroup的成功终止。

202309132210590282.png

NioEventLoop的初始化

io.netty.noKeySetOptimization

是否禁用选择器的selectedKeys优化,默认是不禁用,也就是要优化,至于怎么优化,后面会说,其实就是用反射改变了选择器的selectedKeyspublicSelectedKeys的属性,变成了SelectedSelectionKeySet类型,因为原生的底层是HashMap实现的,而优化的是数组实现的,提高效率。

202309132210599163.png

io.netty.selectorAutoRebuildThreshold

这个表示NIO的空轮序多少次后重建选择器,也就是解决NIO的空轮询BUG的参数。

202309132211005924.png

NioEventLoop构造方法的newTaskQueue

202309132211025455.png

202309132211037336.png

PlatformDependent

其实我想说的是这个类的初始化。

202309132211053297.png

MAX_DIRECT_MEMORY_SIZE_ARG_PATTERN

这个是用来解析虚拟机设置参数的,后面会说,最大堆外内存的设置可以根据这个来设置。

202309132211062058.png

平台相关属性

这里可以获取操作系统和虚拟机信息。

202309132211085979.png

CAN_ENABLE_TCP_NODELAY_BY_DEFAULT

设置TCP是否禁止Nagal算法,其实就是看是否是安卓,不是安卓就禁止,不开启的话可能会有延迟的,可能你发送的数据太小,不会马上发送,要积压一会儿到了阈值才会发送,貌似好像小数据延迟200ms后也会发送,一般都会开启,为了低延迟。

2023091322110935510.png

2023091322111265311.png

PlatformDependent0的初始化

io.netty.noUnsafe是否禁用unsafe

2023091322111343812.png
如果禁用了会抛异常。

2023091322111381413.png

PlatformDependent0的isAndroid0

其实就是获取系统属性比较字符串:

2023091322111448814.png

io.netty.tryReflectionSetAccessible启用反射访问

2023091322111523315.png
默认java9以下的是可以启用,所以9以及以上就要设置啦,不然后面不会使用NoCleaner的缓冲区,这个貌似在以前的文章有讲过。

2023091322111656416.png

获取unsafe

可以看到要启用io.netty.noUnsafe才能去用反射获取unsafe属性。而这里申请了一个1字节的直接缓冲区也是为了后面的反射。

2023091322111729917.png

获取直接缓冲区的address属性

2023091322111827718.png

获取DirectByteBuffer的无清除器的构造方法

2023091322111934919.png
这个构造方法就是没有清除器cleaner的,而是直接用unsafe去释放。

2023091322112090720.png

获取address属性和字节数组的内存偏移

可以方便直接操作内存数据。

2023091322112183721.png

继续PlatformDependent属性

获取最大直接缓冲区大小

2023091322112248122.png
如果你的VM参数设置了,那就会在这里被正则取出来,然后处理。

2023091322112351923.png
否则就是调用运行时最大可分配内存,其实是虚拟机尝试获得的最大内存,应该是堆内的,这里堆外也设置成这个值了:

2023091322112443224.png
看看LOG,居然分了4G,我电脑还有9G内存可分配:

2023091322112550525.png

2023091322112642526.png

静态代码块

设置使用没有清理器的直接缓冲区

2023091322112719627.png

设置清理器

当然你如果强行要设置有清理器的,那也可以,他也会给你初始化好清理器,安卓当然是没有的。
分为两个版本,具体区别可以看这篇文章

2023091322112822628.png

优先使用直接缓冲区

默认就优先使用直接缓冲区。

2023091322112917829.png

有点长了,后面的下次再说吧。

好了,今天就到这里了,希望对学习理解有帮助,大神看见勿喷,仅为自己的学习理解,能力有限,请多包涵。


Java 面试宝典是大明哥全力打造的 Java 精品面试题,它是一份靠谱、强大、详细、经典的 Java 后端面试宝典。它不仅仅只是一道道面试题,而是一套完整的 Java 知识体系,一套你 Java 知识点的扫盲贴。

它的内容包括:

  • 大厂真题:Java 面试宝典里面的题目都是最近几年的高频的大厂面试真题。
  • 原创内容:Java 面试宝典内容全部都是大明哥原创,内容全面且通俗易懂,回答部分可以直接作为面试回答内容。
  • 持续更新:一次购买,永久有效。大明哥会持续更新 3+ 年,累计更新 1000+,宝典会不断迭代更新,保证最新、最全面。
  • 覆盖全面:本宝典累计更新 1000+,从 Java 入门到 Java 架构的高频面试题,实现 360° 全覆盖。
  • 不止面试:内容包含面试题解析、内容详解、知识扩展,它不仅仅只是一份面试题,更是一套完整的 Java 知识体系。
  • 宝典详情:https://www.yuque.com/chenssy/sike-java/xvlo920axlp7sf4k
  • 宝典总览:https://www.yuque.com/chenssy/sike-java/yogsehzntzgp4ly1
  • 宝典进展:https://www.yuque.com/chenssy/sike-java/en9ned7loo47z5aw

目前 Java 面试宝典累计更新 400+ 道,总字数 42w+。大明哥还在持续更新中,下图是大明哥在 2024-12 月份的更新情况:

想了解详情的小伙伴,扫描下面二维码加大明哥微信【daming091】咨询

同时,大明哥也整理一套目前市面最常见的热点面试题。微信搜[大明哥聊 Java]或扫描下方二维码关注大明哥的原创公众号[大明哥聊 Java] ,回复【面试题】 即可免费领取。

阅读全文