跳至主要內容
NIO - HeapByteBuffer

NIO - HeapByteBuffer

上篇文章介绍了堆外内存 DirectByteBuffer,我们知道了 DirectByteBuffer 是分配在 JVM 堆外的 ByteBuffer,这篇文章来了解堆内内存 HeapByteBuffer。

HeapByteBuffer

HeapByteBuffer,即分配在 JVM 中的 heap 堆中的 ByteBuffer,调用 ByteBuffer#allocate() 即可生成一个 HeapByteBuffer 对象。

public static ByteBuffer allocate(int capacity) {
    if (capacity < 0)
        throw new IllegalArgumentException();
    return new HeapByteBuffer(capacity, capacity);
}

大约 2 分钟
Netty 入门 — Hello World

Netty 入门 — Hello World

这篇文章我们正式开始学习 Netty,在入门之前我们还是需要了解什么是 Netty。

什么是 Netty

为什么很多人都推崇 Java boy 去研究 Netty?Netty 这么高大上,它到底是何方神圣?

用官方的话说:Netty 是一款异步的、基于事件驱动的网络应用程序框架,用以快速开发高性能、高可靠性的网络 IO 程序

为什么要使用 Netty 呢?因为使用原生的 Java NIO 非常不爽,它存在一系列的问题,比如:


大约 5 分钟
Netty 入门 — 核心组件

Netty 入门 — 核心组件

在上篇文章(Netty 入门 — 亘古不变的Hello World)中,我们简单认识了开发一个 Netty 服务端和客户端代码的主要步骤了,在这几大步骤中我们基本上可以看出 Netty 的几个核心组件。

在真正进入 Netty 的学习之前,我们非常有必要先对这些组件进行一个整体的认识,对于 Netty 入门阶段的讲解,大明哥采用整体 —> 分解 —> 总结的模式来阐述。对于一头牛,我们需要先知道这是一头牛,了解这头牛有哪些组织,然后再把这些组织一个一个地拆开来认识,清楚里面每一个组织的功能,最后再将这些组织组合成一头牛,是不是就会清晰很多。


大约 11 分钟

深入分析 Java IO (二)BIO

深入分析 Java IO (二)BIO

最原始BIO

网络编程的基本模型是C/S模型,即两个进程间的通信。

服务端提供IP和监听端口,客户端通过连接操作想服务端监听的地址发起连接请求,通过三次握手连接,如果连接成功建立,双方就可以通过套接字进行通信。

传统的同步阻塞模型开发中,ServerSocket负责绑定IP地址,启动监听端口;Socket负责发起连接操作。连接成功后,双方通过输入和输出流进行同步阻塞式通信。 最原始BIO通信模型图:

202202131612423191.png


大约 9 分钟
一、Java 的 I/O 类库

I/O 问题可以说是当今互联网 Web 应用中所面临的主要问题之一,因为当前在这个海量数据时代,数据在网络中随处流动。这个流动的过程中都涉及到 I/O 问题,可以说大部分 Web 应用系统的瓶颈都是 I/O 瓶颈。本文的目的正是分析 I/O 的内在工作机制,你将了解到:

  • Java 的 I/O 类库的基本架构;
  • 磁盘 I/O 工作机制;
  • 网络 I/O 的工作机制;

其中以网络 I/O 为重点介绍 Java Socket 的工作方式;你还将了解到 NIO 的工作方式,还有同步和异步以及阻塞与非阻塞的区别,最后我们将介绍一些常用的关于 I/O 的优化技巧。


大约 29 分钟
NIO - 基础详解

NIO - 基础详解

Netty 是基于Java NIO 封装的网络通讯框架,只有充分理解了 Java NIO 才能理解好Netty的底层设计。Java NIO 由三个核心组件组件:

  • Buffer
  • Channel
  • Selector

缓冲区 Buffer

Buffer 是一个数据对象,我们可以把它理解为固定数量的数据的容器,它包含一些要写入或者读出的数据。

在 Java NIO 中,任何时候访问 NIO 中的数据,都需要通过缓冲区(Buffer)进行操作。读取数据时,直接从缓冲区中读取,写入数据时,写入至缓冲区。NIO 最常用的缓冲区则是 ByteBuffer。下图是 Buffer 继承关系图:


大约 6 分钟
服务端多线程化

服务端多线程化

多线程架构

前面所有文章的示例服务端都是单线程模式,这种模式存在很多的缺陷

  1. 无法充分利用多核 CPU 的性能
  2. 如果服务端某个读写操作耗时较多,则会拖慢整个服务端

所以,这篇文章大明哥将介绍服务端多线程的模式,让我们榨干服务器性能。

我们清楚服务端主要做两件事,建立连接和处理读写事件,所以我们可以将服务端的线程分为两组:

  1. 一个线程专门处理 accept 事件,我们称之为 Boss 线程
  2. CPU 核心数个线程,这些线程处理读写事件,我们称之为 Worker 线程

大约 6 分钟
NIO - 堆外内存 DirectByteBuffer & MappedByteBuffer

NIO - 堆外内存 DirectByteBuffer & MappedByteBuffer

前面 9 篇文章我们已经深入了解了 NIO 的基本概念和核心原理,想必小伙伴们对 NIO 的三大组件已经了然于心了,对于 ByteBuffer 而言,其实还有两个较为特殊的类 DirectByteBuffer 和 MappedByteBuffer 没有分析,这两个类的原理都是基于内存文件映射的。

ByteBuffer 分为两种,一种是直接的,另外一种是间接的。

  • 直接缓冲:直接使用内存映射,对于 Java 而言就是直接在 JVM 之外分配虚拟内存地址空间,Java 中使用 DirectByteBuffer 来实现,也就是堆外内存。
  • 间接缓冲:是在 JVM 堆上实现,Java 中使用 HeapByteBuffer 来实现,也就是堆内内存。

大约 14 分钟
2
3
4
5
...
20