网络编程 — Reactor模型与Netty

socket网络编程和IO模型,这一小节我们来入门Netty。对于很多程序员来说,Netty是非常遥远的。很多程序员认为平时的开发过程中基本不会使用到Netty,如果你也是这么认为的那就大错特错了。因为我们虽然不会直接写Netty的代码,但是我们每天都在间接使用Netty,大到我们的RPC框架dubbo、大数据的Hadoop,小到Redis的工具包,几乎所有实现网络通信的框架都是基于Netty实现的。所以学习Netty掌握Netty不论是对于我们来说都是开发网络程序,还是排查网络问题,亦或是框架设计思想上的提升都有莫大的帮助。这一小节我们先从最基本的Netty的结构模型开始,先建立一个Netty的基本的认知,随后我们编写Netty的HelloWorld加深对Netty的一些模块点的理解

网络编程 — Socket编程与IO模型

网络的基础知识包括一些网络模型和协议。我们常说Talk is cheap, show me code.这一小节我们将解锁Socket网络编程,通过Socket来编写简单一些简单的网络小程序。我很早之前就接触过Socket网络编程,也能写一些简单的程序,但是始终感觉socket离我很遥远,不清楚socket到底是什么以及socket是如何工作的。如果你也有和我一样的疑问,通过这一小节的梳理让我们一起搞懂socket,解锁socket技能点。在编写完socket程序之后,我们还会思考如何提高我们socket网络程序的处理吞吐量连接数,并且引入我们的IO模型,深入理解几种常见的IO模型。

网络基础 — 深入理解TCP协议

网络模型和一些网络协议,其中最大头TCP协议我们挖了一个坑,这一小节我们来填坑。这一小节我们主要分成三大块,第一部分我们将介绍,TCP的三次握手和四次挥手,通过简单的交互维护一个状态机之后建立一个稳定可靠的连接。我们有了一个稳定的连接,我们还需要数据包地稳定发送和接收。有了上面两个保障之后,如何充分利用网络带宽,成了最后的问题,这里我们介绍了传统算法和BBR算法。梳理完以上这些部分,我相信你对TCP协议会有更加深入的理解,让我们先从TCP的介绍开始吧~

网络基础 — 网络模型与网络协议

网络对于程序员非常重要,可以说离开了网络软件程序就失去了70%的魔力。但是程序员对于网络相关的领域是又爱又恨,爱是因为网络赋予程序无限的可能性,恨是因为网络对软件开发来说几乎是透明的,不用刻意的去调整网络,我们也能进行业务的开发。掌握网络相关的知识并不容易,网络相关的领域的知识内容复杂且涉及范围广。可是如果要成为一个优秀的开发工程师,进行网络相关的开发,就必须对这个部分有一个清晰的结构化的认知。这一小节,我们会从网络的TCP五层模型和OSI七层结构模型开始梳理介绍,随后介绍每一层和每一层具有代表性的网络协议,最后我们简单的聊一聊一个数据包是怎么在网络上传输的。

JVM GC篇 — 垃圾收集器(下)

前面一小节中,我们梳理了经典的垃圾收集器。从单线程的Serial串行垃圾收集器开始,聊到了CMS最后到G1,并着重的分析了CMS和G1并发垃圾收集流程和部分实现原理。这些垃圾收集器经过数千台服务器的验证淬炼,已经变得相当的成熟可靠,但是真的就是完美的垃圾收集器吗?答案是否定的。今天我们一起来看看相较于“经典”垃圾收集器的全新一代垃圾收集器 Shenandoah 和 ZGC。这种垃圾收集器能够实现超大堆的容量下,轻松实现垃圾收集停顿不超过10ms的目标,但是目前还处于实验状态,官方命名为“低延迟垃圾收集器”(Low-Latency Garbage Collector 或者 Low-Pause-Time Garbage Collector)。

JVM GC篇 — 垃圾收集器(上)

前面一小节我们介绍了介绍了GC的一般性原理和垃圾回收算法,通过对前面知识的学习,我们基本掌握了垃圾收集的一般理论知识。但是理论终究知识在之上,距离真正的实践还有一定的差距。前面我们提到了第一个带有内存动态分配和垃圾收集的编程语言并不是 Java 而是1960年诞生的Lisp。当然这一小节中我们并不会梳理 Lisp 实现的垃圾收集器。这一小节我们会先从经典垃圾收集器入手,梳理各个垃圾收集器的特性、优缺点和适用场景。当然随着垃圾收集器的效率的不断提升其实现的复杂度也在不断提升。我们会主要的篇幅去介绍CMS和G1原理及部分实现细节,升华对垃圾收集器的理解。今天是六一儿童节,各位朋友坐好来,我们的梳理开始了。

JVM GC篇 — 一般原理与垃圾收集算法

我们都知道 Java 程序员不用像 C++ 程序员一样手动申请和释放对象空间,这是因为 JVM 垃圾回收器的存在。为什么需要垃圾回收呢?因为空间是有限的,而我们运行程序完成各种各样的计算需要申请空间。但是空间不是无限的,如果我们的空间不够申请怎么办?这个时候就要释放内存,删除掉一些不用的无效的空间,来腾出空间来创建我们需要的对象。这就像我们的衣柜一样,我们买衣服回来放在衣柜里面,但是衣柜不是无限大的,所以当衣柜放不下的时候,我们就要清理丢掉小了的或者我们不穿的衣服,这样为新的衣服腾出空间。Java 自带GC会自动清理内存空间,而C++这种没有GC的语言,就需要使用手动清理空间了。全自动不用程序员操心的确很好,如果放仍不管也会引起其他的问题,那么怎么清理起来才是正确且高效。这就是一个有意思的问题,这一小节我们将从 GC 的一般原理和垃圾回收算法开始,逐步展开 Java GC 的世界。

