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

JVM的生命周期

1.加载(Loading):

在加载阶段,JVM会找到并加载Java字节码文件。加载阶段分为三个步骤:通过类的全限定名找到对应的字节码文件,创建一个与该类相关的Class对象,将类的静态数据结构存储在方法区中。加载完成后,JVM内存中就存在了一个Class对象,它包含了该类的所有属性和方法的信息。

2.验证(Verification):

验证阶段是确保加载的字节码文件符合JVM规范的过程。在验证阶段,JVM会检查字节码的格式、语义以及符号引用的正确性,以防止安全漏洞和运行时错误。验证的目标包括:类文件结构的完整性、语义的正确性和符号引用的验证。

3.准备(Preparation):

在准备阶段,JVM会为类的静态变量分配内存并设置默认初始值。这些静态变量包括基本数据类型和引用类型,它们会被初始化为零值(零值是每种数据类型的默认值,如0、false、null等),而不是类中定义的初始值。此阶段会在方法区中为每个静态变量分配内存空间。

4.解析(Resolution):

解析阶段是将符号引用转换为直接引用的过程。在Java中,类的方法和字段访问采用的是符号引用,而不是直接引用。解析阶段会将这些符号引用转化为直接引用,以便能够正确访问和调用类的方法和字段。解析阶段包括类、字段和方法的解析。

5.初始化(Initialization):

初始化阶段是JVM执行类的初始化代码的过程。类的初始化代码包括静态变量的赋值和静态代码块的执行。在该阶段,JVM会按照类的加载顺序依次初始化每个类,确保所有的静态变量被正确初始化,并执行静态代码块中的代码。初始化阶段是类加载过程的最后一步。

6.使用(Usage):

使用阶段是指JVM执行Java程序的过程。在使用阶段,JVM会按照程序的流程执行相应的指令,并处理方法调用和对象创建等操作。JVM通过执行Java字节码来实际运行程序,包括调用方法、访问字段和创建对象等操作。

7.卸载(Unloading):

卸载阶段是指JVM从内存中卸载不再被使用的类和相关资源。当一个类不再被引用,并且没有正在执行的对象实例时,JVM会卸载该类,并释放其占用的内存空间。卸载过程由垃圾回收器完成,它会检测并回收不再被引用的类和对象。

JVM的生命周期是一个动态的过程,它负责加载、验证、准备、解析、初始化、使用和卸载Java字节码文件。每个阶段都有特定的任务和目标,保证程序能够正确运行并在不再需要时释放资源。

Java虚拟机(JVM)的启动和执行过程分为以下几个步骤:

  1. 加载:JVM首先加载JDK的核心类库以及应用程序所需的其他类。加载过程中包括以下几种方式:

    • 类文件加载:将编译后的Java类文件加载到内存中。
    • 字节码校验:验证加载的字节码是否符合Java语法规范。
    • 字节码转换:将字节码转换成机器码,以便于执行。
  2. 链接:在加载完类文件后,JVM需要进行链接处理,包括以下三个阶段:

    • 验证:检查字节码是否符合JVM规范。
    • 准备:为类变量(静态变量)分配内存空间,并设置默认初始值。
    • 解析:将符号引用转换为直接引用。
  3. 初始化:执行类的初始化代码,包括静态变量的赋值和静态代码块的执行。JVM保证类的初始化在多线程环境下的安全性。

  4. 执行:将字节码转换为机器码,逐行执行机器码指令。执行过程中需要注意以下几点:

    • 进行即时编译(Just-In-Time Compilation):将热点代码(被频繁调用的代码)编译成机器码,以提高执行效率。
    • 垃圾回收(Garbage Collection):在执行过程中,JVM会自动回收不再使用的内存空间,以确保内存的有效利用。
  5. 销毁:当Java程序执行完毕或者出现异常时,JVM会释放所有占用的资源,并终止执行。

JVM的启动和执行流程可以总结为:加载类文件、链接处理、初始化类、执行字节码。通过这一流程,JVM能够实现Java程序的跨平台运行,并提供内存管理和垃圾回收等功能,以确保程序的安全和性能。

