ProxySQL 读写分离配置

news2024/11/13 15:25:29

ProxySQL 是一个高性能、高可用的 MySQL 代理软件,旨在提升 MySQL 数据库的可扩展性和性能。它可以在应用程序和 MySQL 服务器之间充当中间层,提供强大的路由、负载均衡和查询优化功能。

ProxySQL 的主要功能:

查询路由

  • ProxySQL 可以根据用户定义的规则,将 SQL 查询路由到不同的 MySQL 服务器或集群。例如,可以将写操作路由到主服务器,将读操作路由到从服务器,从而实现读写分离。

负载均衡

  • ProxySQL 可以在多个 MySQL 实例之间分配查询流量,实现负载均衡。它支持多种负载均衡策略,如轮询、最少连接等。

连接池

  • ProxySQL 提供了高级连接池功能,通过复用 MySQL 连接来减少 MySQL 服务器的连接开销。它还能保持客户端和 MySQL 服务器之间的持久连接,提高整体性能。

查询缓存

  • ProxySQL 内置了查询缓存,可以缓存常见的查询结果,从而减少数据库负载和响应时间。

自动故障切换

  • 当检测到 MySQL 实例故障时,ProxySQL 能自动将流量切换到其他可用的实例,确保高可用性。

监控和统计

  • ProxySQL 提供了丰富的监控和统计信息,帮助用户分析查询性能和流量分布,并支持动态调整配置而无需重启服务。

SSL/TLS 支持

  • ProxySQL 支持 SSL/TLS 加密,确保客户端和 MySQL 服务器之间的数据传输安全。

ProxySQL 的应用场景:

  • 读写分离:通过将写操作路由到主库,读操作路由到从库,减少主库压力,提高读操作性能。
  • 高可用性架构:在主从复制、MHA、Galera Cluster 等高可用架构中作为中间层,提高整体系统的容错能力。
  • 跨数据中心部署:在多数据中心或多区域环境下,优化数据库流量分配,减少跨地域的延迟。
  • 查询优化:通过查询规则重写和查询缓存,提高复杂查询的执行效率。

环境准备

主机名IP地址系统版本安装应用
proxy192.168.226.10rocky_linux-9.4miniProxySQL version 2.6.3
master192.168.226.11rocky_linux-9.4miniMySQL 8.0.39
slave192.168.226.12rocky_linux-9.4miniMySQL 8.0.39

准备三台虚拟机,关闭防火墙和selinux,进行时间同步。 

curl -s https://raw.gitcode.com/Lzcsfg/Shell_Script/raw/main/rocky-linux/rocky-mini9.4.sh | sed 's/\r$//' > rocky-mini9.4.sh && sh rocky-mini9.4.sh

安装mysql8.0 (该脚本会先清楚mysql环境再安装,仅适合测试环境)

curl -s https://raw.gitcode.com/Lzcsfg/Shell_Script/raw/main/mysql/mysql8-rocky9.4.sh | sed 's/\r$//' > mysql8-rocky9.4.sh && sh mysql8-rocky9.4.sh

安装proxysql

官方网站:https://proxysql.com/documentation/installing-proxysql/

