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

Android启动优化指南

文章目录

  • 前言
  • 一、启动分类与优化目标
    • 1、冷启动
      • 1.1 优化思路
      • 1.2 延迟初始化与按需加载
      • 1.3 并行加载与异步执行
      • 1.4 资源优化与懒加载
      • 1.5 内存优化与垃圾回收控制
    • 2. 温启动
      • 2.1 优化应用的生命周期管理
      • 2.2 数据缓存与懒加载
      • 2.3 延迟渲染与视图优化
    • 3. 热启动
      • 3.1 保持应用的状态
      • 3.2 优化 UI 渲染
  • 二、如何查看启动指标
    • 查看冷启动指标
    • 查看温启动指标
    • 查看热启动指标
    • 通过 Logcat 辅助分析


前言

应用启动时间是用户体验的重要指标,特别是首次启动时,优化可以显著提高用户对产品的满意度。以下是优化 Android 应用启动时间的常用策略:


一、启动分类与优化目标

1、冷启动

定义:
应用被完全杀死后再次启动。此时需要重新加载应用所有资源和界面,耗时最长。

典型场景:
用户首次启动应用,或应用被系统回收后重新打开。

启动流程:
冷启动时的基本流程如下:
1、启动应用进程:操作系统为应用创建一个新的进程。
2、初始化 Application 类:应用的 Application 类会被初始化,这是整个应用的入口点。
3、加载 ContentProvider:如果应用中使用了 ContentProvider,这些组件会在启动时被初始化。
4、加载资源:应用的布局、图片、字符串等资源需要被加载到内存。
5、启动 Activity:应用的第一个界面(通常是 MainActivity)会被创建并展示给用户。


1.1 优化思路

仅仅提供思路,需要具体情况具体分析

优化冷启动的关键在于减少上述步骤中不必要的操作,将耗时的操作分散到启动后的阶段,或者采用懒加载技术延迟初始化。


1.2 延迟初始化与按需加载

冷启动时,如果在主线程中执行长时间的操作(如数据库初始化、网络请求、广告资源加载等),会导致启动时间大幅延长。因此,推迟不必要的操作直到真正需要时再执行,是优化的核心。

方案:
按需加载:非核心资源(如广告、第三方 SDK、数据库等)应使用延迟加载策略,避免阻塞应用启动。
协程与异步操作:通过使用协程在后台线程执行非紧急任务,如加载图片、初始化数据库等,确保主线程的流畅性。

class MyApplication : Application() {override fun onCreate() {super.onCreate()// 异步初始化数据库CoroutineScope(Dispatchers.IO).launch {initializeDatabase()}// 延迟加载第三方 SDKCoroutineScope(Dispatchers.IO).launch {loadThirdPartySDK()}}private suspend fun initializeDatabase() {// 模拟数据库初始化过程delay(800)Log.d("MyApplication", "Database Initialized")}private suspend fun loadThirdPartySDK() {// 模拟第三方 SDK 初始化delay(600)Log.d("MyApplication", "Third Party SDK Loaded")}
}

1.3 并行加载与异步执行

冷启动时,多个任务通常是独立的(如资源文件加载、用户数据加载、广告初始化等)。利用并行加载和异步执行策略,可以减少启动时间并避免串行执行的瓶颈。

方案:
并行任务调度:通过协程的 async 和 await,可以并行执行多个独立任务,避免串行等待。
轻量级线程管理:协程相较于传统线程消耗资源更少,能够在保证高效性的同时,不会产生过多的上下文切换开销。

class MainActivity : AppCompatActivity() {override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)// 启动并行加载任务GlobalScope.launch(Dispatchers.Main) {val networkData = async { fetchNetworkData() }val localData = async { loadLocalCacheData() }// 并行加载并返回数据val data1 = networkData.await()val data2 = localData.await()updateUI(data1, data2)}}private suspend fun fetchNetworkData(): String {delay(1000)  // 模拟网络请求return "Network Data"}private suspend fun loadLocalCacheData(): String {delay(500)  // 模拟本地缓存加载return "Local Data"}private fun updateUI(data1: String, data2: String) {Log.d("MainActivity", "Data loaded: $data1, $data2")}
}