JVM基础 — 内存结构与内存模型

在前面的小节中,总结梳理了 JVM 底层的一些基础的东西,包括 JVM 字节码技术,方法的调用,反射,异常等方法流程,基础的最后一部分梳理了类加载机制和对象的内存布局。有了这一套机制 JVM 能够顺利的读取Java文件,并行执行逻辑。看起来都有了,但是少了一个重要的部分没错,就是内存。这计算机的内存这个部分来的像理所当然一样。其实最原始的计算机是没有内存这个概念的,后来冯诺依曼提出了冯诺依曼结构,冯诺依曼确定了计算机的结构,即确定了计算机的 5 大部件,即运算器、控制器、存储器、输入设备和输出设备。现代计算机的都是遵循冯诺依曼结构的,因此又称为冯诺依曼机。所以作为虚拟机怎么能没有内存呢?Java 内存模型规定了 JVM 应该如何使用计算机内存(RAM)。广义上来讲,Java内存模型分别为两个部分 JVM内存结构 和 JMM与线程规范。

JVM 基础 — 类加载机制和对象内存布局

在前面一篇中提到了方法的调用,方法在类加载阶段会由符号引用替换实际引用或者方法表的索引。Java 的类加载机制又是怎么样的呢?我记得我刚毕业那会去面,基础的问题都回答的挺好的但是最后面试官问了我这个问题,Java 虚拟机是怎么加载一个类的?我当时脑子懵了,对象怎么加载到内存?对象是 new 出来的的啊,还要加载?我也对这块不太了解,然后面试官也就没深了问。但是现在看来,如果是进阶 Java 的话这是一个基础不能在基础的问题了。类加载了这还不算完,Java 的类是怎么保存的,我相信很多朋友会回答存放在堆里,那其他特殊的类型呢 例如 String 类型又是怎么存储的呢?我们在内存溢出的时候,对象怎么就把我们的堆给堆满了,每个对象占了多大的空间呢?请朋友们慢慢往下看。

JVM 基础 — Java 方法调用、反射调用与异常

在前一篇中简单介绍了Java 字节码中有关方法调用的一些操作码,但是 java 方法的调用往深了讲又有很多的门道,简单的有方法的重写和重载,深入也有方法的动态绑定和静态绑定,那JVM是如果识别和选定方法的呢?还有有些时候我们并不能直接调用某个目标方法,而是要使用一些特别的手段去调用,也就是我们会经常用到的反射,反射不同于常规的方法调用,这货一上来就不走寻常路,一般方法调用都是先 new 一个对象,就像是朋友来家里做客从正门进来,反射是先通过 class 对象找到目标方法然后传入调用实例,这更像是翻墙进来。那这个翻墙进来的它背后的原理又是怎样的呢?假如这个世界是美好的,但一个方法的执行可能没那么顺利,万一发生了异常这个异常又是怎么捕获的呢?

JVM 基础 — Java 字节码

我们通常表述的 JVM 通常有三种意思,JVM 是 Java virtual machine 即 java 虚拟机的缩写,也就是我们通常所指的 JVM。JVM还是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。因此 JVM 也是图灵完备的。当然 JVM 还可以表示一个虚拟机的实例。Java 一个非常重要的特性就是和平台无关,而 JVM 是实现这一点的关键。JVM 底层使用 C 进行编写,只要平台能执行 C 语言,这也就能启动 JVM 运行 Java 程序。JVM 通过编译 Java 语言生成字节码文件,字节码文件在通过 JVM 进行解释执行。因此只要运行在不同的平台上的JVM 能拿到字节码文件,就能解释执行出相同的结果。这就是 Java 可以 “一次编译,到处执行” 的原因。 当然并不是Java 语言是跨平台的语言,拿 C++ 举个例子,C++ 也是一门跨平台的语言,但是和 Java 语言不同的是,C++ 需要到不同的平台生成不同的文件,然后进行执行,也就是源码跨平台,而 Java 是二进制跨平台。

Java异步编程方式介绍

异步执行对于开发者来说并不陌生,在实际的开发过程中,很多场景多会使用到异步,相比同步执行,异步可以大大缩短请求链路耗时时间,比如:发送短信、邮件、异步更新等,这些都是典型的可以通过异步实现的场景。1. 线程Thread 2. Future 3. 异步框架CompletableFuture 4. Spring注解@Async 5. Spring ApplicationEvent事件 6. 消息队列 7. 第三方异步框架,比如Hutool的ThreadUtil 8. Guava异步
Honesty
Honesty
人道洛阳花似锦,偏我来时不逢春
最新发布
Java IO — NIO Buffer
2024-10-21
Java IO — NIO Channel
2024-10-21
Java IO — IO/NIO模型
2024-10-21
Java异步编程方式介绍
2024-10-21
Elasticsearch — 索引(Mapping Index)
2024-10-19
Elasticsearch — 如何存储数据并保持一致性?
2024-10-19