首页
关于
留言
归档
动态
友链
推荐
虫洞
开往
憶夣
累计撰写
57
篇文章
累计创建
11
个标签
累计收到
2
条评论
栏目
首页
关于
留言
归档
动态
友链
推荐
虫洞
开往
目 录
CONTENT
Java-憶夣
以下是
Java
相关的文章
2023-04-04
Springboot 集成 socket.io
## 摘要 本文介绍了在 **Spring Boot** 中集成 **Socket.IO**(基于 netty-socketio)的完整实现方案,涵盖后端配置与前端对接两部分。 ### 后端 1. **依赖配置**:引入 `netty-socketio` 和 `lombok`。 2. **参数管理**:通过 `application.yml` 配置 host、port、线程数、心跳超时等参数,并用 `@ConfigurationProperties` 注入到 `SocketIO` 类中。 3. **核心配置**:`SocketIOConfig` 类将 `SocketIOServer` 注册为 Spring Bean,同时配置了 `AuthorizationListener` 实现基于 token 的连接认证拦截。 4. **业务服务**:`SocketIOService` 通过 `@OnConnect`、`@OnDisconnect`、`@OnEvent` 注解处理客户端连接、断开及自定义消息事件,使用 `ConcurrentHashMap` 管理已连接客户端,并在 Bean 生命周期中自动启动/停止服务。 ### 前端 通过引入 jQuery 和 Socket.IO 客户端库,使用 `io.connect()` 连接后端(携带 token 认证),监听 `connect`、`push`、`disconnect` 等事件,并通过 `socket.emit('json', data)` 向服务端发送消息,实现双向实时通信。
2023-04-04
115
0
0
Java
2023-04-04
Springboot 安装 websocket(有拦截器)
2023-04-04
55
0
0
Java
2023-04-04
Springboot 安装 websocket(无拦截器)
本文介绍了在SpringBoot中无拦截器环境下快速集成WebSocket的方法,主要包含三个步骤: 1. **配置依赖**:引入`spring-boot-starter-websocket`依赖。 2. **后端配置**:编写配置类注入`ServerEndpointExporter`以自动注册端点;创建服务类,通过`@ServerEndpoint`注解暴露连接路径,利用`ConcurrentHashMap`管理客户端Session,并实现`@OnOpen`、`@OnClose`、`@OnMessage`等注解方法处理连接建立、断开及消息收发逻辑。 3. **前端配置**:使用原生JS建立WebSocket连接,监听各种回调状态,实现消息的页面渲染与发送功能。
2023-04-04
51
0
0
Java
2023-04-04
13、线程安全与锁优化
## 摘要 本文系统介绍了Java中线程安全与锁优化的核心概念。首先,将线程安全按严格程度分为五类:**不可变**(最安全的纯线程安全)、**绝对线程安全**(极少见,如Vector仍需外部同步)、**相对线程安全**(单次操作安全,大多数线程安全类属此类)、**线程兼容**(需调用方加同步,如ArrayList)和**线程对立**(多线程下无法安全使用,已被废弃)。 线程安全的主要实现手段包括:**互斥同步**(synchronized和ReentrantLock,属于悲观策略,存在用户态/内核态切换开销)、**非阻塞同步**(基于CAS等硬件原子指令的乐观策略)以及**无需同步**(可重入代码和ThreadLocal线程本地存储)。 在锁优化方面,JDK 1.6引入了多项技术:**自适应自旋锁**(动态调整自旋时间)、**锁消除**(基于逃逸分析去除不必要同步)、**锁粗化**(合并同一对象的多次加锁)、**轻量级锁**(无竞争时用CAS替代操作系统互斥量)和**偏向锁**(无竞争时完全消除同步操作)。这些优化形成了"偏向锁→轻量级锁→重量级锁"的渐进式升级机制,在保证正确性的前提下显著提升了并发性能。
2023-04-04
61
0
0
Java
2023-04-04
12、Java 内存模型与线程
## 摘要 本章围绕**Java内存模型(JMM)**与**线程机制**展开,核心内容涵盖以下几方面: **1. 硬件背景**:由于处理器与内存速度差异巨大,现代计算机引入高速缓存,但也引入了缓存一致性问题;处理器和JIT编译器还可能进行指令重排序优化。 **2. Java内存模型**:JMM将变量存储在主内存中,每条线程拥有工作内存(主内存副本),线程间通过主内存交互。定义了lock、unlock、read、load、use、assign、store、write共8种原子操作及相应规则,规范了内存访问行为。 **3. volatile关键字**:具备两大语义——保证变量对所有线程的**可见性**和**禁止指令重排序**,但并不保证复合操作的原子性。此外,long/double非原子性协定在实际中几乎不影响开发。 **4. 并发三大特性**:**原子性**(基本读写原子,更大范围靠synchronized)、**可见性**(volatile、synchronized、final)、**有序性**(volatile和synchronized保证)。**先行发生原则**提供了判断操作顺序的规则,是衡量并发安全性的依据。 **5. 线程实现与调度**:Java线程在JDK 1.2后映射为操作系统原生线程(一对一模型),采用**抢占式调度**,可通过优先级"建议"调度但最终由OS决定。线程有新建、运行、无限期等待、限期等待、阻塞、终止六种状态及转换关系。 总之,本章从底层原理出发,系统阐述了JMM如何保证并发安全,以及Java线程的实现机制,为编写高效并发程序奠定了理论基础。
2023-04-04
75
0
0
Java
2023-04-04
11、晚期(运行期)优化
## 摘要 本章介绍了JVM运行期(晚期)优化的核心机制——即时编译(JIT)。Java程序初始由解释器执行,当虚拟机探测到频繁执行的"热点代码"时,会将其编译为本地机器码以提升效率。 **热点探测**采用基于计数器的方式,通过方法调用计数器和回边计数器分别统计方法调用次数与循环体执行次数,超过阈值则触发编译。 **编译架构**上,HotSpot内置Client编译器(C1,注重编译速度)和Server编译器(C2,注重优化质量),并通过分层编译策略协同工作,在启动速度与执行效率间取得平衡。 **关键优化技术**包括:方法内联(最重要的优化,为其他优化奠定基础)、公共子表达式消除、数组边界检查消除,以及前沿的逃逸分析(据此可实现栈上分配、同步消除和标量替换)。 最后,本章对比了JIT与C/C++静态编译器的优劣:JIT受限于编译时间、动态类型安全和虚方法多态等,但得益于运行期性能监控信息,可进行激进优化,在动态性方面具有独特优势。
2023-04-04
52
0
0
Java
2023-04-04
10、早期(编译期)优化
## 第十章 早期(编译期)优化 — 摘要 本章系统讲解了 Java 前端编译器(以 Javac 为代表)的编译过程及 Java 语法糖的原理。 **Javac 编译流程**分为三大阶段:①**解析与填充符号表**:通过词法分析将源码字符流转为 Token,再经语法分析构建抽象语法树(AST),最后由 `Enter` 类填充符号表以登记符号地址与信息。②**插入式注解处理**:基于 JSR-269 规范,在编译期间可读取或修改 AST,若语法树被改动则重新循环处理,直至无修改为止。③**语义分析与字节码生成**:包含标注检查(如常量折叠)、数据与控制流分析、解语法糖(将泛型、自动装箱等还原为基础语法)以及最终由 `ClassWriter` 生成 `.class` 文件,同时完成 `<init>` 和 `<clinit>` 方法的收敛。 **语法糖**部分重点分析了泛型的类型擦除机制——运行时泛型信息被擦除,但元数据(如 `Signature` 属性)仍保留泛型签名,支持反射获取;自动装箱存在 `IntegerCache` 缓存陷阱(-128~127 范围内相同值对象相同);条件编译通过常量 `if` 语句实现,仅限于语句块级别。 **实战**部分演示了编写插入式注解处理器,在编译期自动检查类、方法、字段的命名规范。 > **核心观点**:Javac 作为前端编译器,主要目标是提升编码效率与语法便利性;而真正影响运行性能的是虚拟机内置的后端即时编译器(JIT),它将字节码编译为本地机器码,是衡量 JVM 性能的关键指标。
2023-04-04
57
0
0
Java
2023-04-04
9、类加载及执行于系统的案例与实战
## 摘要 本文主要介绍了Java虚拟机中**类加载器架构**的两大典型案例及**字节码生成技术**的实际应用。 **1. Tomcat的正统类加载器架构**:为满足Web应用的类库隔离、共享、安全及JSP热部署需求,Tomcat自定义了多个类加载器(Common、Catalina、Shared、WebApp、Jsp),采用双亲委派模型,通过不同目录结构实现访问范围的精细控制。 **2. OSGi的灵活类加载器架构**:每个Bundle可声明导入导出包,加载器之间无固定委派关系,形成运行时确定的网状结构,实现模块级热插拔和精确的可见性控制,但也引入了死锁等风险。 **3. 字节码生成与动态代理**:Spring利用动态代理实现Bean增强,可在运行时动态生成代理类,无需预先编写代理代码,实现灵活的方法拦截。 **4. Retrotranslator跨越JDK版本**:通过ASM框架处理字节码,将JDK 1.5编译产物转换为可在1.4/1.3上运行的版本,主要模拟编译器改进和API增强两类新功能。
2023-04-04
50
0
0
Java
2023-04-04
8、虚拟机字节码执行引擎
## 第八章 虚拟机字节码执行引擎 —— 摘要 本章系统讲解了Java虚拟机执行引擎的核心机制,主要涵盖四大部分: **执行引擎概述**:执行引擎是JVM最核心的组件,以字节码为输入、执行结果为输出,可选择解释执行、编译执行(JIT)或二者兼备。 **运行时栈帧结构**:栈帧是方法调用与执行的基本单位,包含局部变量表(以Slot为单位存储变量,Slot可复用)、操作数栈(后进先出)、动态连接(符号引用到直接引用的转换)和方法返回地址(正常退出与异常退出两种方式)。 **方法调用机制**:分为解析(编译期确定,适用于非虚方法如静态方法、私有方法、final方法)和分派两大类。分派包括静态分派(依赖静态类型,对应方法重载)、动态分派(依赖实际类型,对应方法重写,通过虚方法表优化性能)。Java是"静态多分派、动态单分派"语言。JDK 7通过`invokedynamic`指令和`java.lang.invoke`包提供了动态类型语言支持,使方法分派规则可由用户代码控制。 **基于栈的指令集**:JVM采用基于栈的指令集,优点是可移植性强、代码紧凑,缺点是执行速度相对基于寄存器的指令集较慢,可通过栈顶缓存等优化手段缓解。 总而言之,本章揭示了JVM从定位目标方法到执行字节码的完整过程及其底层内存结构。
2023-04-04
66
0
0
Java
2023-04-04
7、虚拟机类加裁机制
## 摘要 本文系统介绍了Java虚拟机的类加载机制,涵盖类加载的全生命周期、各阶段详细过程及类加载器体系。 类从被加载到卸载经历**加载、连接(验证、准备、解析)、初始化、使用和卸载**七个阶段,其中初始化仅在遇到`new`、访问静态字段、调用静态方法、反射调用、初始化子类及指定主类等五种场景下触发。 - **加载**:通过全限定名获取二进制字节流,转化为方法区运行时数据结构,生成`Class`对象。字节流来源多样(ZIP、网络、动态生成等),非数组类的加载开发者可通过自定义类加载器控制。 - **验证**:包括文件格式、元数据、字节码和符号引用四方面校验,确保Class文件安全合规。 - **准备**:为静态变量分配内存并设零值,但`final static`常量会直接赋指定值。 - **解析**:将常量池中的符号引用替换为直接引用,支持运行时动态绑定。 - **初始化**:执行类构造器`<clinit>()`,合并静态变量赋值和静态代码块,虚拟机保证线程安全且父类先于子类初始化。 类加载器方面,**类与加载器共同确定类的唯一性**。Java采用**双亲委派模型**,加载请求自底向上委派至启动类加载器,保证核心类(如`Object`)的一致性。该模型曾因历史原因、SPI机制及热部署需求(如OSGi)而被"破坏",分别通过重写`loadClass`、线程上下文类加载器和网状类加载结构来解决。
2023-04-04
72
0
0
Java
1
2
3
4