1.4 资源优化与懒加载

冷启动过程中,应用可能需要加载大量的资源文件,尤其是图片、视频等大文件。这些资源的加载常常是冷启动过程中性能瓶颈的主要来源。通过资源优化和懒加载策略,可以减少启动过程中的 IO 操作和内存消耗。

方案:
图片资源优化:图片在加载时可以采用更高效的格式(如 WebP)和尺寸(如按需加载不同分辨率的图像),避免大图片文件的加载拖慢启动速度。
懒加载非核心资源:将非核心资源(如广告素材、非关键功能的资源)推迟加载,甚至使用占位图或低质量图像代替。

class MainActivity : AppCompatActivity() {override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)// 异步加载图片loadImageAsync()}private fun loadImageAsync() {// 使用协程加载图片GlobalScope.launch(Dispatchers.IO) {val image = loadImage()withContext(Dispatchers.Main) {// 将图片加载到 UIfindViewById<ImageView>(R.id.imageView).setImageBitmap(image)}}}private suspend fun loadImage(): Bitmap {delay(500)  // 模拟图片加载return BitmapFactory.decodeResource(resources, R.drawable.sample_image)}
}

1.5 内存优化与垃圾回收控制

冷启动过程中,内存使用情况和垃圾回收(GC)的执行会对启动性能产生影响。如果应用在启动过程中频繁触发 GC,可能会导致性能显著下降。优化内存管理和减少 GC 的干扰,可以有效提升冷启动的性能。

方案:
内存池和对象复用:避免频繁创建大对象,利用对象池和缓存来复用内存中的对象。
优化 GC 频率:通过合理设计内存分配和回收策略,减少启动过程中不必要的垃圾回收操作。


2. 温启动

定义:
温启动(Warm Start)是指应用已经处于后台,但用户重新打开时的启动过程。与冷启动不同,温启动通常涉及到较少的资源加载,因为大部分数据和资源已被缓存,因此启动时间较短。
然而,即便如此,优化温启动依然是提升应用性能和用户体验的关键环节。优化温启动不仅可以减少启动时间,还能提升应用的响应速度和流畅性。

2.1 优化应用的生命周期管理

应用在后台运行时,可能会在某些情况下被系统回收或者资源被清理掉,这样当应用重新启动时就需要重新加载资源。因此,合理的生命周期管理对温启动性能至关重要。

方案:

  • 避免不必要的资源释放:在应用切换到后台时,应避免释放过多的资源。尽量使用缓存机制保留必要的数据,避免重新加载。
  • 利用 onPause() 和 onStop() 方法优化资源:确保在后台时清理无关的资源和任务,以便下次启动时不需要重新加载。
class MainActivity : AppCompatActivity() {override fun onPause() {super.onPause()// 暂停不重要的资源或任务,确保温启动时能快速恢复pauseResources()}override fun onStop() {super.onStop()// 清理不需要的资源releaseUnnecessaryResources()}private fun pauseResources() {// 暂停网络请求或其他耗时操作}private fun releaseUnnecessaryResources() {// 释放缓存或内存中的大对象}
}

2.2 数据缓存与懒加载

温启动中,数据已经在应用中缓存,但仍有一些资源可能需要重新加载。通过合理使用缓存机制,可以大大减少加载时间,并优化用户体验。

方案:
内存缓存:对于一些常用数据,可以使用内存缓存(如 LruCache)避免重复从网络或数据库中加载。
磁盘缓存:如果数据量较大或无法完全存放在内存中,可以利用磁盘缓存来存储数据。对于图片或较大的资源,可以使用 DiskLruCache 来缓存数据。
懒加载:非关键数据(如广告、推荐内容等)可以采用懒加载策略,避免在温启动时进行不必要的加载。

class MainActivity : AppCompatActivity() {private val memoryCache: LruCache<String, String> = LruCache(1024)override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)// 通过缓存加载数据val cachedData = memoryCache.get("key") ?: loadDataFromDisk()displayData(cachedData)}private fun loadDataFromDisk(): String {// 从磁盘加载数据(示例)return "Cached Data"}private fun displayData(data: String) {// 显示数据Log.d("MainActivity", "Displaying data: $data")}
}

