当前位置: 首页 > news >正文

Java 虚拟机:承载 Java 生态的神奇魔盒

在软件开发的世界里,Java 虚拟机(JVM)就像一位智慧的管家,默默守护着 Java 生态系统的运行。它不仅让 Java 实现了"一次编写,到处运行"的梦想,更是成为了多种编程语言的运行平台。让我们一起走进 JVM 的世界,揭开它神秘的面纱。

JVM 的本质是一个规范,它定义了一套完整的计算机架构,包括指令集、寄存器、运行时数据区等。当我们编写 Java 代码时,编译器会将源代码转换成字节码,这些字节码就是 JVM 的通用语言。一个简单的 Java 程序从源码到运行的过程是这样的:

// 源代码
public class Hello {public static void main(String[] args) {System.out.println("Hello, JVM!");}
}// 编译后的字节码
public class Hello {public static void main(java.lang.String[]);Code:0: getstatic     #2  // Field java/lang/System.out:Ljava/io/PrintStream;3: ldc           #3  // String Hello, JVM!5: invokevirtual #4  // Method java/io/PrintStream.println:(Ljava/lang/String;)V8: return
}

JVM 的内存模型是其核心特性之一。它将运行时数据区分为堆、方法区、虚拟机栈、本地方法栈和程序计数器。堆是 Java 程序最主要的内存区域,所有的对象实例都在这里分配。方法区存储类信息、常量、静态变量等数据。虚拟机栈为每个线程创建,用于存储局部变量表、操作数栈等。

垃圾回收(GC)是 JVM 最引人注目的特性。不同于 C/C++ 需要手动管理内存,JVM 通过自动垃圾回收机制,帮助开发者处理内存释放的问题。现代的垃圾回收器采用分代收集理论,将堆空间分为新生代和老年代,针对不同特点的对象采用不同的回收策略。

想象一下,你经营一家图书馆,新书一般放在入口处的新书区(新生代),而经典书籍则放在内部书架(老年代)。新书区的书籍更替频繁,而内部书架的书籍相对稳定。JVM 的垃圾回收也是类似的道理,新生代采用复制算法快速回收,老年代则使用标记-清除或标记-整理算法进行回收。

JVM 的类加载机制也是其重要特性。当程序运行需要使用某个类时,JVM 会通过类加载器将类的字节码加载到内存中。类加载过程包括加载、验证、准备、解析和初始化五个阶段。这个过程就像图书馆采购新书,需要经过选书、验证真伪、编目、上架等步骤。