cat <<EOF | tee /etc/yum.repos.d/proxysql.repo
[proxysql_repo]
name=ProxySQL repository
baseurl=https://repo.proxysql.com/ProxySQL/proxysql-2.6.x/centos/\$releasever
gpgcheck=1
gpgkey=https://repo.proxysql.com/ProxySQL/proxysql-2.6.x/repo_pub_key
EOF
dnf install -y proxysql
systemctl enable proxysql
systemctl start proxysql
[root@proxy ~]# ss -tnlp
State               Recv-Q              Send-Q                           Local Address:Port                              Peer Address:Port              Process                                            
LISTEN              0                   128                                    0.0.0.0:6032                                   0.0.0.0:*                  users:(("proxysql",pid=20315,fd=29))              
LISTEN              0                   1024                                   0.0.0.0:6033                                   0.0.0.0:*                  users:(("proxysql",pid=20315,fd=25))              
LISTEN              0                   1024                                   0.0.0.0:6033                                   0.0.0.0:*                  users:(("proxysql",pid=20315,fd=24))              
LISTEN              0                   1024                                   0.0.0.0:6033                                   0.0.0.0:*                  users:(("proxysql",pid=20315,fd=23))              
LISTEN              0                   1024                                   0.0.0.0:6033                                   0.0.0.0:*                  users:(("proxysql",pid=20315,fd=22))              
LISTEN              0                   128                                    0.0.0.0:22                                     0.0.0.0:*                  users:(("sshd",pid=12917,fd=3))                   
LISTEN              0                   70                                           *:33060                                        *:*                  users:(("mysqld",pid=22755,fd=21))                
LISTEN              0                   128                                       [::]:22                                        [::]:*                  users:(("sshd",pid=12917,fd=4))                   
LISTEN              0                   151                                          *:3306                                         *:*                  users:(("mysqld",pid=22755,fd=24))  
  • 管理操作:使用 6032 端口,通过 ProxySQL 的 admin 用户连接,执行管理和监控相关的操作。
  • 应用程序操作:使用 6033 端口,通过应用程序用户连接,测试实际的读写分离功能。

配置MySQL主从复制

对master主机操作
[root@master ~]# vim /etc/my.cnf.d/mysql-server.cnf  # 在该配置文件最后追加下述配置
server-id = 1            # 服务器唯一标识,每个服务器在复制环境中应有唯一的ID,用于标识不同的复制实例
 
log-bin = mysql-bin      # 启用二进制日志,指定二进制日志文件的基名,MySQL会在此基名后添加数字和扩展名来创建日志文件
 
binlog-format = ROW      # 设置二进制日志格式为ROW,记录每一行数据的变化,有助于减少数据不一致的风险,也便于从库的并行复制

 重启MySQL

systemctl restart mysqld

以下需要登录mysql执行sql语句  

登录mysql创建远程用户

-- 创建主从复制用户
CREATE USER 'replica'@'%' IDENTIFIED WITH mysql_native_password BY 'admin';  
GRANT ALL PRIVILEGES ON *.* TO 'replica'@'%';  


-- 创建ProxySQL监控用户
CREATE USER 'monitor'@'%' IDENTIFIED WITH mysql_native_password BY 'monitor';  
GRANT PROCESS, REPLICATION CLIENT, SHOW DATABASES ON *.* TO 'monitor'@'%';  
-- FLUSH PRIVILEGES;(这一行是可选的,因为GRANT已经自动更新了权限)

查看主库上的binlog日志 

mysql> show master status;  # 显示主服务器状态,包括二进制日志文件名和位置
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 |      663 |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

对slave主机操作
[root@slave ~]# vim /etc/my.cnf.d/mysql-server.cnf    # 在该配置文件最后追加下述配置
# 从库的唯一标识,与主库和其他从库不同
 
server-id = 2
 
# 设置二进制日志格式为ROW,有助于减少数据不一致的风险
 
binlog-format = ROW
 
# 设置从库为只读模式,防止在从库上直接写入数据导致的数据不一致
 
read-only = 1

重启MySQL

systemctl restart mysqld

以下需要登录mysql执行sql语句 

登录mysql创建远程用户

-- 创建主从复制用户
CREATE USER 'replica'@'%' IDENTIFIED WITH mysql_native_password BY 'admin';  
GRANT ALL PRIVILEGES ON *.* TO 'replica'@'%';  


-- 创建ProxySQL监控用户
CREATE USER 'monitor'@'%' IDENTIFIED WITH mysql_native_password BY 'monitor';  
GRANT PROCESS, REPLICATION CLIENT, SHOW DATABASES ON *.* TO 'monitor'@'%';
-- FLUSH PRIVILEGES;  (这一行是可选的,因为GRANT已经自动更新了权限)
 

配置从库以连接到主库

CHANGE REPLICATION SOURCE TO
    SOURCE_HOST='192.168.226.11',
    SOURCE_USER='replica',
    SOURCE_PASSWORD='admin',
    SOURCE_LOG_FILE='mysql-bin.000001',
    SOURCE_LOG_POS=663;

启动复制进程

START REPLICA;

查看复制状态