2.3 延迟渲染与视图优化

即使在温启动过程中,某些视图或组件的渲染也可能造成延迟,尤其是当布局复杂、图像过大时。通过优化视图的渲染过程,可以显著提升启动速度。

方案:

  • 延迟渲染复杂视图:对于一些计算密集型的视图组件,可以延迟加载或使用占位符进行替代,直到应用界面完全展示。
  • 避免复杂的布局嵌套:复杂的视图层次和布局渲染可能导致启动延迟,尽量使用简单、扁平的布局结构。
  • RecyclerView 优化:对于列表类视图,使用 RecyclerView 并优化其适配器,以便快速加载大量数据。
class MainActivity : AppCompatActivity() {override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)val recyclerView: RecyclerView = findViewById(R.id.recyclerView)recyclerView.layoutManager = LinearLayoutManager(this)// 延迟加载 RecyclerView 的数据GlobalScope.launch(Dispatchers.Main) {val data = loadData()recyclerView.adapter = MyAdapter(data)}}private suspend fun loadData(): List<String> {delay(500)  // 模拟加载数据return List(20) { "Item $it" }}
}

3. 热启动

定义:
热启动(Hot Start)指的是应用已经在内存中运行,用户通过点击图标或通过某些交互再次进入应用,通常情况下,热启动的性能要求非常高,因为应用状态已经存在于内存中,理想情况下启动应该是瞬时的。

典型场景:
用户快速切换应用后返回,应用无需重新初始化。

启动流程:
直接恢复到栈顶 Activity,无需任何创建操作。

3.1 保持应用的状态

在热启动过程中,保持应用状态和数据的一致性是非常重要的。合理管理和保存应用状态可以让用户在重新进入应用时,继续他们的上一个操作,而无需重新加载或重新计算数据。通过智能的状态管理,可以大幅度提高用户体验。

方案

  • 保存 Activity 状态:可以使用 onSaveInstanceState() 和 onRestoreInstanceState() 方法在活动(Activity)之间保存和恢复状态。这对于维持用户的当前视图和输入数据非常重要。
  • 保持共享数据:使用 SharedPreferences、数据库、内存缓存等方式保存关键数据,避免重新加载数据或重新计算状态。
  • Fragment 管理:对于复杂的界面,可以在 Fragment 中维护各自的状态,避免不必要的重建。
