- 博客(14)
- 收藏
- 关注
原创 学习规划与设计
2.内部类 匿名内部类 静态内部类的异同。6.threadlocal大致了解一下。4.handler机制详细复习。8.binder机制大概过一下。9.排序算法,二叉树的深度遍历。5.view绘制流程详细复习。7.内存泄漏该怎么分析。1.java六大原则。
2024-03-04 14:53:19 369 1
原创 关于java多线程的一些思考
由于每个元素都枷锁,所以对于1.7版本来说的话,它这个所加的是node,也就是数组元素,数组长度就那点,所以能够同时写的线程数量是和数组长度一致的,因此1.7废弃了segment的实现。但是,从1.7的实现和hashtable进行比对就可以发现,锁优化本质上就是一个将锁的粒度变得越来越细的一个过程,如果足够细,细到原子级别,那就直接就成了cas了,锁的问题基本就没了。很简单,hashmap的结构是数组加链表的结构,如果对整个map加锁的话,那么此时就是hashtable了。否则,不执行赋值操作。
2024-02-28 22:56:43 323
原创 dex2oat编译流程概述
1.setup阶段:解析编译参数,构建dex2oat对象 创建运行时 创建oat art文件从vdex中解析出dex文件,如果vdex是空,那么此时解析dex文件,并将解析后的dex文件加入到vdex当中。speed-profile:对热点代码进行aot编译 生成的机器码存放在 oat文件当中, 热点代码的索引存放在art文件当中。speed:全量编译,将所有的dex字节码编译为机器码,机器码存放在oat文件当中。quicken:优化指令码 ,优化后的指令码信息存放在odex当中。
2024-02-18 19:08:23 966 1
原创 lmkd相关
3.工作原理:内核空间中维护一个列表用户存储进程信息 其他进程信息发生改变时由ams调用ProcessList.updateOomAdj更新内核列表进程信息,在psi压力到达阈值后,lmkd此时会查杀列表里的进程(根据adj优先级进行查杀)1.启动时机:init进程启动后 会启动lmkd进程 这是一个系统进程 用于监听系统压力进行进程查杀的一个守护进程。4.之前lmk时根据vmpressure事件进行查杀的。
2024-02-18 17:32:58 415 1
原创 我的android复习要点
1.activity启动流程(input系统怎么分发事件,activity启动链路,zygote创建进程流程,dex加载流程,view绘制流程)5.性能优化相关(卡顿分析思路,怎么看systrace,怎么分析日志)应用侧怎么分析卡顿 anr,应用侧对于crash该怎么治理。c.设计具体代码实现细节,确认清楚该怎么写,比如有哪些函数,函数应该有哪些变量,该怎么遍历等等,异常情况该怎么处理等等。b.寻找大致的解题思路(构建数学模型),确认清楚是否可行,大致估算事件复杂度和空间复杂度。
2024-02-04 13:28:48 362 1
原创 study list
1.binder相关:a.为什么使用binder,b.binder机制原理 c.aidl的使用。5.wms是如何管理window的。6.view分发和绘制原理。7.handler机制原理。4.art gc原理。
2024-01-30 16:44:18 379 1
原创 自我学习计划目标
你虽然处在一个很务实的企业 但是对于技术的好奇心一定要更多 技术是立身之本 好奇心是发展之源。好奇与务实 是我未来30年职业发展的座右铭。3.PMS WMS源码阅读。1.xcrash源码分析。2.AMS核心功能梳理。
2024-01-12 11:13:17 347
原创 XCrash源码分析
实现UncaughtExceptionHandler接口:该接口在线程异常时会执行回调uncaughtException方法,接着回调用nativeHandler suspend进程 dump堆栈。7.卡顿和anr的分析思路是怎样的?
2024-01-10 11:10:09 681 1
原创 AMS详解
进程创建阶段:ams通过socket通知zygote进行进程创建 这个socket server在zygote创建时已创建 主要用于监听进程创建的请求(为什么不用binder 主要是binder通信都要走 serviceManager serviceManager是在zygote之前创建的 不见得zygote创建system server会有它的binder引用 以及不做localsocket虽然也是两次拷贝 但是性能比起网络 socket要好很多了 所以使用socket)接着将attach的流程。
2023-12-03 22:18:27 1196 1
原创 解析JVM
局部变量表的基本单位是slot,该表存放编译器可以确定的数据类型:8种基本数据类型以及引用类型(还有 return 的类型),对于32位以内的数据类型,只需占据一个slot,对于64位的数据类型,则需要占据两个slot.byte、short、char在存储前被转换成int,boolean也被转换成int,0表示false,非0 表示true。,静态变量,方法信息等,元空间并不占用虚拟机内存空间,而是直接占用直接内存,JDK8字符串常量池放到堆空间,其引用指向元空间(方法区)的常量池。
2023-04-23 20:17:59 138
原创 Android Binder框架详解
2.消息队列:使用一个链表用于存储消息数据,发送数据则是将数据存储于消息体当中,使用消息队列时发送方和接收方均要定义同一个数据类型,发送方将数据存于消息体当中,接收方在需要时候则会去消息队列访问数据,因而消息队列存在滞后性以及由于每个消息体的内存限制,导致不能传输大数据(消息队列存于内核当中)无名管道(pipe):信息单向传输,并且只能在有亲缘关系的父子进程之间使用,故而想要双向信息交流,需要使用两个管道才可(我们常说的管道就是无名管道)(信息也是存在于内核当中)1.管道:分为无名管道和有名管道。
2023-04-23 20:16:13 196 1
原创 Android Input机制详解
在上文我们提到的获取到InputStage之后执行deliver操作就是判断当前stage是否已被处理过,如果处理过则跳过,执行下一个stage(forward方法) ,如果没有,则执行onProcess方法进行stage的处理。从源码来看,我的理解是正确的:input事件(QueuedInputEvent)分为多阶段处理(InputStage),每个阶段对应一个stage,一个事件对应多个stage,当前阶段(stage)若是已经被。,对于input的多阶段处理就是使用inputStage进行处理,
2023-04-21 19:47:11 1767 1
原创 Android学习路线
1.android UI布局与UI绘制(activity layout view dialog等),主要了解怎么进行UI布局即可。10.android进程管理:a 进程创建 b 杀进程(进程死亡) 进程管理。b. 虚拟机中的线程(线程创建 线程运行)与线程同步(锁机制)c. dex2oat创建与运行(dex2oat编译流程)2.插件化原理, replugin 插件框架源码解析。4.ASM插桩与实现方法耗时统计。9.watchdog源码分析。8.ANR 原理分析处理。3.gradle相关。
2023-04-21 16:25:58 189 1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人