// 自定义类加载器示例
public class CustomClassLoader extends ClassLoader {@Overrideprotected Class<?> findClass(String name) throws ClassNotFoundException {byte[] classData = loadClassData(name); // 加载类数据return defineClass(name, classData, 0, classData.length);}private byte[] loadClassData(String name) {// 实现类数据的加载逻辑return null;}
}

JVM 调优是一门既科学又富有艺术性的工作。通过调整堆大小、垃圾回收器参数、线程池配置等,我们可以优化程序性能。比如,一个常见的内存问题是频繁的 Full GC,导致程序响应变慢。通过分析 GC 日志,我们可能发现是因为堆内存设置不合理或者内存泄漏导致的。

在实际工作中,JVM 监控工具是我们的得力助手。JVisualVM、JProfiler 等工具可以帮助我们实时监控内存使用、线程状态、CPU 占用等指标。通过这些工具,我们能够发现潜在的性能问题,及时进行优化。

面对分布式系统的挑战,JVM 也在不断进化。新的垃圾回收器如 G1、ZGC 提供了更低的停顿时间和更高的吞吐量。JIT(即时编译)技术能够在运行时将热点代码编译成机器码,提升程序性能。这些技术创新让 Java 在云计算、大数据等领域保持着强大的生命力。

深入理解 JVM 不仅能帮助我们写出更好的代码,还能在遇到问题时找到解决方案。比如,当系统出现 OutOfMemoryError 时,了解 JVM 内存模型的开发者能够快速定位是哪个内存区域出现了问题。当服务响应变慢时,熟悉 GC 机制的开发者能够通过分析 GC 日志找到性能瓶颈。

在微服务架构中,每个服务都运行在独立的 JVM 中,对 JVM 的深入理解变得更加重要。合理的 JVM 参数配置可以帮助服务更好地利用系统资源,提供更稳定的性能。比如,对于内存密集型服务,我们可能需要配置较大的堆空间;而对于计算密集型服务,我们可能需要调整 JIT 编译器的参数。

5bfc7cb7fc14438a854659363652add1.png

随着 Java 生态的发展,JVM 也在不断进步。Project Loom 带来的虚拟线程将改变 Java 并发编程的方式,Panama 项目让 Java 与本地代码的互操作更加便捷。这些创新让 JVM 在新的技术浪潮中继续发光发热。

JVM 就像一个永不停歇的魔法工厂,它让 Java 程序能够安全、高效地运行在各种平台上。作为 Java 开发者,了解 JVM 的工作原理,掌握调优技巧,将帮助我们构建更可靠、更高效的应用系统。在软件开发的道路上,JVM 是我们值得信赖的伙伴。

相关文章:

Java 虚拟机:承载 Java 生态的神奇魔盒

在软件开发的世界里&#xff0c;Java 虚拟机&#xff08;JVM&#xff09;就像一位智慧的管家&#xff0c;默默守护着 Java 生态系统的运行。它不仅让 Java 实现了"一次编写&#xff0c;到处运行"的梦想&#xff0c;更是成为了多种编程语言的运行平台。让我们一起走进…...

Linux VLAN 实现原理技术笔记

一、引言 VLAN&#xff08;虚拟局域网&#xff09;在整车网络架构中起着至关重要的作用&#xff0c;它能够在物理网络基础设施上创建逻辑隔离的网络区域&#xff0c;提高车内网络的安全性、灵活性和性能。Linux 内核通过一系列复杂的机制实现了 VLAN 功能&#xff0c;本技术笔记…...

【Git】:分支管理

目录 理解分支 创建分支 切换分支 合并分支 删除分支 合并冲突 分支管理策略 快进合并 正常合并 bug 分支 总结 理解分支 在版本控制系统中&#xff0c;分支是一条独立的开发线路。它允许开发者从一个主要的代码基线&#xff08;例如master分支&#xff09;分离出来…...

Java中的运算符“instanceof“详解

在Java中&#xff0c;instanceof运算符用于检查一个对象是否是某个特定类的实例&#xff0c;或者是否实现了某个特定接口。它返回一个布尔值&#xff08;true或false&#xff09;&#xff0c;用于在运行时进行类型检查。这在处理多态性时尤其有用&#xff0c;可以帮助我们确定对…...

Profinet转Modbus TCP西门子SINAMICS G120变频器与施耐德M580通讯案例

一. 案例背景 在复杂的工业自动化场景中&#xff0c;企业常常会采用不同品牌的设备来构建生产系统。西门子SINAMICS G120变频器以其高性能、高精度的速度和转矩控制功能&#xff0c;在电机驱动领域应用广泛。施耐德M580可编程逻辑控制器则以强大的逻辑控制和数据处理能力著称&a…...

机器学习实战笔记39-43树模型基础

目前最常用的是CART树&#xff1a; 评价标准&#xff1a;每次划分后子节点的纯度&#xff08;即是否标签都为0/1&#xff09;&#xff0c;分为信息熵、基尼系数&#xff08;越小则纯度越高&#xff09;和分类误差 找划分节点的方法&#xff1a;CART树无需区分连续和离散变量&am…...

`uni.setClipboardData` 是 uni-app 提供的一个 API 设置系统剪贴板的内容

uni.setClipboardData是uni-app提供的一个API&#xff0c;用于设置系统剪贴板的内容。 使用说明&#xff1a; 使用此API可以将指定的文本内容复制到系统剪贴板&#xff0c;使用户能够在其他应用或页面中粘贴这些内容。 uni.setClipboardData({data: , // 需要复制的内容 suc…...

Android opengl 绘制矩形,宽高相同,不能显示为正方形,是怎么回事

在Android上使用OpenGL绘制矩形&#xff08;或尝试显示为正方形&#xff09;时&#xff0c;如果结果显示为不是正方形&#xff0c;可能有几个原因。以下是一些常见的因素及解决方法&#xff1a; 视口&#xff08;Viewport&#xff09;设置不当&#xff1a; OpenGL的视口定义了…...

网络安全开源组件

本文只是针对开源项目进行收集&#xff0c;如果后期在工作中碰到其他开源项目将进行更新。欢迎大家在评论区留言&#xff0c;您在工作碰到的开源项目。 祝您工作顺利&#xff0c;鹏程万里&#xff01; 一、FW&#xff08;防火墙&#xff09; 1.1 pfSense pfSense项目是一个免费…...

【C++初阶】第5课—模版初阶

文章目录 1. 函数模版1.1 函数模版格式1.2 函数模版原理1.3 函数模版的实例化1.4 模版参数的匹配原则 2. 类模版 1. 函数模版 在讲函数模版之前先看一个例子 为了实现泛型编程&#xff0c;C提出了函数模版的概念函数模版与类型无关&#xff0c;在使用时被参数化&#xff0c;根据…...

【力扣热题100】[Java版] 刷题笔记-3. 无重复字符的最长子串

题目:3. 无重复字符的最长子串 给定一个字符串 s &#xff0c;请你找出其中不含有重复字符的 最长子串 的长度。 解题思路 根据题目&#xff0c;只需要返回无重复字符串的最长子串的长度&#xff0c;所以我们不需要知道知道字符串内容是什么&#xff0c;在整个字符串 s 中&…...

无人机数据处理系统:原理与核心系统

一、数据处理系统的运行原理 数据获取&#xff1a;无人机在飞行过程中&#xff0c;通过搭载的传感器&#xff08;如相机、激光雷达等&#xff09;采集到各种类型的数据&#xff0c;例如图像、点云等。这些数据是后续处理和分析的基础。 数据传输&#xff1a;采集到的数据会通…...

Hadoop分布式文件系统(二)

目录 1. 引言1. Hadoop文件操作命令2. 部分常用的Hadoop FS Shell命令2.1 ls列出文件2.2 mkdir创建目录2.3 put上传文件2.4 cat查看文件2.5 get复制文件2.6 rm删除文件 3. Hadoop系统管理命令4. HDFS Java API 示例参考 1. 引言 大多数HDFS Shell命令的行为和对应的Unix Shell命…...

PortSwigger 原型污染

一、什么是原型污染 原型污染是一种 JavaScript 漏洞&#xff0c;它使攻击者能够向全局对象原型添加任意属性&#xff0c;然后这些属性可能被用户定义的对象继承。 二、JavaScript 原型和继承基础 1、原型 JavaScript 中的每个对象都链接到某种类型的另一个对象&#xff0c;称…...

雪花算法详解:分布式系统中高效唯一的ID生成方案

文章目录 原理与结构工作流程优势局限性应对高并发的方法适用场景 雪花算法&#xff08;Snowflake Algorithm&#xff09;是由Twitter开发的一种分布式全局唯一ID生成方案&#xff0c;旨在解决在分布式系统中快速、无冲突地生成唯一标识符的问题。它通过巧妙的设计&#xff0c;…...

[Redis#7] set | 命令 | 集合 | 用户画像 | UV

目录 1. 特点 2. 常用命令 2.1 普通命令 2.2 集合间操作 2.3. 命令小结 3.内部编码 4. 应用场景 1. 构造用户画像 2. 计算用户之间的共同好友 3. 统计 UV 1. 特点 集合类型也是保存多个字符串类型的元素的&#xff0c;和 list 类型不同的是&#xff1a; 无序性&…...

中介者模式 (Mediator Pattern)

文章目录 中介者模式 (Mediator Pattern)原理优点缺点示例代码场景描述1. 定义中介者接口2. 实现具体中介者3. 定义同事类接口4. 实现具体同事类5. 客户端代码输出结果 UML 类图使用场景小结 中介者模式 (Mediator Pattern) 中介者模式是一种 行为型设计模式&#xff0c;用来降…...

PVE 软路由单网口——VLAN 实践

从VLAN交换机出发&#xff0c;到PVE的Linux Bridge 、Linux VLAN&#xff0c;再到iKuai等软路由软件的设置&#xff0c;尽可能的了解VLAN设置细节&#xff0c;避免踩坑。 本文使用的快速切换CIDR的脚本 PVE 调试之“一键设置网络连接的以太网的CIDR“——“.PS1 脚本” 默认…...

搭建一个基于Web的文档管理系统,用于存储、共享和协作编辑文档

搭建一个基于Web的文档管理系统&#xff0c;用于存储、共享和协作编辑文档 本项目采用以下架构&#xff1a; NFS服务器: 负责存储文档资料。Web服务器: 负责提供文档访问和编辑功能。SELinux: 负责权限控制&#xff0c;确保文档安全。Git服务器: 负责存储文档版本历史&#x…...

【QT】控件8

1.QDial 通过调节旋钮位置来控制窗口的不透明度&#xff1a; void Widget::on_dial_valueChanged(int value) {qDebug()<<value;this->setWindowOpacity((double)value/100); }效果演示&#xff1a; 2.Date/Time Edit 计算两个日期的差值 ui界面设计 计算按钮按下…...

asyncio.to_thread 详解及示例代码

asyncio.to_thread 详解及示例代码 1. asyncio.to_thread() 简介函数签名返回值 2. 示例代码示例 1: 执行阻塞的 I/O 操作示例 2: 执行阻塞的 CPU 密集型操作 3. 注意事项4. 总结 在异步编程中&#xff0c;asyncio 是 Python 中用于编写异步代码的标准库。然而&#xff0c;有时…...

MYSQL字段变更

修改字段长度 ALTER TABLE tqt_sp_prod.t_receipt_order_head MODIFY COLUMN CUS_CONTRACT_CD VARCHAR(50) COMMENT 客户合同编号;添加varchar类型字段 AFTER 此处指在loc_cd字段后面 ALTER TABLE m_product ADD COLUMN FIXED_ASSET_NUM VARCHAR(100) DEFAULT NULL COMME…...

【通俗理解】步长和学习率在神经网络中是一回事吗?

【通俗理解】步长和学习率在神经网络中是一回事吗&#xff1f; 【核心结论】 步长&#xff08;Step Size&#xff09;和学习率&#xff08;Learning Rate, LR&#xff09;在神经网络中并不是同一个概念&#xff0c;但它们都关乎模型训练过程中的参数更新。 【通俗解释&#x…...

力扣-位运算-8【算法学习day.48】

前言 ###我做这类文章一个重要的目的还是给正在学习的大家提供方向和记录学习过程&#xff08;例如想要掌握基础用法&#xff0c;该刷哪些题&#xff1f;&#xff09;我的解析也不会做的非常详细&#xff0c;只会提供思路和一些关键点&#xff0c;力扣上的大佬们的题解质量是非…...

C++ 字符串中数字识别

【问题描述】 输入一个字符串&#xff0c;含有数字和非数字字符&#xff0c;如“sumabc234;while(abc700)tab{ass346;bssabc267;}”&#xff0c;将其中连续的数字作为一个整数&#xff0c;依次存放到一个数组nums中。例如&#xff0c;234放在nums[0]&#xff0c;700放在nums[1…...

计算机毕业设计Python+卷积神经网络股票预测系统 股票推荐系统 股票可视化 股票数据分析 量化交易系统 股票爬虫 股票K线图 大数据毕业设计 AI

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…...

jvm-49-linux 服务器 cpu 使用率升高应该如何排查分析?

拓展阅读 JVM FULL GC 生产问题 I-多线程通用实现 JVM FULL GC 生产问题 II-如何定位内存泄露&#xff1f; 线程通用实现 JVM FULL GC 生产问题 III-多线程执行队列的封装实现&#xff0c;进一步抽象 jvisualvm java 性能分析工具 jvm-44-jvm 内存性能分析工具 Eclipse Me…...

FPGA存在的意义:为什么adc连续采样需要fpga来做,而不会直接用iic来实现

FPGA存在的意义&#xff1a;为什么adc连续采样需要fpga来做&#xff0c;而不会直接用iic来实现 原因ADS111x连续采样实现连续采样功能说明iic读取adc的数据速率 VS adc连续采样的速率adc连续采样的速率iic读取adc的数据速率结论分析 FPGA读取adc数据问题一&#xff1a;读取adc数…...

Web开发基础学习——HTML, CSS, JavaScript 的区别和联系

Web开发基础学习系列文章目录 第一章 基础知识学习之HTML, CSS, JavaScript 的区别和联系 文章目录 Web开发基础学习系列文章目录前言一、定义说白了&#xff0c;就是HTML负责网页的内容&#xff0c;CSS负责网页的格式&#xff0c;JS负责网页的交互。 二、 功能三、联系四、示…...

通义灵码走进北京大学创新课堂丨阿里云云原生 10 月产品月报

云原生月度动态 云原生是企业数字创新的最短路径。 《阿里云云原生每月动态》&#xff0c;从趋势热点、产品新功能、服务客户、开源与开发者动态等方面&#xff0c;为企业提供数字化的路径与指南。 趋势热点 &#x1f947; 通义灵码走进北京大学创新课堂&#xff0c;与 400…...

Facebook Messenger背后的技术架构:即时通讯的实现之道

Facebook Messenger&#xff0c;作为全球最受欢迎的即时通讯应用之一&#xff0c;每天承载着数十亿的消息交换。其背后支撑这一流畅通讯体验的技术架构&#xff0c;融合了大量先进的技术和创新的解决方案。本文将从技术角度&#xff0c;深入探讨Facebook Messenger如何实现即时…...

前端css实例

前端css实例 一、带条纹的表格 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>条纹样式的表格<…...

电阻改善信号完整性

1.为什么电路端接电阻能改善信号完整性 由于电信号在PCB上传输&#xff0c;因此在PCB设计中可以把PCB走线认为是信号的通道&#xff0c;当该通道的 物理结构&#xff08;线宽&#xff0c;线到参考面的距离等&#xff09;发生变化&#xff0c;特别是有一些突变时&#xff0c;都会…...

如何选择合适的主键id?

目录标题 MySQL主键一定是自增的吗&#xff1f;自增id、uuid、雪花算法 谁更合适&#xff1f;详细聊聊 UUID详细聊聊 雪花算法 在数据库设计中&#xff0c;选择合适的主键对于数据表的性能和数据完整性都非常重要。接下来&#xff0c;让我们探讨一下自增id、uuid和雪花算法&…...

OpenMP出现Stack Overflow及其疑问

今天对着《OpenMP核心技术指南》练习OpenMP&#xff0c;其中一个案例: #include <stdio.h> #include <math.h> #include <omp.h>#define ITER 100000000void main() {int i;double A[ITER];for (i 0; i < ITER; i)A[i] 2.0 * i;#pragma omp parallel{/…...

vscode查找函数调用

在 VS Code 中&#xff0c;要查找 C 语言函数的调用列表&#xff0c;有以下几种方法可以使用&#xff0c;具体取决于项目的规模和你的需求&#xff1a; 方法 1: 使用全局查找功能 步骤&#xff1a; 打开全局查找&#xff1a; 按 CtrlShiftF (Windows/Linux) 或 CmdShiftF (Ma…...

网络安全-网络安全审计

网络安全审计是为了确保网络系统的安全性和完整性&#xff0c;防范潜在的网络攻击和数据泄露风险。 审计步骤&#xff1a; 1.确定审计目标&#xff1a;明确审计的目的和范围&#xff0c;例如审计网络设备、服务器、应用程序或数据库等。 2.收集信息&#xff1a;收集审计范围…...

刷LeetCode hot100--1.哈希表

哈希表--查找一个元素在不在数组/map/set中 目前用到的数据结构&#xff1a; std::unordered_set哈希表无序否否O(1)O(1) std::unordered_map哈希表key无序key不可重复key不可修改O(1)O(1) 1. 两数之和 - 力扣&#xff08;LeetCode&#xff09; 30min 几个问题 1.原来想…...

鸿蒙生态崛起的机遇有什么

鸿蒙生态系统的崛起为各个领域带来了多个机遇&#xff0c;主要体现在以下几个方面&#xff1a; 智能设备的互联互通&#xff1a;鸿蒙系统旨在实现不同设备之间的无缝连接&#xff0c;为物联网&#xff08;IoT&#xff09;设备的发展提供了良好的基础。这将推动智能家居、智慧城…...

写入json和读取json文件

/// <summary> ///写入文件 /// </summary> /// <param name"Stns"></param> /// <returns></returns> public ActionResult WriteJsonFile(string Stns) { strin…...

【Java基础入门篇】前言

Java基础入门篇 本系列内容主要针对Java基础知识&#xff0c;总共包含四大部分内容&#xff1a; 变量、数据类型和运算符控制语句和递归算法面向对象和JVM底层分析数组和排序 学习需要具备&#xff1a; IDEA编译器 JDK1.8版本 写在前面 在Java入门的最开始&#xff0c;我们需…...

LangChain——管道提示词 缓存

管道提示词 管道提示词可以将多个提示组合在一起。当我们想要使用部分提示时&#xff0c;这会很有用。这里可以通过PipelinePrompt来完成。 PipelinePrompt由两部分组成&#xff1a; 最终提示&#xff1a;返回的最终提示&#xff1b;管道提示&#xff1a;元组列表&#xff0c…...

LangGPT社区创始人云中江树:用热爱与坚持点燃实战营课堂

书生大模型实战营第 4 期正在火热进行中&#xff0c;在这里&#xff0c;我们见证了众多同学的成长与进步。今天&#xff0c;让我们一起走进第 4 期导师、结构化提示词 LangGPT 社区创始人云中江树的故事。他的故事不仅是对知识改变命运的生动诠释&#xff0c;更是一段关于热爱与…...

Admin.NET框架使用宝塔面板部署步骤

文章目录 Admin.NET框架使用宝塔面板部署步骤&#x1f381;框架介绍部署步骤1.Centos7 部署宝塔面板2.部署Admin.NET后端3.部署前端Web4.访问前端页面 Admin.NET框架使用宝塔面板部署步骤 &#x1f381;框架介绍 Admin.NET 是基于 .NET6 (Furion/SqlSugar) 实现的通用权限开发…...

18:(标准库)DMA二:DMA+串口收发数据

DMA串口收发数据 1、DMA串口发送数据2、DMA中断串口接收定长数据包3、串口空闲中断DMA接收不定长数据包4、串口空闲中断DMA接收不定长数据包DMA发送数据包 1、DMA串口发送数据 当串口的波特率大于115200时&#xff0c;可以通过DMA1进行数据搬运&#xff0c;以防止数据的丢失。如…...

Unity 导出 xcode 工程 并给 Info.plist 文件添加字段

Unity 导出 xcode 工程 并给 Info.plist 文件添加字段 在 Editor 文件夹下新建 xxx.cs 脚本 实现静态方法 [PostProcessBuild]public static void OnPostprocessBuild(BuildTarget target, string pathToBuiltProject){// Unity 导出 Xcode 工程自动调用这个方法 }例子 一 us…...

打造高质量技术文档的关键要素(结合MATLAB)

在技术的浩瀚海洋中&#xff0c;一份优秀的技术文档宛如精准的航海图。它不仅是知识传承的载体&#xff0c;也是团队协作的桥梁&#xff0c;更是产品成功的幕后英雄。打造出色的技术文档并非易事&#xff0c;以下将从多个方向探讨如何做到这一点。 文章目录 方向一&#xff1a;…...

C语言-数组

数组的创建 数组结构式 数组类型 数组名称 数组大小 内容 列如 char Arr[3]{1,2,3} int Arr[3]{1,2,3} 注意&#xff1a;在C99之前&#xff0c;【】中需要一个常量才可以 数组的初始化 初始化就是给它赋值&#xff0c;初始化分为完全初始化和非完全初始化 完全初始化…...

hhdb数据库介绍(10-19)

监控 智能物理拓扑 物理拓扑图主要以服务器为视角展示集群组件与服务器的所属关系&#xff0c;同时可查看服务器资源的使用情况以及各集群组件服务运行状态。使用前需保证为集群服务器配置了可用的SSH连接信息&#xff0c;否则只能查看当前服务器与集群组件的所属关系&#x…...

AI开发:生成式对抗网络入门 模型训练和图像生成 -Python 机器学习

阶段1&#xff1a;GAN是个啥&#xff1f; 生成式对抗网络&#xff08;Generative Adversarial Networks, GAN&#xff09;&#xff0c;名字听着就有点“对抗”的意思&#xff0c;没错&#xff01;它其实是两个神经网络互相斗智斗勇的游戏&#xff1a; 生成器&#xff08;Gene…...