class MainActivity : AppCompatActivity() {override fun onSaveInstanceState(outState: Bundle) {super.onSaveInstanceState(outState)// 保存应用状态数据outState.putString("key", "some_data")}override fun onRestoreInstanceState(savedInstanceState: Bundle) {super.onRestoreInstanceState(savedInstanceState)// 恢复应用状态val restoredData = savedInstanceState.getString("key")Log.d("MainActivity", "Restored data: $restoredData")}
}

3.2 优化 UI 渲染

在热启动过程中,UI 渲染速度是影响用户体验的关键因素。如果应用的界面加载太慢,用户可能会感觉到卡顿或延迟。通过优化布局和渲染过程,可以显著提升热启动的性能。

方案
避免复杂布局:减少布局层级和复杂的视图嵌套,尽量使用简单扁平化的布局结构。
使用 ConstraintLayout:相比于传统的 LinearLayout 或 RelativeLayout,ConstraintLayout 提供了更高效的布局性能,适合复杂的 UI 布局。
图片优化:图片加载过程是热启动中的常见瓶颈。通过使用图片压缩、合理的缓存策略和异步加载,可以大幅度提升 UI 渲染速度。

class MainActivity : AppCompatActivity() {override fun onStart() {super.onStart()// 图片优化示例:使用 Glide 加载图片Glide.with(this).load("image.jpg").into(findViewById(R.id.imageView))}
}

二、如何查看启动指标

查看冷启动指标

1、杀掉当前应用进程
2、使用 adb shell am start -W -n / 命令启动应用:

adb shell am start -W -n <package>/<activity>

是你应用的包名(例如 com.example.myapp)。
是应用的主界面或启动 Activity(例如 com.example.myapp.MainActivity)。

输出示例:

Starting: Intent { cmp=com.example.myapp/.MainActivity }
Total time: xxx ms (init + launch + resume)
Wait time: xxx ms
This time: xxx ms

Total time:从启动应用到应用准备好展示界面所花费的总时间。(括应用的初始化、界面加载、Activity 启动等操作的总时间。)
Wait time:等待启动的时间,通常是 Activity 被加载的时间,表示你点击应用图标到 Activity 启动过程中等待的时间。(是从按下应用图标到系统开始启动该应用所需的时间。)
This time:实际花费的时间,即冷启动时长。(表示冷启动过程中从系统启动到主界面完全加载出来所花费的时间。)

查看温启动指标

准备工作:

  • 确保应用正在运行。
  • 将应用退到后台(按 Home 键,应用状态变为 onPause() 和 onStop())。

执行命令:

adb shell am start -W -n <package>/<activity>

输出结果:

Starting: Intent { cmp=com.example.myapp/.MainActivity }
Total time: 234 ms
Wait time: 200 ms
This time: 34 ms

Total time:温启动的总时间,包括从后台唤醒进程和恢复 Activity 的时间。
Wait time:系统调度启动任务的时间。
This time:Activity 从后台恢复到前台的时间。

查看热启动指标

准备工作:

  • 确保应用在前台运行。

执行命令:

adb shell am start -W -n <package>/<activity>

输出结果:

Starting: Intent { cmp=com.example.myapp/.MainActivity }
Total time: 234 ms
Wait time: 200 ms
This time: 34 ms

Total time:热启动的总时间,通常会非常短,因为应用已经在运行。
This time:从点击到完成界面刷新所花费的时间。


启动类型特点时间特点
冷启动应用完全退出或被清理,需要重新加载资源、启动进程和初始化。时间最长(数百到上千ms)
温启动应用仍在后台保留进程,只需将其唤醒并恢复界面状态。时间中等(几十到数百ms)
热启动应用已在前台运行,仅需重新渲染界面(无明显启动过程)。时间最短(几十ms以内)

通过 Logcat 辅助分析

你可以结合 Logcat 查看启动过程中的生命周期方法来确认启动类型:

