2024年Android最全线程监控 - 线程基础知识扫盲,android界面开发工具

写在最后

最后我想说:对于程序员来说,要学习的知识内容、技术有太多太多,要想不被环境淘汰就只有不断提升自己,从来都是我们去适应环境,而不是环境来适应我们!

这里附上上述的技术体系图相关的几十套腾讯、头条、阿里、美团等公司2021年的面试题,把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节,由于篇幅有限,这里以图片的形式给大家展示一部分。

相信它会给大家带来很多收获:

当程序员容易,当一个优秀的程序员是需要不断学习的,从初级程序员到高级程序员,从初级架构师到资深架构师,或者走向管理,从技术经理到技术总监,每个阶段都需要掌握不同的能力。早早确定自己的职业方向,才能在工作和能力提升中甩开同龄人。

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

2. 内存模型

在介绍 Java 内存模型之前,先来看一下到底什么是计算机内存模型,然后再来看 Java 内存模型在计算机内存模型的基础上做了哪些事情。先看一下为什么要有内存模型。

我们应该都知道,计算机在执行程序的时候,每条指令都是在 CPU 中执行的,而执行的时候,又免不了要和数据打交道。而计算机上面的数据,是存放在主存当中的,也就是计算机的物理内存啦。刚开始,还相安无事的,但是随着 CPU 技术的发展,CPU 的执行速度越来越快。而由于内存的技术并没有太大的变化,所以从内存中读取和写入数据的过程和 CPU 的执行速度比起来差距就会越来越大,这就导致 CPU 每次操作内存都要耗费很多等待时间。所以,人们想出来了一个好的办法,就是在 CPU 和内存之间增加高速缓存。缓存的概念大家都知道,就是保存一份数据拷贝。它的特点是速度快,内存小,并且昂贵。那么,程序的执行过程就变成了:当程序在运行过程中,会将运算需要的数据从主存复制一份到 CPU 的高速缓存当中,那么 CPU 进行计算时就可以直接从它的高速缓存读取数据和向其中写入数据,当运算结束之后,再将高速缓存中的数据刷新到主存当中。随着 CPU 能力的不断提升,一层缓存就慢慢的无法满足要求了,就逐渐的衍生出多级缓存。按照数据读取顺序和与CPU结合的紧密程度,CPU 缓存可以分为一级缓存(L1),二级缓存(L3),部分高端 CPU 还具有三级缓存(L3),每一级缓存中所储存的全部数据都是下一级缓存的一部分。这三种缓存的 技术难度和制造成本是相对递减的,所以其容量也是相对递增的。那么,在有了多级缓存之后,程序的执行就变成了:当 CPU 要读取一个数据时,首先从一级缓存中查找,如果没有找到再从二级缓存中查找,如果还是没有就从三级缓存或内存中查找。单核 CPU 只含有一套L1,L2,L3缓存。如果 CPU 含有多个核心,即多核 CPU,则每个核心都含有一套L1(甚至和L2)缓存,而共享L3(或者和L2)缓存。

从上面的分析来看,这样就会导致一个问题,那就是多线程 CUP 缓存一致性的问题,也就是大家常常说的**原子性问题,可见性问题和有序性问题等等。其本质其实就是 CPU 缓存优化后所带来的后遗症。**出现问题就得解决问题,按照我们平时普通的思路就是回退版本,废除掉处理器和处理器的优化技术、废除CPU缓存,让CPU直接和主存交互,这肯定是不行的。因此内存模型就诞生了,内存模型就是用来解决 CPU 缓存优化后所带来的后遗症。Java 的内存模型如下:

JVM内存模型

3. 线程常见问题分析

Java 后台工程师经常会碰到一些问题像 CPU 飙高、Load 高、响应很慢等等,作为 Android 工程师由于很少会涉及到并发请求的处理,因此我们很少会刨根问底的去深究线程这一块。虽然遇到的问题可能会千奇百怪但是问题的本质是不会变的,这也是为什么我一再强调大家要把基础打牢,要多花些时间在 Linux 内核和系统源码上面。可以这么说,在 Android 场景下我们遇到的线程问题,只要从 Linux 内核和 JVM 的内存模型这两个方向去分析即可。

3.1. 线程池该怎么用

线程池参数有非常多:核心线程数、最大线程数,队列等等。在实际的过程中怎么用呢?其实无非就是前面提到的两点:

  • 第一是尽量减少上下文的切换次数,尽可能少的创建些进程
  • 第二是尽量提高 CPU 的使用率,尽可能多的创建些进程

直接看上去这两点像是冲突了,但在实际的场景中是不冲突的,比如我们在系统架构时分析过 OkHttp 的源码,我们不妨来看下它内部使用的线程池:
public synchronized ExecutorService executorService() {
if (executorService == null) {
// 核心线程数是 0 ,最大线程数是 Integer.MAX_VALUE
executorService = new ThreadPoolExecutor(0, Integer.MAX_VALUE, 60, TimeUnit.SECONDS,
new SynchronousQueue(), Util.threadFactory(“OkHttp Dispatcher”, false));
}
return executorService;
}

最后

文章不易,如果大家喜欢这篇文章,或者对你有帮助希望大家多多点赞转发关注哦。文章会持续更新的。绝对干货!!!

  • Android进阶学习全套手册
    关于实战,我想每一个做开发的都有话要说,对于小白而言,缺乏实战经验是通病,那么除了在实际工作过程当中,我们如何去更了解实战方面的内容呢?实际上,我们很有必要去看一些实战相关的电子书。目前,我手头上整理到的电子书还算比较全面,HTTP、自定义view、c++、MVP、Android源码设计模式、Android开发艺术探索、Java并发编程的艺术、Android基于Glide的二次封装、Android内存优化——常见内存泄露及优化方案、.Java编程思想 (第4版)等高级技术都囊括其中。

  • Android高级架构师进阶知识体系图
    关于视频这块,我也是自己搜集了一些,都按照Android学习路线做了一个分类。按照Android学习路线一共有八个模块,其中视频都有对应,就是为了帮助大家系统的学习。接下来看一下导图和对应系统视频吧!!!

  • Android对标阿里P7学习视频

  • BATJ大厂Android高频面试题
    这个题库内容是比较多的,除了一些流行的热门技术面试题,如Kotlin,数据库,Java虚拟机面试题,数组,Framework ,混合跨平台开发,等

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

  • 18
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值