![](https://img-blog.csdnimg.cn/20201014180756926.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Java
文章平均质量分 69
逆流丶石头
这个作者很懒,什么都没留下…
展开
-
设计模式 - 观察者模式
在WeatherData中,当增加一个第三方,都需要创建一个对应的第三方的公告板 对象,并加入到dataChange, 不利于维护,也不是动态加入。原创 2023-05-26 14:04:49 · 168 阅读 · 0 评论 -
设计模式 - 建筑者模式
设计的程序结构,过于简单,没有设计缓存层对象,程序的扩展和维护不好. 也就 是说,这种设计方案,把产品(即:房子) 和 创建产品的过程(即:建房子流程) 封 装在一起,耦合性增强了。是比较好理解,简单易操作。原创 2023-05-25 16:54:55 · 140 阅读 · 0 评论 -
设计模式 - 原型模式
比较好理解,简单易操作。原创 2023-05-25 15:30:54 · 651 阅读 · 0 评论 -
设计模式 - 工厂模式
定义了一个创建对象的抽象方法,由子类决定要实例化的类。工厂方 法模式将。原创 2023-05-24 17:47:32 · 943 阅读 · 0 评论 -
设计模式 - 单例设计模式
所谓类的单例设计模式,就是采取一定的方法保证在整个的软件系统中,对某个类,并且该类只提供一个取得其对象实例的方法(静态方法)。原创 2023-05-23 17:42:05 · 330 阅读 · 0 评论 -
JVM 垃圾回收器
串行回收器: Serial、Serrial Old并行回收器: ParNew、Parallel Scavenge、Parallel Old并发回收器: CMS、G1新生代收集器: Serial、ParNew、Parallel Scavenge老年代收集器: Serial Old、Parallel Old、CMS整堆收集器: G1没有一种放之四海皆准、任何场景下都适合的完美收集器存在,更加没有万能的收集器,我们选择只是对具体应用最合适的收集器。原创 2023-05-18 13:37:13 · 805 阅读 · 0 评论 -
JVM 垃圾回收相关概念
在操作系统中,是指一个时间段有几个程序都处于已启动运行到运行完毕之间,且这几个程序都是在同一个处理器上运行,并发并不是真正意义的 "同时处理",只是CPU 把一个时间段分成几个时间片段,在这几个时间段来回切换。当系统中有一个以上的 CPU时,当一个 CPU 执行一个进程时,另一个 CPU 可以执行另一个进程,两个进程互不抢占 CPU 资源,可以同时进行。设置一个中断标志,各个线程运行到 Safe Point 的时候主动轮询这个标志,如果中断标志为真,则将自己运行中断挂起。回收完,再启动程序的线程。原创 2023-05-17 13:00:22 · 297 阅读 · 0 评论 -
JVM 垃圾回收相关算法
上述现有的算法,在垃圾回收过程中,应用软件将处于一种Stop the World 的状态。在 Stop the World 状态下,应用程序所有的线程都会挂起,暂停一切正常的工作,等待垃圾回收的完成。将活着的内存空间分为两块,每次只使用其中一块,在垃圾回收时将正在使用的内存中存活对象赋值到未被使用的内存块中,之后清除正在使用的内存块的所有对象,交换两个内存角色,最后完成垃圾回收。但是,因为线程切换和上下文转换的消耗,会使得垃圾回收的总体成本上升,依次反复,直到垃圾收集完成。实现简单,垃圾对象便于辨别;原创 2023-05-16 22:05:00 · 351 阅读 · 0 评论 -
JVM 垃圾回收概述
担忧:原创 2023-05-15 17:45:38 · 451 阅读 · 0 评论 -
JVM StringTable
2. 如果不是使用双引号声明的 String 对象,可以使用 String 提供的 Intern() 方法。1. 直接使用双引号声明出来的 String 对象会直接存储在常量池种。原创 2023-05-15 16:46:21 · 467 阅读 · 0 评论 -
JVM 执行引擎
是Java 虚拟机核心的组成部分之一物理机的执行引擎是直接建立在处理器、缓存、指令集和操作系统层面上的,而虚拟机的执行引擎则是由软件自行实现的,因此可以不受物理条件制约地定制指令集与执行引擎的结构体系,能够执行哪些不被硬件直接支持的指令集格式JVM 主要任务是负责装载字节码到其内部,但字节码并不能够直接运行在操作系统之上,因为字节码指令并非等价于本地机器指令,它内部包含的仅仅只是一些能够被 JVM 所识别的字节码指令、符号表,以及其他辅助信息。原创 2023-05-15 13:23:07 · 665 阅读 · 0 评论 -
JVM 直接内存(Direct Memory)
直接内存概述非直接缓冲区: 直接缓冲区:原创 2023-05-13 18:30:42 · 675 阅读 · 0 评论 -
JVM 对象的实例化内存布局和访问定位
初始化成员变量,执行实例化代码块,调用类的构造方法,并把堆内对象的首地址赋值给引用变量, new 指令之后会接着执行方法,把对象按照程序员的意愿进行初始化,这样一个真正可用的对象才算完全创建出来。如果不规整需要维护一个列表,记录哪些内存块是可用的,再分配的时候从列表中找到一块足够大的空间划分给对象实例,并更新列表上的内容。将对象的所属类(即类的元数据信息)、对象的 HashCode 和 对象的GC信息、锁信息等数据存储在对象的对象头中,这个过程的具体设置方式取决于 JVM 实现。3. 处理并发安全问题。原创 2023-05-13 11:17:14 · 369 阅读 · 0 评论 -
JVM 方法区
因为永久代垃圾回收效率很低,在 Full GC 的时候才会触发,而 Full GC 是老年代的空间不足,永久代不足时才会触发。而 Java 中的字节码需要数据支持,通常这种数量会很大以至于不能直接存到字节码里,换另一种方式,可以存到常量池,这个字节码包含了指向常量池的引用。在动态链接的时候会用到运行时常量池。一个有效的字节码文件中除了包含类的版本信息、字段、方法以及接口等描述信息外,还包含一项信息那就是常量池表(Constant Pool Table), 包括各种字面量和对类型、域和方法的符号引用。原创 2023-05-12 15:58:07 · 946 阅读 · 0 评论 -
JVM 堆
一个 JVM 实例只存在一个堆内存,堆也是 Java 内存管理的核心区域Java 堆区在 JVM 启动的时候即被创建,其空间大小也就确定了。是 JVM 管理的最大一块内存空间堆可以处于物理上不连续的内存空间中,但是在逻辑上它应该被视为连续的所有的线程共享 Java 堆,在这里还可以划分线程私有的缓冲区(Thread Local Allocation Buffer, TLAB)所有的对象实例以及数组都应该在运行时分配在堆上。原创 2023-05-11 15:07:31 · 694 阅读 · 0 评论 -
JVM 本地方法
本地方法:为什么要使用 Native Method:原创 2023-05-10 09:51:11 · 546 阅读 · 0 评论 -
JVM 虚拟机栈
由于跨平台性的设计,Java 的指令都是根据栈来设计的。不同平台 CPU 架构不同,所以不能设计为基于寄存器的优点是跨平台, 指令集小,编译器容易实现,缺点是性能下降,实现同样的功能需要更多的指令栈是运行时的单位,即程序如何执行,而堆是存储的单位,数据怎么放,放在哪儿。Java 虚拟机栈(Java Virtual Machine Stack), 早期也叫 Java 栈。每个线程在创建时都会创建一个虚拟机栈,其内部保存一个个栈帧(Stack Frame),对应着一次次的 Java 方法调用。原创 2023-05-09 22:55:30 · 903 阅读 · 0 评论 -
JVM 程序计数器(PC 寄存器)
JVM中的程序计数寄存器( Program Counter Register) 中,Register 的命名源于 CPU 的寄存器, 寄存器存储指令相关的现场信息。CPU 只有把数据装载到寄存器才能够运行JVM 中的 PC 寄存器是对物理 PC 寄存器的一种抽象模拟PC 寄存器用来存储指向下一条指令的地址,也即将要执行的指令代码。由执行引擎读取下一条指令它是一块很小的内存空间,几乎可以忽略不计,也是运行速度最快的存储区域。原创 2023-05-08 22:58:19 · 397 阅读 · 0 评论 -
JVM 类加载子系统
粗略图:详细图:类加载器 ClassLoader 角色:类的加载过程:加载:加载 .class 文件的方式:验证(Verify):准备(Prepare):解析(Resolve):初始化:启动类加载器(引导类加载器,Bootstrap ClassLoader):扩展类加载器( Extension ClassLoader):应用程序类加载器(系统类加载器, AppClassLoader):类加载器实例代码:ClassLoader 的使用说明 为什么要自定义类的加载器:用户自定义类加载器实现步骤:原创 2023-05-08 21:53:05 · 368 阅读 · 0 评论 -
JVM 体系结构
Java 虚拟机的启动是通过引导类加载器(bootstrap class loader) 创建一个初始类(initial class)来完成的,这个类是由虚拟机的具体实现指定的。Java 虚拟机就是二进制字节码的运行环境,负责装载字节码到其内部,解释/编译为对应平台上的机器指令执行。每一条 Java 指令,Java 虚拟机规范中都有详细定义。需要不同语言由自己编译器,生成符合 JSR-292 JVM规范的字节码文件,即可在 Java 虚拟机中运行。性能优秀和执行更高效。原创 2023-05-07 10:36:29 · 468 阅读 · 0 评论 -
Netty RPC实现
【代码】Netty RPC实现。原创 2023-04-07 11:03:57 · 123 阅读 · 0 评论 -
Netty 任务异步线程池源码剖析
在 Netty 中做耗时的,不可预料的操作,比如数据库,网络请求,会严重影响 Netty 对 Socket 的处理速度, 而解决方法就是将耗时任务添加到异步线程池中。原创 2023-04-06 11:29:01 · 132 阅读 · 0 评论 -
Netty EventLoop 源码剖析
每次执行 execute 方法都是向队列中添加任务。当第一次添加时就启动线程,执行 run 方法,而 run 方法是整个 EventLoop 的核心,就像 EventLoop 的名字一样,不停的 Loop。原创 2023-04-05 20:53:53 · 37 阅读 · 0 评论 -
Netty 心跳服务源码剖析
ReaderIdleTimeoutTask、WriterIdleTimeoutTask、AllIdleTimeoutTask 分别对应读、写、读或写 事件。共有一个父类(AbstractIdleTask)。这个父类提供了一个模板方法。每次读取操作都会记录一个时间,定时任务时间到了,会计算当前时间和最后一次读的时间的间隔,如果间隔超过了设置的时间,就触发 UserEventTriggered 方法。当该 handler 被添加到 pipeline 中时,则调用 initialize 方法。原创 2023-04-04 22:32:44 · 80 阅读 · 0 评论 -
Netty 三大核心组件源码剖析
Netty 中的 ChannelPipeline、ChannelHandler 和 ChannelHandlerContext 是非常核心的组件,从源码分析 Netty 是如何设计这三个核心组件的,并分析是如何创建和协调工作的。原创 2023-04-01 21:55:22 · 133 阅读 · 0 评论 -
Netty 接收请求过程源码剖析
接受连接 --> 创建一个新的 NioSocketChannel --> 注册到一个 worker EventLoop 上 --> 注册 selector Read 事件。原创 2023-03-30 22:41:14 · 53 阅读 · 0 评论 -
Netty 服务器启动源码剖析
并会创建 EventExecutor 数组 , 每个元素的类型就是 NIOEventLoop, NIOEventLoop 实现了 EventLoop 接口 和 Executor 接口。这是一个普通的处理器类,用于处理客户端发送来的消息,在这里,则简单的解析出客户端传过来的内容,然后打印,最后发送字符串给客户端。原创 2023-03-29 17:28:51 · 103 阅读 · 0 评论 -
Netty TCP 粘包和拆包
TCP 是面向连接的,面向流的,提供高可靠性服务。收发两端 (客户端 和 服务器端)都要有一一成对的 socket。因此,发送端为了将多个发给接收端的包,更有效的发送给对方,使用了优化方法(Nagle 算法), 将多次间隔较小且数据量小的数据,合并成一个大的数据块,然后进行封包。这样做虽然提高了效率,但是接收端就难于分辨出完整的数据包了,因为面向流通信是无消息保护边界的,需要接收端处理消息边界问题。原创 2023-03-29 15:33:46 · 180 阅读 · 0 评论 -
Netty 解码器-ReplayingDecoder
ReplayingDecoder 扩展了 ByteToMessageDecoder 类, 使用这个类,我们不必调用 readableBytes() 方法。参数 S 指定了用户状态管理类型,其中 Void 代表不需要状态。原创 2023-03-28 17:04:01 · 183 阅读 · 0 评论 -
Netty Handler的调用机制
【代码】Netty Handler的调用机制。原创 2023-03-28 16:45:46 · 120 阅读 · 0 评论 -
Netty Protobuf
RPC[远程过程调用 remote procedure call]支持目前绝大多数语言。, 然后配置环境变量。原创 2023-03-24 23:09:06 · 514 阅读 · 0 评论 -
Netty 编解码器机制
Netty 本身自带的ObjectDecoder 和 ObjectEncoder 可以用来实现 POJO 对象或各种业务对象的编码和解码,底层使用的仍是 Java 序列化技术,而 Java 序列化技术本身效率就不高。原创 2023-03-24 12:08:10 · 55 阅读 · 0 评论 -
Netty WebSocket长连接
【代码】Netty WebSocket长连接。原创 2023-03-24 11:18:52 · 140 阅读 · 0 评论 -
Netty 心跳检测
【代码】Netty 心跳检测。原创 2023-03-23 17:16:36 · 42 阅读 · 0 评论 -
Netty 聊天系统
【代码】Netty 聊天系统。原创 2023-03-22 22:16:03 · 83 阅读 · 0 评论 -
Netty 异步模型
相比传统阻塞 I/O, 执行 I/O 操作后线程会被阻塞住,直到操作完成;异步处理的好处是不会造成线程阻塞, 线程在 I/O 操作期间可以执行别的程序,在高并发情形下会更稳定和更高的吞吐量。当 Future 对象刚刚创建时,处于非完成状态,调用者可以通过返回的 ChannelFuture 来获取操作执行的状态、注册监听函数来执行完成后的操作。原创 2023-03-17 14:07:49 · 77 阅读 · 0 评论 -
Netty 线程模型
做了一定的改进,其中主从 Reactor 多线程模型有多个 Reactor。Reactor 多线程模型。原创 2023-03-03 22:46:36 · 82 阅读 · 0 评论 -
Netty 概述
原生NIO存在的问题:Netty 官网: https://netty.ioNetty 简介:Netty的优点:原创 2023-02-20 17:11:17 · 67 阅读 · 0 评论 -
NIO 零拷贝
Linux 2.1 版本提供了sendFile 函数,数据不经过用户态,直接从内核缓冲区进入到socket buffer,同时,由于和用户态完全无关,就减少了一次上下文切换。3次拷贝,2次状态切换。通过内存映射,将文件映射到内核缓冲区,同时,用户空间可以共享内核空间的数据,在进行网络传输时,就可以减少内核空间到用户控件的拷贝次数。拷贝次数是3次,3次状态切换。Linux 2.4 版本做了一些修改,避免了从内核缓冲区拷贝到socket buffer的操作,直接拷贝到协议栈,从而再一次减少了数据拷贝(原创 2023-02-20 16:41:45 · 121 阅读 · 0 评论 -
NIO 群聊系统
基于NIO 的群聊系统原创 2023-02-20 12:46:31 · 84 阅读 · 0 评论