  • 冷启动:从 Application#onCreate() 开始。
  • 温启动:从 Activity#onRestart() 或 Activity#onStart() 开始。
  • 热启动:仅触发 Activity#onResume()。

如果从 Application#onCreate() 开始,说明是冷启动。
如果从 onRestart() 或 onStart() 开始,说明是温启动。
如果仅触发 onResume(),说明是热启动。

相关文章:

Android启动优化指南

文章目录 前言一、启动分类与优化目标1、冷启动1.1 优化思路1.2 延迟初始化与按需加载1.3 并行加载与异步执行1.4 资源优化与懒加载1.5 内存优化与垃圾回收控制 2. 温启动2.1 优化应用的生命周期管理2.2 数据缓存与懒加载2.3 延迟渲染与视图优化 3. 热启动3.1 保持应用的状态3.…...

【ETCD】【源码阅读】configureClientListeners () 函数解析

逐步解析 configureClientListeners 函数 configureClientListeners 是 ETCD 的一个重要函数&#xff0c;用于配置客户端通信的监听器&#xff08;Client Listeners&#xff09;。这些监听器主要负责处理外部客户端与 ETCD 服务之间的通信&#xff0c;包括 HTTP 和 gRPC 请求。…...

IO进程学习笔记

man手册 普通命令。系统调用的函数。库函数。特殊文件。文件格式。游戏。附加的一些变量 IO介绍 I&#xff1a;input 输入 O&#xff1a;output 输出 对文件的输入和输出 输入-》写文件&#xff0c;将文件中的内容写到内存中去 输出-》读文件&#xff0c;将内存中的内容读取到文…...

智能手机回暖:华为点火,小米荣耀OV拱火

进入11月中下旬&#xff0c;智能手机圈再度热闹起来。包括华为、小米、OPPO、vivo等诸多手机厂商&#xff0c;都在陆续预热发布新机&#xff0c;其中就包括华为Mate 70、小米Redmi K80、vivo的S20&#xff0c;IQOO Neo10等热门新机&#xff0c;这些热门新机的集中上市迅速吸引了…...

Sqoop导入数据(mysql---->>hive)

目录 数据传输流程脚本报错和异常说明1. Caused by: java.lang.ClassNotFoundException: org.apache.hadoop.hive.conf.HiveConf2. 数据导入hive后显示NULL 数据传输流程 mysql---->>hdfs---->>hive 数据从mysql表中取出&#xff0c;放到hdfs上&#xff08;由targ…...

实验3-实时数据流处理-Flink

1.前期准备 &#xff08;1&#xff09;Flink基础环境安装 参考文章&#xff1a; 利用docker-compose来搭建flink集群-CSDN博客 显示为这样就成功了 &#xff08;2&#xff09;把docker&#xff0c;docker-compose&#xff0c;kafka集群安装配置好 参考文章&#xff1a; …...

深度学习实验十四 循环神经网络(1)——测试简单循环网络的记忆能力

目录 一、数据集构建 1.1数据集的构建函数 1.2加载数据集并划分 1.3 构建Dataset类 二、模型构建 2.1嵌入层 2.2SRN层 2.3模型汇总 三、模型训练 3.1 训练指定长度的数字预测模型 3.2 损失曲线展示 四、模型评价 五、修改 附完整可运行代码 实验大体步骤&#x…...

k8s部署odoo18(kubeshpere面板)

Postgresql部署 链接: kubesphere搭建 postgres15 因为我的是在另一台服务器使用kubesphere进行部署的&#xff0c;如果有和我一样情况的&#xff0c;可以参考上面的文档部署postgreasql。 注意事项&#xff1a; 因为odoo不允许使用postgresql的默认用户&#xff0c;也就是po…...

【模型对比】ChatGPT vs Kimi vs 文心一言那个更好用?数据详细解析,找出最适合你的AI辅助工具!

在这个人工智能迅猛发展的时代&#xff0c;AI聊天助手已经深入我们的工作与生活。你是否曾在选择使用ChatGPT、Kimi或是百度的文心一言时感到一头雾水&#xff1f;每款AI都有其独特的魅力与优势&#xff0c;那么&#xff0c;究竟哪一款AI聊天助手最适合你呢&#xff1f;本文将带…...

Java——容器(单例集合)(上)

一 容器介绍 容器&#xff0c;是用来容纳物体、管理物体。生活中,我们会用到各种各样的容器。如锅碗瓢盆、箱子和包等 程序中的“容器”也有类似的功能&#xff0c;用来容纳和管理数据。比如&#xff0c;如下新闻网站的新闻列表、教育网站的课程列表就是用“容器”来管理 视频…...

如何配置Github并在本地提交代码

前提: 可以流畅访问github, 需要一些上网技巧, 这就自行处理了 申请一个github账号 Github官网地址 首先就是邮箱注册啦, github没有对邮箱的限制, 只要是能收邮件的就ok, qq邮箱, 163等都可以使用. 然后和普通注册账号一样, 一路填写需要的信息, 验证邮箱即可. 如何新增代…...

工作bug,keil5编译器,理解int 类型函数返回值问题,详解!!!

编写不易&#xff0c;禁止搬运&#xff0c;仅供学习&#xff0c;感谢理解 问题现象 下面是一个在keil5里面写的一个&#xff0c;int类型的返回值函数&#xff0c;这个函数里面&#xff0c;只有if else if else这三个判断条件语句&#xff0c;正常来说任何情况下&#xff0c;…...

简明速通Java接口

前言 欢迎来到我的博客 个人主页:北岭敲键盘的荒漠猫-CSDN博客 本文从代码层面直接整理Java接口 让老油子们无需再理解繁杂的概念了。 Java接口在代码层面是做什么的 说白了老铁&#xff0c;Java的接口就是一个类&#xff0c;这个类中只能声明属性和方法&#xff0c;属性需要…...

MVC基础——市场管理系统(二)

文章目录 项目地址三、Produtcts的CRUD3.1 Products列表的展示页面(Read)3.1.1 给Product的Model里添加Category的属性3.1.2 View视图里展示Product List3.2 增加Product数据(Add)3.2.1 创建ViewModel用来组合多个Model3.2.2 在_ViewImposts里引入ViewModels3.2.3 添加Add的…...

java------------常用API preiod duration 计算时间差

1&#xff0c;preiod 如果末天数比初天数小&#xff0c;需要进一位 package API;import java.time.LocalDate; import java.time.Period;public class preiod {public static void main(String[] args) {// 计算时间差// LocalDate获取对象其中的一个方法LocalDate d1 LocalD…...

使用 FAISS 进行高效相似性搜索:从文本检索到动态数据处理

在现代数据科学和人工智能应用中&#xff0c;处理大量高维数据并从中找到相似项是一个常见任务。无论是在推荐系统、搜索引擎&#xff0c;还是在自然语言处理应用中&#xff0c;如何高效地进行相似性搜索&#xff08;Similarity Search&#xff09;一直是一个挑战。为了解决这个…...

执行“go mod tidy”遇到“misbehavior”错误

执行“go mod tidy”报错下错误&#xff0c;执行“go clean -modcache”和删除“go env GOMODCACHE”指定目录均无效&#xff1a; SECURITY ERROR go.sum database server misbehavior detected!old database:go.sum database tree3397826xyyhzdyAOat5li/EXx/MK1gONQf3LAGqArh…...

深入详解人工智能机器学习:强化学习

目录 强化学习概述 强化学习的基本概念 定义 关键组件 强化学习过程 常用算法 应用示例 示例代码 代码解释 应用场景 强化学习核心概念和底层原理 核心概念 底层原理 总结 强化学习概述 强化学习&#xff08;Reinforcement Learning, RL&#xff09;是机器学习中的…...

力扣打卡11:合并区间(比较器内联,引用传参的优化)

链接&#xff1a;56. 合并区间 - 力扣&#xff08;LeetCode&#xff09; 这道题可以用贪心。 首先将intervals的left&#xff08;intervals[i][0]&#xff09;排序。 然后拿出第一个区间&#xff0c;比较后面相邻的区间&#xff1a; 当前right<后left&#xff0c;表示下一…...

《 bilibili-起步级 用户模块接口文档 经验分享 ~》

bilibili - 用户模块接口文档 - 经验分享 ~ 数据库er关系图 : 迅速跳转链接 枚举码实体类 : 迅速跳转链接 使用apifox.json格式导入接口文档 步骤 登录Apifox。新建文件, 将代码粘贴到该文件, 并更改后缀为 .apifox.json进入项目&#xff0c;点击“导入”。选择“Apifox”格式…...

Go 语言接口详解

Go 语言接口详解 核心概念 接口定义 在 Go 语言中&#xff0c;接口是一种抽象类型&#xff0c;它定义了一组方法的集合&#xff1a; // 定义接口 type Shape interface {Area() float64Perimeter() float64 } 接口实现 Go 接口的实现是隐式的&#xff1a; // 矩形结构体…...

c++ 面试题(1)-----深度优先搜索(DFS)实现

操作系统&#xff1a;ubuntu22.04 IDE:Visual Studio Code 编程语言&#xff1a;C11 题目描述 地上有一个 m 行 n 列的方格&#xff0c;从坐标 [0,0] 起始。一个机器人可以从某一格移动到上下左右四个格子&#xff0c;但不能进入行坐标和列坐标的数位之和大于 k 的格子。 例…...

基于Docker Compose部署Java微服务项目

一. 创建根项目 根项目&#xff08;父项目&#xff09;主要用于依赖管理 一些需要注意的点&#xff1a; 打包方式需要为 pom<modules>里需要注册子模块不要引入maven的打包插件&#xff0c;否则打包时会出问题 <?xml version"1.0" encoding"UTF-8…...

【学习笔记】深入理解Java虚拟机学习笔记——第4章 虚拟机性能监控,故障处理工具

第2章 虚拟机性能监控&#xff0c;故障处理工具 4.1 概述 略 4.2 基础故障处理工具 4.2.1 jps:虚拟机进程状况工具 命令&#xff1a;jps [options] [hostid] 功能&#xff1a;本地虚拟机进程显示进程ID&#xff08;与ps相同&#xff09;&#xff0c;可同时显示主类&#x…...

Java数值运算常见陷阱与规避方法

整数除法中的舍入问题 问题现象 当开发者预期进行浮点除法却误用整数除法时,会出现小数部分被截断的情况。典型错误模式如下: void process(int value) {double half = value / 2; // 整数除法导致截断// 使用half变量 }此时...

【从零开始学习JVM | 第四篇】类加载器和双亲委派机制(高频面试题)

前言&#xff1a; 双亲委派机制对于面试这块来说非常重要&#xff0c;在实际开发中也是经常遇见需要打破双亲委派的需求&#xff0c;今天我们一起来探索一下什么是双亲委派机制&#xff0c;在此之前我们先介绍一下类的加载器。 目录 ​编辑 前言&#xff1a; 类加载器 1. …...

华为OD最新机试真题-数组组成的最小数字-OD统一考试(B卷)

题目描述 给定一个整型数组,请从该数组中选择3个元素 组成最小数字并输出 (如果数组长度小于3,则选择数组中所有元素来组成最小数字)。 输入描述 行用半角逗号分割的字符串记录的整型数组,0<数组长度<= 100,0<整数的取值范围<= 10000。 输出描述 由3个元素组成…...

【Linux】Linux安装并配置RabbitMQ

目录 1. 安装 Erlang 2. 安装 RabbitMQ 2.1.添加 RabbitMQ 仓库 2.2.安装 RabbitMQ 3.配置 3.1.启动和管理服务 4. 访问管理界面 5.安装问题 6.修改密码 7.修改端口 7.1.找到文件 7.2.修改文件 1. 安装 Erlang 由于 RabbitMQ 是用 Erlang 编写的&#xff0c;需要先安…...

TJCTF 2025

还以为是天津的。这个比较容易&#xff0c;虽然绕了点弯&#xff0c;可还是把CP AK了&#xff0c;不过我会的别人也会&#xff0c;还是没啥名次。记录一下吧。 Crypto bacon-bits with open(flag.txt) as f: flag f.read().strip() with open(text.txt) as t: text t.read…...

Android屏幕刷新率与FPS(Frames Per Second) 120hz

Android屏幕刷新率与FPS(Frames Per Second) 120hz 屏幕刷新率是屏幕每秒钟刷新显示内容的次数&#xff0c;单位是赫兹&#xff08;Hz&#xff09;。 60Hz 屏幕&#xff1a;每秒刷新 60 次&#xff0c;每次刷新间隔约 16.67ms 90Hz 屏幕&#xff1a;每秒刷新 90 次&#xff0c;…...