SHOW REPLICA STATUS\G;

配置 ProxySQL 

1. 登录到 ProxySQL 管理界面

[root@proxy ~]# mysql -u admin -padmin -h 127.0.0.1 -P 6032 --prompt='Admin> '

2. 在 ProxySQL 中配置 MySQL 服务器

-- 添加主服务器(读写)
INSERT INTO mysql_servers (hostgroup_id, hostname, port, weight) VALUES (0, '192.168.226.11', 3306, 100);

-- 添加从服务器(只读)
INSERT INTO mysql_servers (hostgroup_id, hostname, port, weight) VALUES (1, '192.168.226.12', 3306, 100);
主服务器(读写):

hostgroup_id 是 0,表示主服务器组。
hostname 是 192.168.226.11,这是主服务器的 IP 地址。
port 是 3306,这是 MySQL 的默认端口。
weight 是 100,表示该服务器的权重。权重值用于负载均衡,值越大,分配到它的流量越多。


从服务器(只读):

hostgroup_id 是 1,表示从服务器组。
hostname 是 192.168.226.12,这是从服务器的 IP 地址。
port 和 weight 同主服务器的设置。

3. 配置 MySQL 用户

-- 添加 ProxySQL 用于连接 MySQL 服务器的用户
INSERT INTO mysql_users (username, password, default_hostgroup) VALUES ('replica', 'admin', 0);

-- 添加监控 monitor 用户的密码
INSERT INTO mysql_users (username, password, default_hostgroup) VALUES ('monitor', 'monitor', 0);
username 是 replica,用于连接 MySQL 服务器的用户名。
password 是 admin,这是用户的密码。
default_hostgroup 是 0,表示默认使用主服务器组。对于只读查询,代理将会路由到从服务器组,具体取决于路由规则。

4. 配置读写分离的路由规则

-- 配置 SELECT 语句到从服务器
INSERT INTO mysql_query_rules (rule_id, active, match_pattern, destination_hostgroup, apply) VALUES (1, 1, '^SELECT', 1, 1);

-- 配置 INSERT, UPDATE, DELETE 语句到主服务器
INSERT INTO mysql_query_rules (rule_id, active, match_pattern, destination_hostgroup, apply) VALUES (2, 1, '^INSERT|^UPDATE|^DELETE', 0, 1);
SELECT 语句路由规则:

rule_id 是 1,这是规则的唯一标识符。
active 是 1,表示规则是激活的。
match_pattern 是 '^SELECT',正则表达式,用于匹配以 SELECT 开头的 SQL 查询。
destination_hostgroup 是 1,表示查询将路由到从服务器组。
apply 是 1,表示规则将应用于查询。


INSERT, UPDATE, DELETE 语句路由规则:

rule_id 是 2。
match_pattern 是 '^INSERT|^UPDATE|^DELETE',正则表达式,用于匹配 INSERT、UPDATE 或 DELETE 操作。
destination_hostgroup 是 0,表示这些操作将路由到主服务器组。
apply 是 1,表示规则将应用于查询。

5. 应用更改

-- 重新加载 ProxySQL 配置
LOAD MYSQL SERVERS TO RUNTIME;
LOAD MYSQL USERS TO RUNTIME;
LOAD MYSQL QUERY RULES TO RUNTIME;

-- 保存配置到磁盘
SAVE MYSQL SERVERS TO DISK;
SAVE MYSQL USERS TO DISK;
SAVE MYSQL QUERY RULES TO DISK;
LOAD MYSQL SERVERS TO RUNTIME:将服务器配置加载到运行时配置中。
LOAD MYSQL USERS TO RUNTIME:将用户配置加载到运行时配置中。
LOAD MYSQL QUERY RULES TO RUNTIME:将查询规则加载到运行时配置中。
SAVE MYSQL SERVERS TO DISK:将服务器配置保存到磁盘,以便重启后仍然有效。
SAVE MYSQL USERS TO DISK:将用户配置保存到磁盘。
SAVE MYSQL QUERY RULES TO DISK:将查询规则保存到磁盘。

 这些操作确保 ProxySQL 配置在运行时被应用,并且在重新启动 ProxySQL 后仍然有效。