JVM(Java Virtual Machine)的退出流程可以分为正常退出和非正常退出两种情况。

  1. 正常退出:

    • JVM收到终止请求,如通过调用System.exit()方法或者通过kill命令结束进程。
    • JVM开始执行退出过程,首先会执行已注册的关闭钩子(Shutdown Hook)。
    • 关闭钩子是一段在JVM正常退出之前执行的代码,可以通过Runtime.addShutdownHook方法注册。
    • JVM的关闭钩子可以用于释放资源、保存状态等操作。
    • 在关闭钩子执行完毕后,JVM执行一些清理操作,如垃圾回收、关闭网络连接等。
    • 最后,JVM完全终止运行,进程退出。
  2. 非正常退出:

    • JVM遇到致命错误,如OutOfMemoryError或StackOverflowError。
    • JVM无法继续执行,并抛出一个异常。
    • 异常的抛出会导致程序所在的线程被终止,然后整个JVM进程退出。

JVM的退出过程可以通过实现一个Shutdown Hook来观察,示例代码如下:

public class ShutdownHookExample {public static void main(String[] args) {// 注册一个关闭钩子Runtime.getRuntime().addShutdownHook(new Thread() {@Overridepublic void run() {System.out.println("Shutting down...");}});// 模拟程序运行try {Thread.sleep(5000); // 程序休眠5秒钟} catch (InterruptedException e) {e.printStackTrace();}// 手动触发退出事件System.exit(0);}
}

该示例程序在运行时注册了一个关闭钩子,并在关闭钩子中打印一条消息。然后程序会休眠5秒钟,之后手动调用System.exit(0)方法触发JVM退出事件。在程序运行时,我们可以观察到在5秒后打印的"Shutting down..."消息,表示关闭钩子被执行。然后JVM会继续执行清理操作并退出。

需要注意的是,关闭钩子的执行顺序是不确定的,不同的钩子可能在不同的线程中执行。因此,如果有多个关闭钩子,它们之间应该是独立的,不依赖于其他钩子的执行顺序。

相关文章:

JVM的生命周期

1.加载(Loading): 在加载阶段,JVM会找到并加载Java字节码文件。加载阶段分为三个步骤:通过类的全限定名找到对应的字节码文件,创建一个与该类相关的Class对象,将类的静态数据结构存储在方法区中…...

ElasticSearch--基本操作

ElasticSearch 完成ES安装 http://101.42.93.208:5601/app/dev_tools#/console 库的操作 创建索引库 请求方式:PUT 请求路径:/索引库名,可以自定义 请求参数:mapping映射 PUT /test {"mappings": {"propertie…...

大数据应用发展史:从搜索引擎时代到机器学习时代

文章目录 搜索引擎时代数据仓库时代数据挖掘时代机器学习时代小结 大数据技术的使用经历了一个发展过程 从最开始的Google在搜索引擎中开始使用大数据技术,到现在无处不在的各种人工智能应用,伴随着大数据技术的发展,大数据应用也从曲高和寡…...

java基础之String的不可变性

目录 概述 String是如何实现不可变的 String为何设计成不可变的 1.缓存和性能优化 2.安全性 3.线程安全性 4.API设计和预测性能 概述 String类的不可变性意味着一旦创建了一个字符串对象,它的值就不能被修改。 String是如何实现不可变的 查看源码 public …...

【JS】Promise详解

概述 在 JavaScript 中,Promise 是一个表示异步操作最终完成或失败的对象。它本质上是一个返回的对象,你可以附加回调函数,而不是将回调传递给函数。 let promise new Promise((resolve, reject) > {let condition true; // 这可以是某…...

原生微信小程序如何动态配置主题颜色及如何调用子组件的方法

一、最终效果 二、步骤 1、在初始化进入项目时,获取当前主题色 2、把主题色定义成全局变量(即在app.js中设置) 3、tabBar也需要定义全局变量,在首页时需要重新赋值 三、具体实现 1、app.js onLaunch () {//获取主题数据this.set…...

Java关键字(1)

Java中的关键字是指被编程语言保留用于特定用途的单词。这些关键字不能用作变量名或标识符。以下是Java中的一些关键字: public:表示公共的,可以被任何类访问。 private:表示私有的,只能被定义该关键字的类访问。 cl…...

【机器学习合集】深度生成模型 ->(个人学习记录笔记)

深度生成模型 深度生成模型基础 1. 监督学习与无监督学习 1.1 监督学习 定义 在真值标签Y的指导下,学习一个映射函数F,使得F(X)Y 判别模型 Discriminative Model,即判别式模型,又称为条件模型,或条件概率模型 生…...

Java将PDF转换为文本

在Java中&#xff0c;你可以使用现有的库来将PDF文件转换为文本。下面是一个简单的示例&#xff0c;使用Apache PDFBox库来实现PDF到文本的转换。首先&#xff0c;确保在你的项目中添加了Apache PDFBox库的依赖。你可以在 Maven 项目中添加以下依赖&#xff1a; <!--Pdf--&g…...

Linux 运维工具之1Panel

一、1Panel 简介 1Panel 是一个现代化、开源的 Linux 服务器运维管理面板。 特点&#xff1a; 快速建站&#xff1a;深度集成 Wordpress 和 Halo&#xff0c;域名绑定、SSL 证书配置等一键搞定&#xff1b;高效管理&#xff1a;通过 Web 端轻松管理 Linux 服务器&#xff0…...

深入了解小红书笔记详情API:为内容创新提供动力

一、小红书笔记详情API简介 小红书笔记详情API是一种允许开发者访问小红书平台上的笔记详细数据的接口。通过这个API&#xff0c;我们可以获取笔记的标题、内容、标签、点赞数、评论数等详细信息。这些数据对于内容创作者和品牌来说至关重要&#xff0c;可以帮助他们了解用户喜…...

Animate 2024(Adobe an2024)

Animate 2024是一款由Adobe公司开发的动画和互动内容创作工具&#xff0c;是Flash的演进版本。Animate 2024为设计师和开发者提供了更丰富的功能&#xff0c;让他们能够创建各种类型的动画、交互式内容和多媒体应用程序。 Animate 2024具有以下特点&#xff1a; 强大的设计工…...

尽量避免删改List

作者简介&#xff1a;大家好&#xff0c;我是smart哥&#xff0c;前中兴通讯、美团架构师&#xff0c;现某互联网公司CTO 联系qq&#xff1a;184480602&#xff0c;加我进群&#xff0c;大家一起学习&#xff0c;一起进步&#xff0c;一起对抗互联网寒冬 学习必须往深处挖&…...

【Linux操作系统】探秘Linux奥秘:用户、组、密码及权限管理的解密与实战

&#x1f308;个人主页&#xff1a;Sarapines Programmer&#x1f525; 系列专栏&#xff1a;《操作系统实验室》&#x1f516;诗赋清音&#xff1a;柳垂轻絮拂人衣&#xff0c;心随风舞梦飞。 山川湖海皆可涉&#xff0c;勇者征途逐星辉。 目录 &#x1fa90;1 初识Linux OS &…...

计算机组成原理复习4

习题 练习题 下列不属于系统总线的为&#xff08;&#xff09; a.数据总线 b.地址总线 c.控制总线 d.片内总线 D 系统总线中地址总线的功能是&#xff08;&#xff09; a.选择主存单元地址 b.选择进行信息传输的设备 c.选择外存地址 d.指定主存和I/O设备接口电路的地址 D 解…...

AutoSAR(基础入门篇)3.3-Autosar中RTE的数据一致性与Interface接口

目录 一、RTE的数据一致性 1、什么是数据一致性 2、数据一致性的实现机制 2.1、利用RTE管理<...

超维空间S2无人机使用说明书——52、初级版——使用PID算法进行基于yolo的目标跟踪

引言&#xff1a;在实际工程项目中&#xff0c;为了提高系统的响应速度和稳定性&#xff0c;往往需要采用一定的控制算法进行目标跟踪。这里抛砖引玉&#xff0c;仅采用简单的PID算法进行目标的跟随控制&#xff0c;目标的识别依然采用yolo。对系统要求更高的&#xff0c;可以对…...

<JavaEE> TCP 的通信机制(一) -- 确认应答 和 超时重传

目录 TCP的通信机制的核心特性 一、确认应答 1&#xff09;什么是确认应答&#xff1f; 2&#xff09;如何“确认”&#xff1f; 3&#xff09;如何“应答”&#xff1f; 二、超时重传 1&#xff09;丢包的概念 2&#xff09;什么是超时重传&#xff1f; 3&#xff09…...

Spark任务调度与数据本地性

Apache Spark是一个分布式计算框架&#xff0c;用于处理大规模数据。了解Spark任务调度与数据本地性是构建高效分布式应用程序的关键。本文将深入探讨Spark任务调度的流程、数据本地性的重要性&#xff0c;并提供丰富的示例代码来帮助大家更好地理解这些概念。 Spark任务调度的…...

【论文阅读】Self-Paced Curriculum Learning

论文下载 代码 Supplementary Materials bib: INPROCEEDINGS{,title {Self-Paced Curriculum Learning},author {Lu Jiang and Deyu Meng and Qian Zhao and Shiguang Shan and Alexander Hauptmann},booktitle {AAAI},year {2015},pages {2694--2700} }1. 摘…...

C++简易线程池

原理说明&#xff1a; 1. 线程池创建时&#xff0c;指定线程池的大小thread_size。当有新的函数任务通过函数addFunction ()添加进来后&#xff0c;其中一个线程执行函数。一个线程一次执行一个函数。如果函数数量大与线程池数量&#xff0c;则后来的函数等待。 2. 线程池内部…...

【MATLAB】PSO粒子群优化LSTM(PSO_LSTM)的时间序列预测

有意向获取代码&#xff0c;请转文末观看代码获取方式~也可转原文链接获取~ 1 基本定义 PSO粒子群优化LSTM&#xff08;PSO-LSTM&#xff09;是一种将粒子群优化算法&#xff08;PSO&#xff09;与长短期记忆神经网络&#xff08;LSTM&#xff09;相结合的混合模型。该算法通过…...

产品经理学习-怎么写PRD文档

目录 瀑布流方法论介绍 产品需求文档&#xff08;PRD&#xff09;介绍 产品需求文档的基本要素 撰写产品需求文档 优先产品需求文档的特点 其他相关文档 瀑布流方法论介绍 瀑布流模型是一种项目的开发和管理的方法论&#xff0c;是敏捷的开发管理方式相对应的另一种方法…...

第3课 获取并播放音频流

本课对应源文件下载链接&#xff1a; https://download.csdn.net/download/XiBuQiuChong/88680079 FFmpeg作为一套庞大的音视频处理开源工具&#xff0c;其源码有太多值得研究的地方。但对于大多数初学者而言&#xff0c;如何快速利用相关的API写出自己想要的东西才是迫切需要…...

Spark编程实验四:Spark Streaming编程

目录 一、目的与要求 二、实验内容 三、实验步骤 1、利用Spark Streaming对三种类型的基本数据源的数据进行处理 2、利用Spark Streaming对Kafka高级数据源的数据进行处理 3、完成DStream的两种有状态转换操作 4、把DStream的数据输出保存到文本文件或MySQL数据库中 四…...

Flink去重计数统计用户数

1.数据 订单表&#xff0c;分别是店铺id、用户id和支付金额 "店铺id,用户id,支付金额", "shop-1,user-1,1", "shop-1,user-2,1", "shop-1,user-2,1", "shop-1,user-3,1", "shop-1,user-3,1", "shop-1,user…...

力扣:62. 不同路径(动态规划,附python二维数组的定义)

题目&#xff1a; 一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &#xff09;。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角&#xff08;在下图中标记为 “Finish” &#xff09;。 问总共有多少条不同的路径&…...

2022年全球运维大会(GOPS深圳站)-核心PPT资料下载

一、峰会简介 GOPS 主要面向运维行业的中高端技术人员&#xff0c;包括运维、开发、测试、架构师等群体。目的在于帮助IT技术从业者系统学习了解相关知识体系&#xff0c;让创新技术推动社会进步。您将会看到国内外知名企业的相关技术案例&#xff0c;也能与国内顶尖的技术专家…...

8868体育助力意甲罗马俱乐部 迪巴拉有望付出

8868体育助力意甲罗马俱乐部 迪巴拉有望付出 意甲罗马俱乐部是8868体育合作球队之一&#xff0c;本赛季&#xff0c;在意甲第14轮的比赛中&#xff0c;罗马客场2-1战胜萨索洛&#xff0c;积分上升到意甲第4位。 有报道称&#xff0c;迪巴拉在对阵佛罗伦萨的比赛中受伤&#xff…...

java设计模式实战【策略模式+观察者模式+命令模式+组合模式,混合模式在支付系统中的应用】

引言 在代码开发的世界里&#xff0c;理论知识的重要性毋庸置疑&#xff0c;但实战经验往往才是知识的真正试金石。正所谓&#xff0c;“读万卷书不如行万里路”&#xff0c;理论的学习需要通过实践来验证和深化。设计模式作为软件开发中的重要理论&#xff0c;其真正的价值在…...

小程序wx:if 和hidden的区别?

在小程序中&#xff0c;wx:if 和 hidden 是用于条件渲染的两种不同方式。 选择使用哪种方式取决于具体情况。如果条件变化频繁或节点包含复杂的子节点&#xff0c;可以考虑使用 wx:if 进行条件渲染&#xff1b;如果条件变化较少且节点结构简单&#xff0c;可以使用 hidden 控制…...

自动驾驶学习笔记(二十三)——车辆控制模型

#Apollo开发者# 学习课程的传送门如下&#xff0c;当您也准备学习自动驾驶时&#xff0c;可以和我一同前往&#xff1a; 《自动驾驶新人之旅》免费课程—> 传送门 《Apollo开放平台9.0专项技术公开课》免费报名—>传送门 文章目录 前言 运动学模型 动力学模型 总结…...

Linux Shell 015-文本双向覆盖重定向工具tee

Linux Shell 015-文本双向覆盖重定向工具tee 本节关键字&#xff1a;Linux、Bash Shell、文本双向覆盖重定向工具 相关指令&#xff1a;tee、echo、cat tee介绍 tee工具是从标准输入读取并写入到标准输出和文件&#xff0c;即&#xff1a;双向覆盖重定向&#xff08;屏幕输出…...

【PyQt】(自定义类)QIcon派生,更易用的纯色Icon

嫌Qt自带的icon太丑&#xff0c;自己写了一个&#xff0c;主要用于纯色图标的自由改色。 当然&#xff0c;图标素材得网上找。 Qt原生图标与现代图标对比&#xff1a; 没有对比就没有伤害 Qt图标 网络素材图标 自定义类XJQ_Icon&#xff1a; from PyQt5.QtGui import QIc…...

【mysql】数据处理格式化、转换、判断

数据处理 判断是否超时&#xff0c;时间是否大于当前时间计算分钟数时间格式化处理如果数值类型进行转换字符类型字符拼接case-when代替if-else判断数据空&#xff08;特殊&#xff1a;含空数据、空字符处理&#xff09; select /*判断是否超时&#xff0c;时间是否大于当前…...

深入探索Java中的UDP网络通信机制

在网络通信中&#xff0c;UDP&#xff08;User Datagram Protocol&#xff0c;用户数据报协议&#xff09;是一种无连接的协议&#xff0c;它在某些情况下比TCP更适合&#xff0c;尤其是在要求速度快、对数据准确性要求相对较低的场景下。本文将介绍如何使用Java进行UDP网络通信…...

List常见方法和遍历操作

List集合的特点 有序&#xff1a; 存和取的元素顺序一致有索引&#xff1a;可以通过索引操作元素可重复&#xff1a;存储的元素可以重复 List集合的特有方法 Collection的方法List都继承了List集合因为有索引&#xff0c;所以有了很多操作索引的方法 ublic static void main…...

【基础篇】一、认识JVM

文章目录 1、虚拟机2、Java虚拟机3、JVM的整体结构4、Java代码的执行流程5、JVM的三大功能6、JVM的分类7、JVM的生命周期 1、虚拟机 虚拟机&#xff0c;Virtual Machine&#xff0c;一台虚拟的计算机&#xff0c;用来执行虚拟计算机指令。分为&#xff1a; 系统虚拟机&#x…...

DrGraph原理示教 - OpenCV 4 功能 - 颜色空间

前言 前段时间&#xff0c;甲方提出明确需求&#xff0c;让把软件国产化。稍微研究了一下&#xff0c;那就转QT开发&#xff0c;顺便把以前的功能代码重写一遍。 至于在Ubuntu下折腾QT、OpenCV安装事宜&#xff0c;网上文章很多&#xff0c;照猫画虎即可。 这个过程&#xff0…...

听GPT 讲Rust源代码--src/tools(36)

File: rust/src/tools/clippy/clippy_lints/src/loops/empty_loop.rs 在Rust源代码中&#xff0c;empty_loop.rs文件位于src/tools/clippy/clippy_lints/src/loops/目录下&#xff0c;它的作用是实现并提供一个名为EMPTY_LOOP的Lint规则。Clippy是一个Rust的静态分析工具&#…...

学生数据可视化与分析工具 vue3+flask实现

目录 一、技术栈亮点 二、功能特点 三、应用场景 四、结语 学生数据可视化与分析工具介绍 在当今的教育领域&#xff0c;数据驱动的决策正变得越来越重要。为了满足学校、教师和学生对于数据深度洞察的需求&#xff0c;我们推出了一款基于Vue3和Flask编写的学生数据可视化…...

uni-app condition启动模式配置

锋哥原创的uni-app视频教程&#xff1a; 2023版uniapp从入门到上天视频教程(Java后端无废话版)&#xff0c;火爆更新中..._哔哩哔哩_bilibili2023版uniapp从入门到上天视频教程(Java后端无废话版)&#xff0c;火爆更新中...共计23条视频&#xff0c;包括&#xff1a;第1讲 uni…...

网大为卸任腾讯CXO;Midjourney 1 月训练视频模型;2023年马斯克赚了7700亿

投融资 • 2023 年大型科技公司在生成式 AI 初创企业上的投资远超风险投资集团• 恒信东方与无锡政府合作成立布局 MR/XR 技术及 3D 数字资产 AIGC 产业投资基金• 新公司法完善注册资本认缴登记制度• 网大为卸任腾讯CXO&#xff0c;曾促成南非MIH的投资• 宁波蔚孚科技完成数…...

据报道,微软的下一代 Surface 笔记本电脑将是其首款真正的“人工智能 PC”

明年&#xff0c;微软计划推出 Surface Laptop 6和 Surface Pro 10&#xff0c;这两款设备将提供 Arm 和 Intel 两种处理器选项。不愿意透露姓名的不透露姓名人士透露&#xff0c;这些新设备将引入先进的人工智能功能&#xff0c;包括配备下一代神经处理单元 (NPU)。据悉&#…...

Springer build pdf乱码

在textstudio中编辑时没有错误&#xff0c;在editor manager生成pdf时报错。 首先不要改源文件&#xff0c;着重看你的上传顺序&#xff1a; 将.tex文件&#xff0c;.bst文件&#xff0c;.cls文件&#xff0c;.bib文件, .bbl文件的类型&#xff0c;在editor manager中是Item。…...

k8s之kudeadm

kubeadm来快速的搭建一个k8s的集群&#xff1a; 二进制搭建适合大集群&#xff0c;50台以上主机 kubeadm更适合中小企业的业务集群 master&#xff1a;192.168.233.91 docker kubelet lubeadm kubectl flannel node1:192.168.233.92 docker kubelet lubeadm kubectl flannel…...

NModbus-一个C#的Modbus协议库实现

NModbus-一个基于C#实现的Modbus通信协议库 最近在学习C#的时候&#xff0c;因为之前做过环保设备时使用C做过环保设备采集使用到了Modbus协议&#xff0c;当时看了一下基于C语言开发的libmodbus库。所以特意搜索看了一下C#下有什么Modbus协议库&#xff0c;在Github上面找了一…...

Altium Designer20中遇到的问题和解决办法记录

最近二战考完研了&#xff0c;重新拾起之前学的一些项目&#xff0c;最近在优化以前话的四层PCB版的时候发现了在使用AD使碰到一些问题现在记录如下&#xff1a; 1.Altium Designer 中的 Clearance Constraint 错误如何修改 &#xff1a; 我遇到的报错如下&#xff1a;  这…...

flask web学习之flask与http(二)

文章目录 1. HTTP响应1.1 响应报文1.2 常见HTTP状态码1.3 在flask中如何生成响应1.3.1重定向1.3.2错误响应 1.4响应格式 在flask程序中&#xff0c;客户端发出的请求触发相应的视图函数&#xff0c;获取返回值会作为响应的主体&#xff0c;最后生成完整的响应&#xff0c;即响应…...

基于Python的电商手机数据可视化分析和推荐系统

1. 项目简介 本项目旨在通过Python技术栈对京东平台上的手机数据进行抓取、分析并构建一个简单的手机推荐系统。主要功能包括&#xff1a; 网络爬虫&#xff1a;从京东获取手机数据&#xff1b;数据分析&#xff1a;统计各厂商手机销售分布、市场占有率、价格区间和好评率&am…...