理解Java虚拟机JVM part4—类的文件结构和类的加载过程详解
类的文件结构
什么是字节码文件
在 Java 中,JVM 可以理解的代码就叫做字节码,也就是
.java文件经过 Java 编译器编译后产生的扩展名为
.class 的文件。
字节码不是机器码,也不是人类可读的源代码,而是一种平台无关的二进制指令集,它不面向任何特定的处理器,只面向虚拟机,是一种中间语言
这是 Java 跨平台的核心实现。因为Java
程序编译成字节码后,可在任何安装了兼容 JVM
的平台上运行,无需重新编译。这是通过“虚拟机抽象层”实现的。
Java
语言通过字节码的方式,在一定程度上解决了传统解释型语言执行效率低的问题,同时又保留了解释型语言可移植的特点。
Clojure(Lisp 语言的一种方言)、Groovy、Scala、JRuby、Kotlin
等语言都是运行在 Java
虚拟机之上。下图展示了不同的语言被不同的编译器编译成.class文件最终运行在
Java 虚拟机之上。.class文件的二进制格式可以使用 WinHex 查看。
运行在 Java
虚拟机之上的编程语言
Class 文件结构
根据...
理解Java虚拟机JVM part3—深入理解JVM垃圾回收机制
前言
当需要排查各种内存溢出问题、当垃圾收集成为系统达到更高并发的瓶颈时,我们就需要对这些“自动化”的技术实施必要的监控和调节。
如果没有特殊说明,都是针对的是 HotSpot 虚拟机。
常见面试题:
如何判断对象是否死亡(两种方法)。
简单的介绍一下强引用、软引用、弱引用、虚引用(虚引用与软引用和弱引用的区别、使用软引用能带来的好处)。
如何判断一个常量是废弃常量
如何判断一个类是无用的类
垃圾收集有哪些算法,各自的特点?
HotSpot 为什么要分为新生代和老年代?
常见的垃圾回收器有哪些?
介绍一下 CMS,G1 收集器。
Minor Gc 和 Full GC 有什么不同呢
堆空间的基本结构
Java 堆是垃圾收集器管理的主要区域,因此也被称作 GC
堆(Garbage Collected Heap)。
Java 的自动内存管理主要是针对对象内存的回收和对象内存的分配。
实际上,Java 堆划分不同区域,本质是为了适配...
理解Java虚拟机JVM part2—HotSpot虚拟机对象的创建过程解析
HotSpot虚拟机介绍
HotSpot 是 Oracle/Sun JDK、OpenJDK 默认的虚拟机,也是目前应用最广泛的
Java 虚拟机
HotSpot 有个东西比较牛逼,过计数器识别 “热点方法” 和
“热点循环”,对热点代码进行即时编译(JIT),将字节码编译为本地机器码执行,大幅提升性能,这个还真和纯解释执行不太一样,因为它是解释器(Interpreter)+
即时编译器(C1/C2)结合,解释器保证启动速度,JIT 保证运行性能。
对象的创建
v-8
那么大概就是这些步骤,这些步骤要都了解的
那么这环环相扣的五步可以简单来说成:校验→分配→初始化→元信息设置→构造执行
Step1:类加载检查
这步的核心是确认“能创建”
JVM 接收到 new XXX()
指令时,首先去检查这个指令的参数是否能在常量池中定位到这个类的符号引用,并且检查这个符号引用代表的类是否已被加载过、解析和初始化过。如果没有,那必须先执行相应的类加载过程
类加载的最终产物是 Class 对象,类加载会直到生成
XXX 的...
理解Java虚拟机JVM part1—内存结构
认识和理解JVM
因为这里是 JVM 这部分的第一块,从这里,我得回顾一下 JVM
的一些基础内容,作为基础了
JVM全称为Java Virtual
Machine(Java虚拟机)。它是运行Java字节码(.class文件)的虚拟计算机,它是一个虚构出来的计算机。
它屏蔽了底层操作系统和硬件的差异,实现了“一次编写,到处运行”(Write
once,Run Anywhere)
可见,JVM是 Java
天天吹的一次编写,处处运行(WORA)的关键内容,而且可知,我们写的Java代码会先被编译成一种中间语言(字节码,
.class文件),那么之后 JVM 的关键工作就是:
加载:找到这些.class文件
翻译&执行:把字节码指令一条条翻译成特定操作系统的机器码,并指挥CPU执行
管理资源:给程序运行过程中需要的各种“东西”(对象、信息)分配内存空间(堆、栈等),并在不需要时清理掉(垃圾回收)
因此,按照JVM的工作内容,JVM
主要由三个子系统组成(怎么又有四个):
类加载器:负责从文件系统或网络中加载
.class...
详解Java中的泛型及其各种特点
什么是泛型
泛型,即“参数化类型”,这是泛型的本质
也就是说,允许你在定义类、接口、方法时,将类型(如String、Integer)作为
“参数” 传入
这个操作让代码可以适配多种数据类型,同时保持了编译期的类型安全
定义方法的时候我们都需要定义形参列表,普通方法的形参列表中,每个形参的数据类型是确定的,而变量是一个参数。
image-20260120125635468
在调用普通方法时需要传入形参对应的数据类型的变量(实参),若传入的实参与形参定义的数据类型不匹配,则会报错,也就是ClassCastException
那么泛型就通过将类型参数化,使得数据类型也可以被设置为一个参数,在使用时再从外部传入一个数据类型,而一旦传入了具体的数据类型后,传入变量(实参)的数据类型如果不匹配,编译器就会直接报错。
image-20260120125826478
那么,上述的 T 就是类型参数占位符,代表任意引用类型,
当你需要返回一个 User 对象时,就用
ApiResponse<User>;
当你需要返回一个...
常用Git命令与知识总结
配置相关
配置基础配置
这类命令用于配置 Git 的全局 或 局部参数,如用户名、邮箱,是使用 Git
的第一步,确保提交记录归属正确。
123git config# 常用格式git config [--global] key value
例如
12345678# 配置全局用户名git config --global user.name "Your Name"#配置全局邮箱git config --global user.email "your@email.com"# 查看所有配置git config --list# 配置默认编辑器为 VSCodegit config --global core.editor "code --wait"
该命令没有什么输出,但是可能会弹出交互的填写内容
--global:全局配置,保存在用户目录下的
.gitconfig 文件(如 Windows 的
C:\Users\你的用户名\.gitconfig,macOS...
对项目管理与项目设计的一些反思和总结
MVP
MVP (Minimum Viable Product)
一个好创意的价值不在于“它看起来多酷”,而在于它能不能从
MVP 慢慢被打磨,成长为一个真正的精品产品。
我应该一直记住这句话
MVP 是创意的雏形,验证“这个方向对不对”;
而产品优化,则是不断收集反馈、迭代改进,把“能用”变成“好用”,最终成为用户离不开的精品。
UX三大法则:好用、好达、好愉悦
UX(User Experience)用户体验
用户体验(UX)的力量不只是“能不能用”,而是“好不好用”,甚至“让不让人喜欢用”。
我们的智研产品,对于部分弹窗的设计,部分页面的跳转,就存在好达方面的欠缺
在用户的操作存在问题的时候,应该在尽早的业务环节来提示;在用户使用一套常用的流程的时候,应该摆在最明显的位置,哪怕它不好看
对于 UX...
Spring Cloud part31—Spring Cloud微服务场景下集成Seata分布式事务的四种实现
开始演示前的准备工作
搭建项目
其实设计三个子模块足矣
服务名
功能
数据库
order-service
创建订单(主业务入口)
order_db
account-service
扣减用户余额
account_db
storage-service
扣减库存
storage_db
这是 Seata 官方示例的经典三服务模型,非常适合演练
集成 Seata Server
到你的项目中
下载 Seata Server(如
1.7.0),https://github.com/seata/seata/releases,然后把依赖添加到每个子项目中,这个就不说了,关于
Seata 如何安装配置,就不讲了
那么在项目开始编写之前,需要进入 seata-server/bin/
目录运行seata-server.bat然后启动seata,如果你配置了
Nacos...
如何编写nginx配置文件,以部署Web服务
Nginx是什么
因为我之前没怎么接触过 nginx,个人配置 Web 服务器几乎全部使用
Apache,所以说我也是重新学习一下
Nginx是 lgor Sysoev 为俄罗斯访问量第二的 rambler.ru
站点设计开发的。从2004年发布至今,凭借开源的力量,已经接近成熟与完善。
Nginx
是一种代理服务器,代理服务器是一种位于客户端与服务器之间的中间层服务器,其主要功能是转发客户端的请求到目标服务器,并将目标服务器的响应返回给客户端,并在中间提供各种功能。在生产环境中,几乎所有现代
Web 应用架构都会将...
HTTP协议详解
了解HTTP协议
HTTP 简介
HTTP 是 Hyper Text Transfer
Protocol,超文本传输协议,HTTP是万维网的数据通信的基础,是互联网的基石。
因为 HTTP
定义了客户端(如浏览器)与服务器之间如何通信,以传输超文本(如
HTML、图片、视频等)。作为应用层协议,HTTP 基于 TCP 协议(默认端口
80),并通过请求 - 响应模型实现数据交换。
HTTP的发展是由 蒂姆·伯纳斯·李
于1989年在欧洲核子研究组织(CERN)所发起,最初版本为HTTP/0.9,仅支持
GET 方法和纯文本响应。HTTP 在 1.0 实现了允许非持久连接。
HTTP的标准制定由万维网协会(World Wide Web
Consortium,W3C)和互联网工程任务组(Internet Engineering Task
Force,IETF)进行协调,最终发布了一系列的RFC,其中最著名的是1999年6月公布的
RFC 2616,定义了HTTP协议中现今依旧广泛使用的一个版本——HTTP 1.1。而 HTTP
2.0 标准于...
详解RPC,并与HTTP进行对比——既生瑜何生亮
HTTP协议
对HTTP协议的详解先不放到这里,移到了另外一章,看到这篇的默认认为了解
HTTP 协议
https://www.ergoutreegal.cn/posts/30445.html
RPC协议
为什么要有RPC协议
RPC,全称 Remote Procedure
Call,远程过程调用,是一种允许程序调用另一个地址空间(通常是在网络中的另一台计算机上)的程序的协议。它使得程序能够像调用本地函数一样调用远程函数,而无需显式编码这些远程交互的细节。
但这个名字起的一点都不好,过分强调了和LPC(本地过程调用)的对比。没有突出出来
RPC 本身涉及到的一些技术特点。
我非常同意上述观点,跟他妈的鲁棒性那个翻译似的
什么意思
假设你有两台电脑:
本地电脑
A:你写的程序运行在这里,想获取用户信息;
远程电脑 B:数据库在这,有一个
getUserInfo(userId) 函数能查用户信息。
如果没有 RPC,你要实现 “调用 B 的函数”,得自己做这些事:
手动写网络通信代码,比如用 Socket,把...
Spring Security part14—Session认证与会话管理机制
前置芝士
了解Session
Session就是会话(会话管理,Session
Management),是指服务器用来跟踪用户状态的一种机制。
因为 HTTP
协议是无状态(Stateless)的。这意味着服务器处理完你的一个请求后,就会立刻“忘记”你是谁。
一旦你有了一个 认证请求
的应用程序,重要的是要考虑如何在未来的请求中持久化和恢复所产生的认证。
Spring Security
虽然会在默认情况下是自动完成的,所以不需要额外的代码。但是,如果没有
Session,你每点击一个网页都需要重新登录。
那么它是如何工作的呢?当你登录成功后,服务器会在内存(或数据库)中开辟一块空间存储你的信息,并生成一个唯一的
Session ID。
服务器通过响应头将这个 Session ID 发给浏览器,浏览器通常将其存入
Cookie 中,这就是使用 Session-Cookie
方案进行身份验证。后续你发送请求时,浏览器会自动带上这个
Cookie,服务器识别 ID 后就知道:“哦,又是那个已经登录过的二狗”。
而引入 Session...
