-- 查看存储的服务器配置
SELECT * FROM mysql_servers;

-- 查看存储的用户配置
SELECT * FROM mysql_users;

-- 查看存储的查询规则
SELECT * FROM mysql_query_rules;

-- 查看 ProxySQL 服务器状态
SELECT * FROM stats_mysql_connection_pool;

配置文件存储位置:

[root@proxy ~]# grep -E 'datadir|admin_variables' /etc/proxysql.cnf
# On startup, ProxySQL reads its config file (if present) to determine its datadir. 
# datadir (i.e. "/var/lib/proxysql/proxysql.db").
datadir="/var/lib/proxysql"
admin_variables=
[root@proxy ~]# ls -l /var/lib/proxysql
total 428
-rw-r--r-- 1 root root   1082 Aug 23 10:15 proxysql-ca.pem
-rw-r--r-- 1 root root   1086 Aug 23 10:15 proxysql-cert.pem
-rw-r--r-- 1 root root   1675 Aug 23 10:15 proxysql-key.pem
-rw-r--r-- 1 root root 225280 Aug 23 11:29 proxysql.db
-rw-r----- 1 root root  15710 Aug 23 11:37 proxysql.log
-rw-r--r-- 1 root root 184320 Aug 23 11:37 proxysql_stats.db

下载SQLite 工具(选做)

dnf install -y sqlite

 使用 sqlite3 工具打开数据库文件

  1. 打开 SQLite 数据库

    使用 SQLite 工具打开 proxysql.db 文件:

    sqlite3 /var/lib/proxysql/proxysql.db
  2. 查看数据库中的表格

    在 SQLite 提示符下,列出所有表格:

    .tables

  3. 查询表格中的数据

    例如,要查看 mysql_servers 表中的所有数据,可以执行:

    SELECT * FROM mysql_servers;

    类似地,你可以查看其他表格,比如 mysql_usersmysql_query_rules,以获取你在 ProxySQL 中配置的数据:

    SELECT * FROM mysql_users; SELECT * FROM mysql_query_rules;

  4. 退出 SQLite 提示符

    使用以下命令退出 SQLite 提示符:

    .quit

查看 proxysql.log 文件

proxysql.log 文件记录了 ProxySQL 的运行日志。你可以使用 catlesstail 命令来查看其内容。

  • 查看最新的日志条目

    tail -f /var/lib/proxysql/proxysql.log

查看 proxysql_stats.db 文件

类似于 proxysql.db 文件,proxysql_stats.db 也是一个 SQLite 数据库文件。你可以用相同的方式查看其内容:

sqlite3 /var/lib/proxysql/proxysql_stats.db

在 SQLite 提示符下,列出所有表格和查询数据的方法与 proxysql.db 相同。

总结

  • 查看 proxysql.db:使用 sqlite3 工具来查询配置和状态数据。
  • 查看 proxysql.log:使用 catlesstail 命令来查看日志文件。
  • 查看 proxysql_stats.db:使用 sqlite3 工具来查询统计数据。

测试 ProxySQL 配置

测试一 :

在测试读写分离的功能时,应使用你配置的应用程序用户(如 replica 用户),并连接到 ProxySQL 的客户端接口(默认端口 6033)。这个用户应该是应用程序使用的用户,用于执行实际的读写操作,从而验证 ProxySQL 的路由规则是否正确生效。

[root@proxy ~]# mysql -u replica -padmin -h 127.0.0.1 -P 6033
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 11
Server version: 5.5.30 (ProxySQL)

Copyright (c) 2000, 2024, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> 

这样就可以执行sql语句了

首先在ProxySQL这里执行写操作,然后去master和slave查看验证数据同步,正确情况都是同步了的。

CREATE DATABASE test_db;
USE test_db;

CREATE TABLE test_table (
    id INT PRIMARY KEY,
    data VARCHAR(255)
);
-- 执行写操作
INSERT INTO test_table (id, data) VALUES (1, 'test data');

测试二 : 

现在去slave主机中的mysql操作一个写操作,验证slave中的sql语句不会同步到master里 

