【Android】系统启动流程分析 —— SystemServer 处理过程
本文基于 Android 14.0.0_r2 的系统启动流程分析。
SystemServer 进程主要用于创建系统服务,我们熟知的 AMS、WMS 和 PMS 都是由它来创建的,因此掌握 SystemServer 进程是如何启动的,它在启动时做了哪些工作是十分必要的。
一、源码解析
-
ZygoteInit 的
handleSystemServerProcess下面的子方法去调用了com.android.server.SystemServer的main方法,至此 SystemServer 就创建和启动完毕了:路径:/frameworks/base/core/java/com/android/internal/os/ZygoteInit.javapublic static void main(String[] argv) {...Runnable caller;try {...if (startSystemServer) {Runnable r = forkSystemServer(abiList, zygoteSocketName, zygoteServer);...}...}... }路径:/frameworks/base/core/java/com/android/internal/os/ZygoteInit.javaprivate static Runnable forkSystemServer(String abiList, String socketName,ZygoteServer zygoteServer) {...if (pid == 0) {...return handleSystemServerProcess(parsedArgs);}... }路径:/frameworks/base/core/java/com/android/internal/os/ZygoteInit.javaprivate static Runnable handleSystemServerProcess(ZygoteArguments parsedArgs) {...if (parsedArgs.mInvokeWith != null) {...} else {...return ZygoteInit.zygoteInit(parsedArgs.mTargetSdkVersion,parsedArgs.mDisabledCompatChanges,parsedArgs.mRemainingArgs, cl);} }路径:/frameworks/base/core/java/com/android/internal/os/ZygoteInit.javapublic static Runnable zygoteInit(int targetSdkVersion, long[] disabledCompatChanges,String[] argv, ClassLoader classLoader) {...return RuntimeInit.applicationInit(targetSdkVersion, disabledCompatChanges, argv,classLoader); }路径:/frameworks/base/core/java/com/android/internal/os/RuntimeInit.javaprotected static Runnable applicationInit(int targetSdkVersion, long[] disabledCompatChanges,String[] argv, ClassLoader classLoader) {...return findStaticMain(args.startClass, args.startArgs, classLoader); }路径:/frameworks/base/core/java/com/android/internal/os/RuntimeInit.javaprotected static Runnable findStaticMain(String className, String[] argv,ClassLoader classLoader) {Class<?> cl;try {// 反射拿到 SystemServer 类cl = Class.forName(className, true, classLoader);} catch (ClassNotFoundException ex) {...}Method m;try {// 反射拿到 SystemServer.java 的 main 函数,并启动。m = cl.getMethod("main", new Class[] { String[].class });} catch (NoSuchMethodException ex) {...} catch (SecurityException ex) {...}...return new MethodAndArgsCaller(m, argv); } -
SystemServer.run
路径:/frameworks/base/services/java/com/android/server/SystemServer.javapublic static void main(String[] args) {new SystemServer().run(); }路径:/frameworks/base/services/java/com/android/server/SystemServer.javaprivate void run() {...try {...// 设置系统语言、国家、时区相关。if (!SystemProperties.get("persist.sys.language").isEmpty()) {final String languageTag = Locale.getDefault().toLanguageTag();SystemProperties.set("persist.sys.locale", languageTag);SystemProperties.set("persist.sys.language", "");SystemProperties.set("persist.sys.country", "");SystemProperties.set("persist.sys.localevar", "");}...// 设置 main 线程的优先级,有此可得主线程就是 SystemServer 进程下的其中线程。android.os.Process.setThreadPriority(android.os.Process.THREAD_PRIORITY_FOREGROUND);android.os.Process.setCanSelfBackground(false);// 开始主线程的运行,和 Looper.loop 配对使用。// 运行在 Looper.prepareMainLooper() ~ Looper.loop(),之间的就是运行在主线程中。Looper.prepareMainLooper();Looper.getMainLooper().setSlowLogThresholdMs(SLOW_DISPATCH_THRESHOLD_MS, SLOW_DELIVERY_THRESHOLD_MS);...// 初始化 native services,加载 android_servers 库(libandroid_servers.so)。System.loadLibrary("android_servers");...// 通过 ActivityThread 来创建 system 上下文。createSystemContext();// 初始化 ActivityThread,创建 TelephonyServiceManager、StatsServiceManager、MediaServiceManager。ActivityThread.initializeMainlineModules();// 将 SystemServer 加入 ServiceManager(binder 线程池)。// 每个继承自 SystemServer 或属于 SystemServer 进程的服务都将加入到 ServiceManager 中的线程池中。ServiceManager.addService("system_server_dumper", mDumper);mDumper.addDumpable(this);// 每个 server 基本上对应了一个 manager,对外提供的 API 也是只能获取到 manager。// 创建 SystemServiceManager,它会对系统的服务进行创建、启动和生命周期管理,启动系统的各种服务。mSystemServiceManager = new SystemServiceManager(mSystemContext);mSystemServiceManager.setStartInfo(mRuntimeRestart,mRuntimeStartElapsedTime, mRuntimeStartUptime);mDumper.addDumpable(mSystemServiceManager);// LocalServices 是 system_server 进程中各个服务提供的本地服务。// system_server 进程中每个服务都可以往 LocalServices 放对象。// 有些核心服务是继承自 SystemServer,LocalServices 是公开缓存池目的是解耦。LocalServices.addService(SystemServiceManager.class, mSystemServiceManager);...}...// 启动 Services。try {t.traceBegin("StartServices");// 启动系统启动所需的一系列关键服务:AMS,P(power/package)MS,SensorService,DisplayManagerService,LightService 等。startBootstrapServices(t);// 启动核心服务:BatteryService,GpuService 等。startCoreServices(t);// 启动其他服务:VibratorManagerService,闹钟服务,相机服务,网络服务,输入法服务,存储服务等。startOtherServices(t);// 以上的所有服务都由 mSystemServiceManager 来启动,所以都是继承自 SystemServer。// 分别是引导服务、核心服务和其他服务// [引导服务]// Installer 系统安装 apk 时的一个服务类,启动完成 Installer 服务之后才能启动其他的系统服务。// ActivityManagerService 负责四大组件的启动、切换、调度。// PowerManagerService 计算系统中和Power相关的计算,然后决策系统应该如何反应。// LightsService 管理和显示背光LED。// DisplayManagerService 用来管理所有显示设备。// UserManagerService 多用户模式管理。// SensorService 为系统提供各种感应器服务。// PackageManagerService 用来对 apk 进行安装、解析、删除、卸载等等操作。// [核心服务]// BatteryService 管理电池相关的服务。// UsageStatsService 收集用户使用每一个 APP 的频率、使用时常。// WebViewUpdateService WebView 更新服务。// [其他服务]// CameraService 摄像头相关服务。// AlarmManagerService 全局定时器管理服务。// InputManagerService 管理输入事件。// WindowManagerService 窗口管理服务。// VrManagerService VR模式管理服务。// BluetoothService 蓝牙管理服务。// NotificationManagerService 通知管理服务。// DeviceStorageMonitorService 存储相关管理服务。// LocationManagerService 定位管理服务。// AudioService 音频相关管理服务。...}...// 主线程Looper.loop();// 若执行到这里说明主线程意外退出了。// 主线程:Looper.prepareMainlooper ~ Looper.loop 之间。throw new RuntimeException("Main thread loop unexpectedly exited"); }以上方法可以看出来关于其他服务的启动都是运行在主线程中的 Looper.prepareMainlooper ~ Looper.loop 之间,每个 SystemServer 中的服务都有一个 binder,会加入到 ServiceManager 的 binder 线程池中统一管理,这样拿到全局的 ServiceManager,根据 AIDL 获取到每个 Service 了。
-
startBootstrapServices(t)
启动系统启动所需的一系列关键服务:AMS,P(power/package)MS,SensorService,DisplayManagerService,LightService 等。
-
startCoreServices(t)
启动核心服务:BatteryService,GpuService 等。
-
startOtherServices(t)
启动其他服务:VibratorManagerService,闹钟服务,相机服务,网络服务,输入法服务,存储服务等。
在这些启动的服务里(调用了 onStart 启动服务),都会将服务存入 ServiceManager 用来管理系统中的各种 Service,用于系统 C/S 架构中的 Binder 机制通信:Client 端要使用某个 Service,则需要先到 ServiceManager 查询 Service 的相关信息,然后根据 Service 的相关信息与 Service 所在的 Server 进程建立通讯通路,这样 Client 端就可以使用 Service 了。
-
-
各类系统服务的作用
引导服务(startBootstrapServices) 作用 ActivityManagerService 负责四大组件的启动、切换、调度 PowerManagerService 计算系统中和 Power 相关的计算,然后决策系统应该如何反应 Installer 系统安装 apk 时的一个服务类,启动完成 Installer 服务之后才能启动其他的系统服务 LightsService 管理和显示背光 LED DisplayManagerService 用来管理所有显示设备 PackageManagerService 用来对 apk 进行安装、解析、删除、卸载等等操作 SensorService 为系统提供各种感应器服务 核心服务(startCoreServices) 作用 BatteryService 管理电池相关的服务 GpuService 硬件显示服务 WebViewUpdateService WebView 更新服务 其他服务(startOtherServices) 作用 CameraService 摄像头相关服务 AlarmManagerService 全局定时器管理服务 InputManagerService 管理输入事件 WindowManagerService 窗口管理服务 BluetoothService 蓝牙管理服务 PackageManagerService 用来对 apk 进行安装、解析、删除、卸载等等操作 SensorService 为系统提供各种感应器服务 LocationManagerService 定位管理服务 … … -
SystemServer.startBootstrapServices
路径:/frameworks/base/services/java/com/android/server/SystemServer.javaprivate void startBootstrapServices(@NonNull TimingsTraceAndSlog t) {...// 尽早启动看门狗,以便在早期启动过程中出现死锁时使系统服务器崩溃。t.traceBegin("StartWatchdog");// 启动看门狗,看门狗需要定时喂狗,若喂狗超时则会触发重启,以便知道进程和服务是否正常运行。final Watchdog watchdog = Watchdog.getInstance();watchdog.start();mDumper.addDumpable(watchdog);t.traceEnd();...t.traceBegin("StartInstaller");// 通过 mSystemServiceManager 来启动 Installer 服务,管理应用的安装与卸载。Installer installer = mSystemServiceManager.startService(Installer.class);t.traceEnd();...// 通过 mSystemServiceManager 来启动 UriGrantsManagerService,管理 Uri。t.traceBegin("UriGrantsManagerService");mSystemServiceManager.startService(UriGrantsManagerService.Lifecycle.class);t.traceEnd();// 通过 mSystemServiceManager 来启动 PowerStatsService,管理电源状态。t.traceBegin("StartPowerStatsService");mSystemServiceManager.startService(PowerStatsService.class);t.traceEnd();...t.traceBegin("StartActivityManager");// 通过 mSystemServiceManager 来启动 ActivityTaskManagerService,管理 Activity 任务栈。ActivityTaskManagerService atm = mSystemServiceManager.startService(ActivityTaskManagerService.Lifecycle.class).getService();// 启动 ActivityManagerService,管理 Activity 等。mActivityManagerService = ActivityManagerService.Lifecycle.startService(mSystemServiceManager, atm);// 让 ActivityManagerService 拿到 systemServer,例如可以通过 mSystemServiceManager 来判断系统是否启动完成。mActivityManagerService.setSystemServiceManager(mSystemServiceManager);mActivityManagerService.setInstaller(installer);mWindowManagerGlobalLock = atm.getGlobalLock();t.traceEnd();...// 启用 PowerManagerService 服务,电源管理服务。t.traceBegin("StartPowerManager");mPowerManagerService = mSystemServiceManager.startService(PowerManagerService.class);t.traceEnd();...// 启动屏幕亮度服务,比如亮度调整。t.traceBegin("StartLightsService");mSystemServiceManager.startService(LightsService.class);t.traceEnd();...// 启动屏幕显示服务。t.traceBegin("StartDisplayManager");mDisplayManagerService = mSystemServiceManager.startService(DisplayManagerService.class);t.traceEnd();...try {...// 启动 PMS,包管理服务。mPackageManagerService = PackageManagerService.main(mSystemContext, installer, domainVerificationService,mFactoryTestMode != FactoryTest.FACTORY_TEST_OFF);} finally {Watchdog.getInstance().resumeWatchingCurrentThread("packagemanagermain");}...// 启动传感器服务。t.traceBegin("StartSensorService");mSystemServiceManager.startService(SensorService.class);t.traceEnd();t.traceEnd(); }可以看到大多数服务都是通过 mSystemServiceManager.startService 来启动,接下来看看 startService 方法内容。
-
SystemServiceManager.startService
路径:/frameworks/base/services/core/java/com/android/server/SystemServiceManager.javapublic <T extends SystemService> T startService(Class<T> serviceClass) {try {final String name = serviceClass.getName();...final T service;try {// 反射拿到该 Java 类Constructor<T> constructor = serviceClass.getConstructor(Context.class);service = constructor.newInstance(mContext);}...// 将当前服务(Java类)加入 SystemService 服务队列中,统一管理。startService(service);return service;} finally {Trace.traceEnd(Trace.TRACE_TAG_SYSTEM_SERVER);} }路径:/frameworks/base/services/core/java/com/android/server/SystemServiceManager.javapublic void startService(@NonNull final SystemService service) {...// 将当前服务加入 mServices 队列中。mServices.add(service);long time = SystemClock.elapsedRealtime();try {// 调用当前服务的 onStart 来启动服务。service.onStart();} catch (RuntimeException ex) {...}warnIfTooLong(SystemClock.elapsedRealtime() - time, service, "onStart"); }可以看到 startService 方法就是反射拿到服务类,然后加入队列中,调用其 onStart 方法进行启动。
-
ServiceManager 服务管理
每个属于 SystemServer 的服务都将加入到 ServiceManager 的 binder 线程池中,以供后续直接获取和管理。就拿 BatteryService 服务来讲解:
路径:/frameworks/base/services/java/com/android/server/SystemServer.javamSystemServiceManager.startService(BatteryService.class);已知 startService 后会调用 BatteryService 服务的 onStart 方法,继续看看 onStart 内部:
路径:/frameworks/base/services/core/java/com/android/server/BatteryService.java@Override public void onStart() {...mBinderService = new BinderService();// 将 BinderService 服务加入 ServiceManager 中。publishBinderService("battery", mBinderService);mBatteryPropertiesRegistrar = new BatteryPropertiesRegistrar();// 将 batteryproperties 服务加入 ServiceManager 中。publishBinderService("batteryproperties", mBatteryPropertiesRegistrar);// 将 BinderService 服务加入到 LocalServices 中。publishLocalService(BatteryManagerInternal.class, new LocalService()); }继续看看 mBinderService 具体是什么,又是如何加入到 ServiceManager 中的:
路径:/frameworks/base/services/core/java/com/android/server/BatteryService.javaprivate final class BinderService extends Binder {... }可以看到 mBinderService 就是一个 Binder,然后调用 publishBinderService 加入到 ServiceManager 中的 binder 线程池中:
路径:/frameworks/base/services/core/java/com/android/server/SystemService.javaprotected final void publishBinderService(String name, IBinder service,boolean allowIsolated, int dumpPriority) {ServiceManager.addService(name, service, allowIsolated, dumpPriority); }调用 ServiceManager.addService 加入到 binder 线程池中,而 ServiceManager 服务早就在 servicemanager.rc 文件中作为核心服务启动了:
路径:/frameworks/native/cmds/servicemanager/servicemanager.rcservice servicemanager /system/bin/servicemanagerclass core animationuser systemgroup system readproccriticalfile /dev/kmsg wonrestart setprop servicemanager.ready falseonrestart restart --only-if-running apexdonrestart restart audioserveronrestart restart gatekeeperdonrestart class_restart --only-enabled mainonrestart class_restart --only-enabled halonrestart class_restart --only-enabled early_haltask_profiles ServiceCapacityLowshutdown critical
二、总结
SystemServer 作为 Android 系统的核心组成部分之一,通过 fork 自 init 进程,在启动过程中创建并启动各类系统服务(核心服务、引导服务、其他服务),并将这些服务内建的 Binder 实例注册到 ServiceManager 的 binder 线程池中,从而实现了系统服务的高效管理和跨进程通信。
参考
基于Android13的系统启动流程分析(六)之SystemServer内部逻辑分析
相关文章:
【Android】系统启动流程分析 —— SystemServer 处理过程
本文基于 Android 14.0.0_r2 的系统启动流程分析。 SystemServer 进程主要用于创建系统服务,我们熟知的 AMS、WMS 和 PMS 都是由它来创建的,因此掌握 SystemServer 进程是如何启动的,它在启动时做了哪些工作是十分必要的。 一、源码解析 Zyg…...
Web前端—属性描述符
属性描述符 假设有一个对象obj var obj {a:1 }观察这个对象,我们如何来描述属性a: 值为1可以重写可以遍历 我们可以通过Object.getOwnPropertyDescriptor得到它的属性描述符 var desc Object.getOwnPropertyDescriptor(obj, a); console.log(desc);我…...
SpringBoot及其特性
0.前言 Spring 框架提供了很多现成的功能。那么什么是 Spring Boot?使用 Spring 框架,我们可以避免编写基础框架并快速开发应用程序。为了让 Spring 框架提供基础框架,我们需要向 Spring 框架描述有关我们的应用程序及其组件的信息。 不只是…...
「JavaEE」初识进程
初识进程 🍉进程🍌操作系统的进程管理 🍉PCB 重要属性🍌进程的身份标识🍌内存指针🍌文件描述符表🍌进程的状态🍌优先级🍌记账信息🍌上下文 🍉内存…...
计算机视觉——图像特征提取D2D先描述后检测特征提取算法原理
概述 局部特征提取是计算机视觉中的一个重要任务,它旨在从图像中提取出能够代表图像局部结构和外观信息的特征。这些特征通常用于图像匹配、物体识别、三维重建、跟踪和许多其他应用。传统方法,如尺度不变特征变换(SIFT)…...
The “from“ argument must be of type string. Received undefined——vue报错记录
今天在用机器人打包测试环境时,一直报错: The "from" argument must be of type string. Received undefined 啥意思呐? 百度也没有找到对应的问题所在。 下面写一下我的解决方法: vue.config.js 在vue.config.js中…...
汽车4S行业的信息化特点与BI建设挑战
汽车行业也是一个非常大的行业,上下游非常广,像主机厂,上游的零配件,下游的汽车流通,汽车流通之后的汽车后市场,整个链条比较长。今天主要讲的是汽车流通,汽车4S集团。一个汽车4S集团下面授权代…...
JSX 和 HTML 之间的区别
JSX和 HTML 都是用于创建和构建网页的标记语言,但它们有一些关键的区别。 1. JSX 是 JavaScript 的语法扩展,而 HTML 是一种标记语言。 2. JSX 允许您在语法中包含表达式和函数,而 HTML 只允许静态文本。 3. JSX 通常用于 React 应用程序&…...
AI日报:GPT-4-Turbo正式版自带读图能力;Gemini1.5Pro开放API;SD3将于4月中旬发布;抖音宫崎骏AI特效爆火
欢迎来到【AI日报】栏目!这里是你每天探索人工智能世界的指南,每天我们为你呈现AI领域的热点内容,聚焦开发者,助你洞悉技术趋势、了解创新AI产品应用。 新鲜AI产品点击了解:AIbase - 智能匹配最适合您的AI产品和网站 ὏…...
IDEA 宝贝插件
1. Codota— 代码智能提示 Codota还包含一个网站:https://www.codota.com/code 2.Alibaba Java Code Guidelines— 阿里巴巴 Java 代码规范 3. SequenceDiagram —— 调用链路自动生成时序图 4. google-java-format —— 代码自动格式化...
[C语言][数据结构][链表] 单链表的从零实现!
目录 零.必备知识 1.一级指针 && 二级指针 2. 节点的成员列表 a.数据 b.指向下一个节点的指针. 3. 动态内存空间的开辟 (malloc-calloc-realloc) 一.单链表的实现与销毁 1.1 节点的定义 1.2 单链表的尾插 1.3 单链表的头插 1.4 单链表的尾删 1.5 单链表的头删 1…...
oracle rac打补丁后sqlplus / as sysdba ora-12537
sqlplus / as sysdba 报错: ORA-12537: TNS:connection closed 检查用户属组: [rootrac1 ~]# id oracle uid1102(oracle) gid1101(oinstall) groups1101(oinstall),1102(dba) [rootrac1 ~]# id grid uid1101(grid) gid1101(oinstall) groups1101(oin…...
TCP-IP详解卷一:协议——阅读总结
该内容适合程序员查看 第1章 概述 1.1 引言 WAN全称是 Wide Area Network,中文名为广域网。 LAN全称是 Local Area Network,中文名为局域网。 1.2分层 ICP/IP协议族通常被认为是一个四层协议系统 分层协议应用层Telnet、FTP和e-mail运输层TCP和UDP网…...
【带源码】如何开发一个视频打赏,付费观看视频的系统?
【带源码】如何开发一个视频打赏,付费观看视频的系统?开发指南来了 最近非常火爆的视频打赏系统,有用户端,管理端,代理端 风口来了,系统部署简单,需要详细部署教程的可以留下评论哦!…...
Linux--进程的概念(一)
目录 一、冯诺依曼体系结构二、操作系统2.1 什么是操作系统2.2 操作系统的意义 三、进程3.1 进程的基本概念3.2 描述进程——PCB3.3 进程和程序的区别3.4 task_struct-PCB的一种3.5 task_struct的内容分类 四、如何查看进程4.1 通过系统文件查看进程4.2 通过ps指令查看进程 五、…...
大话设计模式——15.观察者模式(Observer Pattern)
简介 也称发布订阅模式(Publish/Subscribe),定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新 UML图: 应用场景: 消息通知组件&#x…...
MySQL 主从复制部署(8.0)
什么是主从数据库 主从数据库是一种数据库架构模式,通常用于提高数据库的性能、可用性和可伸缩性。 它包括两种类型的数据库服务器: 1)主数据库(Master):主数据库是读写数据的主要数据库服务器。所有写操…...
大话设计模式——16.命令模式(Command Pattern)
简介 请求以命令的形式包裹在对象中,并传给调用对象。调用对象寻找可以处理该命令的对象进行执行。命令模式是一种特殊的策略模式,体现多个策略执行的问题,而不是选择的问题 UML图 应用场景 界面选择、键盘、按钮、事件操作都类似命令模式 …...
react17+18 中 setState是同步还是异步更新
在类组件中使用setState,在函数式组件中使用hooks的useState。 setstate目录 1. 类组件1.1 react 17版本1.2 react 18版本 2、函数式组件 1. 类组件 1.1 react 17版本 参考内容:第十一篇:setState 到底是同步的,还是异步的&…...
Unity框架,ET框架8.1版本的打包流程记录
目录 打包代码前置1.必须要安装Visusal Studio 2022的组件,如下图,必须都要进行安装,不然会在代码重构的时候报错,丢失SDK。Rider的版本必须2023及以上 步骤一、使用Rider编辑器打开项目后进行重构项目步骤二、使用HybirdCLR生成A…...
SpringBoot-17-MyBatis动态SQL标签之常用标签
文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...
TDengine 快速体验(Docker 镜像方式)
简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能,本节首先介绍如何通过 Docker 快速体验 TDengine,然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker,请使用 安装包的方式快…...
Java - Mysql数据类型对应
Mysql数据类型java数据类型备注整型INT/INTEGERint / java.lang.Integer–BIGINTlong/java.lang.Long–––浮点型FLOATfloat/java.lang.FloatDOUBLEdouble/java.lang.Double–DECIMAL/NUMERICjava.math.BigDecimal字符串型CHARjava.lang.String固定长度字符串VARCHARjava.lang…...
Java-41 深入浅出 Spring - 声明式事务的支持 事务配置 XML模式 XML+注解模式
点一下关注吧!!!非常感谢!!持续更新!!! 🚀 AI篇持续更新中!(长期更新) 目前2025年06月05日更新到: AI炼丹日志-28 - Aud…...
反射获取方法和属性
Java反射获取方法 在Java中,反射(Reflection)是一种强大的机制,允许程序在运行时访问和操作类的内部属性和方法。通过反射,可以动态地创建对象、调用方法、改变属性值,这在很多Java框架中如Spring和Hiberna…...
令牌桶 滑动窗口->限流 分布式信号量->限并发的原理 lua脚本分析介绍
文章目录 前言限流限制并发的实际理解限流令牌桶代码实现结果分析令牌桶lua的模拟实现原理总结: 滑动窗口代码实现结果分析lua脚本原理解析 限并发分布式信号量代码实现结果分析lua脚本实现原理 双注解去实现限流 并发结果分析: 实际业务去理解体会统一注…...
今日科技热点速览
🔥 今日科技热点速览 🎮 任天堂Switch 2 正式发售 任天堂新一代游戏主机 Switch 2 今日正式上线发售,主打更强图形性能与沉浸式体验,支持多模态交互,受到全球玩家热捧 。 🤖 人工智能持续突破 DeepSeek-R1&…...
UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)
UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中,UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化…...
【学习笔记】深入理解Java虚拟机学习笔记——第4章 虚拟机性能监控,故障处理工具
第2章 虚拟机性能监控,故障处理工具 4.1 概述 略 4.2 基础故障处理工具 4.2.1 jps:虚拟机进程状况工具 命令:jps [options] [hostid] 功能:本地虚拟机进程显示进程ID(与ps相同),可同时显示主类&#x…...
鸿蒙DevEco Studio HarmonyOS 5跑酷小游戏实现指南
1. 项目概述 本跑酷小游戏基于鸿蒙HarmonyOS 5开发,使用DevEco Studio作为开发工具,采用Java语言实现,包含角色控制、障碍物生成和分数计算系统。 2. 项目结构 /src/main/java/com/example/runner/├── MainAbilitySlice.java // 主界…...