-- 插入测试数据到 test_table 表
INSERT INTO test_table (id, data) VALUES (2, 'test data');

现在去proxysql主机和master中查看,正确情况是proxysql中能查询到slave插入的数据,而master的数据库中查不到。

测试三 :

模拟master宕机,将master的MySQL服务关闭,然后进行读写验证

正确情况下是可以执行读操作的,但是写操作就会提示连接不上而失败。

然后将master的MySQL恢复,执行插入操作就会立即成功了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2070103.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

王者站撸分析

王者站撸分析 问题背景 有这样两个角色 其中一个角色的被动是受到攻击会减少攻击者的攻速1%,该被动可以叠加40层 另一个角色的被动是攻击敌方会提升自己1%的免伤效果&#xff0c;该被动可以叠加20层。 在站撸情况下 哪方胜算更大&#xff1f; 为了解决这个问题&#xff0c;我…

基于Flask-REXTs创建一个项目接口并利用github上传部署

实习过程中需要自己单独编写一个项目使用到的api&#xff0c;并独立完成api的上传部署&#xff0c;这里记录一下全过程。 第一步 编写本地代码 IDE pycharm上创建一个项目名称&#xff0c;然后所有项目文件及结构如下&#xff1a; 其中app.py文件就是实现的接口&#xff0c;就…

ant design pro 如何实现动态菜单带上 icon 的

ant design pro 如何去保存颜色ant design pro v6 如何做好角色管理ant design 的 tree 如何作为角色中的权限选择之一ant design 的 tree 如何作为角色中的权限选择之二ant design pro access.ts 是如何控制多角色的权限的ant design pro 中用户的表单如何控制多个角色 如上图…

免费无损音乐、音效素材,马住着6个网站

如果你正在寻找免费的无损音乐和音效素材&#xff0c;这里有6个网站可以帮助你找到高质量的资源。无论是制作视频、播客还是其他创意项目&#xff0c;这些平台提供了丰富的选项&#xff0c;满足你的各种需求。 1、菜鸟图库 音效素材下载_mp3音效大全 - 菜鸟图库 菜鸟图库音…

Datawhale X 李宏毅苹果书 AI夏令营 学习笔记(三)

批量归一化(Batch Normalization&#xff0c;BN) 如果说自适应学习率是让训练适应loss&#xff0c;那归一化就是让loss适应训练。 我们抛掉使用自适应学习率的想法&#xff0c;重新看下面的图。可以看到w1固定时&#xff0c;w2的梯度是比较大的。w2固定时&#xff0c;w1的梯度…

GitHub开源的PDF管理工具Stirling-pdf

Stirling pdf 手动搭建docker搭建 官网&#xff1a;https://github.com/Stirling-Tools/Stirling-PDF 手动搭建 Ubuntu2404环境 安装所需软件包 apt install -y git automake autoconf libtool libleptonica-dev pkg-config zlib1g-dev make g openjdk-21-jdk python3…

【R语言】基于nls函数的非线性拟合

非线性拟合 1.写在前面2.实现代码 1.写在前面 以下代码记录了立地指数的计算过程&#xff0c;包括了优势树筛选、误差清理、非线性拟合以及结果成图。 优势树木确定以及数据清理过程&#xff1a; 相关导向函数&#xff1a; 2.实现代码 ##*******************************…

web测试之功能测试常用的方法有哪几种?有什么要点要注意?

1、前言 功能测试就是对产品的各功能进行验证&#xff0c;根据功能测试用例&#xff0c;逐项测试&#xff0c;检查产品是否达到用户要求的功能。 2、常用的测试方法如下&#xff1a; 1、页面链接检查&#xff1a; 每一个链接是否都有对应的页面&#xff0c;并且页面之间切换…

在Excel中“直接引用”字符串地址

indirect是Excel唯一可以拥有直接解析字符串引用地址参数能力的函数&#xff0c;是绝无仅有的宝贝疙瘩。 (笔记模板由python脚本于2024年08月21日 12:45:49创建&#xff0c;本篇笔记适合喜欢用Excel处理数据的coder翻阅) 【学习的细节是欢悦的历程】 Python 官网&#xff1a;ht…

Navicat中怎么查看数据库密码

一、版本问题 场景&#xff1a;在配置数据库连接后&#xff0c;忘记了数据库的密码&#xff0c;想要找回来。 其实有些版本&#xff08;好像是低版本才有&#xff0c;具体哪个版本就没去研究了&#xff09;在配置连接页面&#xff0c;是有个选项勾选是否显示密码的&#xff0…

Datawhale AI 夏令营(第五期) 李宏毅苹果书 Task 1 《深度学习详解(入门)》- 1.1 通过案例了解机器学习

预测本频道观看人数&#xff08;上&#xff09; - 机器学习基本概念简介_哔哩哔哩_bilibili 1 隐藏任务&#xff1a;找出本篇中形如回归&#xff08;regression&#xff09;加粗字体的术语&#xff0c;并用自己的话进行解释&#xff0c;列成表格 术语解释机器学习&#xff08;…

改VS2008 MFC项目 C语言1改字体,2颜色,3界面禁用项 CCM4202S量产SP下载工具 天津国芯

效果 1改字体 用progresss上画文字&#xff0c;并改字体及大小 要修改 DrawText 函数绘制文本的字体大小&#xff0c;你需要在绘制之前设置设备上下文的字体。这里是一个完整的示例&#xff0c;展示了如何在使用 DrawText 函数之前设置字体大小。 假设你已经有一个 HDC 设备…

85.游戏改造-修改UI分辨率,面向对象方式

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 内容参考于&#xff1a;易道云信息技术研究院 上一个内容&#xff1a;84.游戏改造-窗口化下的分辨率 首先剑侠情缘这个游戏它按f9是可以隐藏ui界面的&#xf…

stm32-USB-1

1. USB简介 USB&#xff0c; 英文全称&#xff1a;Universal Serial Bus&#xff0c;即通用串行总线 USB提供适合各种应用的传输协议&#xff0c;而且协议标准向下兼容 优缺点 2. USB2.0拓扑结构 USB是一种主从结构的系统&#xff0c;数据交换只能发生在主从设备之间&#…

Jenkins配置SSH凭据

在jenkins中&#xff0c;绕不开的便是操作远程的SSH服务器&#xff0c;如向远程服务器传送文件、在远程服务器上执行脚本或者命令等&#xff0c;而这一切的前提&#xff0c;则需要配置访问远程服务器的凭据&#xff0c;常用的方式包括远程服务器的账号和密码以及密匙对等&#…

编译 ARM 平台 Qt5.12.9 源码-思维导图-学习笔记-基于正点原子阿尔法开发板

编译 ARM 平台 Qt5.12.9 源码 概述 库的后缀名 Windows平台&#xff1a;编译出的Qt库文件后缀为.dll Linux平台&#xff1a;编译出的Qt库文件后缀为.so 这些库被称为动态库&#xff0c;意味着它们在运行时被加载到应用程序中&#xff0c;而不是在编译时静态链接 库的作用 …

Linux--数据链路层(macarp)

目录 1.认识以太网 2.以太网帧格式 3.模拟一次局域网通信&#xff08;交换机&#xff09; 4.认识 MAC 地址 对比理解 MAC 地址和 IP 地址 5.认识MTU MTU 对 IP 协议的影响 MTU 对 UDP 协议的影响 MTU 对于 TCP 协议的影响 6.ARP协议 ARP 协议的作用及原理 ARP 数据报的…

【精选】基于移动端的个人博客系统的设计与实现(源码+定制+辅导)

博主介绍&#xff1a; ✌我是阿龙&#xff0c;一名专注于Java技术领域的程序员&#xff0c;全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师&#xff0c;我在计算机毕业设计开发方面积累了丰富的经验。同时&#xff0c;我也是掘金、华为云、阿里云、InfoQ等平台…

Java面试题--JVM大厂篇之JVM 大厂面试题及答案解析(2)

&#x1f496;&#x1f496;&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎你们来到我的博客&#xff01;能与你们在此邂逅&#xff0c;我满心欢喜&#xff0c;深感无比荣幸。在这个瞬息万变的时代&#xff0c;我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而我的博客&…