Skip to content

Commit 085c303

Browse files
committed
update
1 parent 5b27ac2 commit 085c303

File tree

6 files changed

+48
-10
lines changed

6 files changed

+48
-10
lines changed

AdavancedPart/OOM问题分析.md

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,19 @@ OOM问题分析
55

66
OOM(OutOfMemoryError),最近线上版本出现了大量线程OOM的crash,尤其是华为Android 9.0系统的手机,占总OOM量的85%左右。
77

8+
9+
10+
## 内存指标概念
11+
12+
13+
14+
- USS(Unique Set Size): 物理内存,进程独占的内存
15+
- PSS(Proportional Set Size): 物理内存,PSS = USS + 按比例包含共享库
16+
- RSS(Resident Set Size): 物理内存,RSS = USS + 包含共享库
17+
- VSS(Virtual Set Size): 虚拟内存,VSS = RSS + 未分配实际物理内存
18+
19+
20+
821
### OOM分类
922

1023
#### [XXXClassName] of length XXX would overflow“是系统限制String/Array的长度所致,这种情况比较少。
@@ -761,7 +774,7 @@ nonvoluntary_ctxt_switches: 328
761774
```
762775
当线程数(可以在/proc/pid/status 中的threads项实时查看)超过/proc/sys/kernel/threads-max 中规定的上限时产生 OOM 崩溃。
763776
```
764-
777+
765778
## 定位验证方法:
766779
767780
Thread.UncaughtExceptionHandler捕获到OutOfMemoryError时记录/proc/pid目录下的如下信息:

JavaKnowledge/Git简介.md

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -91,15 +91,15 @@ git push // 把所有文件从本地仓库推送进远程仓库
9191
```
9292

9393
先上一张图
94-
![Image](https://raw.githubusercontent.com/CharonChui/Pictures/master/git.jpg)
94+
![Image](https://raw.githubusercontent.com/CharonChui/Pictures/master/git.png)
9595
图中的`index`部分就是暂存区
9696

9797
- 安装好git后我们要先配置一下。以便`git`跟踪。
9898

9999
```
100100
git config --global user.name "xxx"
101101
git config --global user.email "xxx@xxx.com"
102-
```
102+
```
103103
上面修改后可以使用`cat ~/.gitconfig`查看
104104
如果指向修改仓库中的用户名时可以不加`--global`,这样可以用`cat .git/config`来查看
105105
`git config --list`来查看所有的配置。
@@ -135,7 +135,6 @@ git push // 把所有文件从本地仓库推送进远程仓库
135135
简单用法:
136136
`git cherry-pick <commit id>`
137137
138-
139138
- `git status`查看当前仓库的状态和信息,会提示哪些内容做了改变已经当前所在的分支。
140139
141140
- `git diff`
@@ -172,7 +171,7 @@ git push // 把所有文件从本地仓库推送进远程仓库
172171
- `–after` ——显示某个日期之后发生的提交
173172
- `–before` ——显示发生某个日期之前的提交
174173
175-
174+
176175
- `git reflog`
177176
可以查看所有操作记录包括`commit`和`reset`操作以及删除的`commit`记录
178177
@@ -249,7 +248,7 @@ git push // 把所有文件从本地仓库推送进远程仓库
249248
```
250249
git reset // git reset 只是把修改退回到了git add .之前的状态,也就是让文件还处于已修改未暂存的状态
251250
git checkout . // 上面让文件处于已修改未暂存的状态,还要执行git checkout .来撤销工作区的状态
252-
```
251+
```
253252
或`git reset --hard`
254253
255254
上面两个例子中都使用了`git reset --hard`这个命令也可以完成,这个命令可以一步到位的把你的修改完全恢复到本地仓库的未修改的状态。
@@ -473,5 +472,5 @@ $ git log --graph --pretty=oneline --abbrev-commit
473472
474473
475474
476-
475+
477476

OperatingSystem/1.操作系统简介.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -523,7 +523,15 @@ int main(int argc, char *argv[]) {
523523
524524
525525
526+
## Linux操作系统特点
526527
528+
Linux是类Unix系统,借鉴了Unix的设计并实现相关接口,但并非Unix。Linux是由Linus Torvalds于1991年创造的开源免费系统,采用GNU GPL协议保护,下面列举Linux的一些主要特点:
529+
530+
- Linux系统中万物皆为文件,这种抽象方便操作数据或设备,只需一套统一的系统接口open, read, write, close即可完成对文件的操作
531+
- Linux是单内核,支持动态加载内核模块,可在运行时根据需求动态加载和卸载部分内核代码;
532+
- Linux内核支持可抢占;
533+
- Linux内核创建进程,采用独特的fork()系统调用,创建进程较高效;
534+
- Linux内核并不区分进程和线程,对于内核而言,进程与线程无非是共享资源的区别,对CPU调度来说并没有显著差异。
527535
528536
529537

OperatingSystem/2.进程与线程.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -529,8 +529,8 @@ Android使用的进程有些不同。活动管理器是Android负责正在运行
529529

530530
2. 引导程序BootLoader:BootLoader是在Android系统开始运行前的一个小程序,主要用于把系统OS拉起来并运行。
531531
3. Linux内核启动:当内核启动时,设置缓存、被保护存储器、计划列表、加载驱动。当其完成系统设置时,会先在系统文件中寻找init.rc文件,并启动init进程。
532-
4. init进程启动:初始化和启动属性服务,init进程会孵化出eadbd、logd、等用户守护进程,还会启动ServiceManager(binder服务管家)、botanic(开机动画)等服务,并且启动Zygote进程。
533-
5. Zygote进程启动:zygote进程是Android系统的第一个Java进程(即虚拟机进程),它是所有Java进程的父进程。它会创建JVM并为其注册JNI方法,创建服务器端Socket,启动SystemServer进程。并且,zygote进程在启动的时候会创建DVM或者ART。因此通过从zygote进程fork创建的应用程序进程和systemserver进程都可以在内部获取一个DVM或者ART的实例副本。它还会提前加载类preloadClasses和提前加载资源preloadResouces。
532+
4. init进程启动(是所有用户进程的父进程(或者父父进程)):初始化和启动属性服务,init进程会孵化出eadbd、logd、等用户守护进程,还会启动ServiceManager(binder服务管家)、botanic(开机动画)等服务,并且启动Zygote进程。
533+
5. Zygote进程启动(zygote是所有上层Java进程的父进程,zygote的父进程是init进程):zygote进程是Android系统的第一个Java进程(即虚拟机进程),它是所有Java进程的父进程。它会创建JVM并为其注册JNI方法,创建服务器端Socket,启动SystemServer进程。并且,zygote进程在启动的时候会创建DVM或者ART。因此通过从zygote进程fork创建的应用程序进程和systemserver进程都可以在内部获取一个DVM或者ART的实例副本。它还会提前加载类preloadClasses和提前加载资源preloadResouces。
534534
6. SystemServer进程启动:System Server是zygote孵化的第一个进程,它会启动Binder线程池和SystemServiceManager,并且启动各种系统服务,包括ActivityManagerService、WindowManagerService、PackageManagerService、PowerManagerService等服务。
535535
7. Media Server进程,是由init进程fork而来,负责启动和管理整个C++ framework,包括AudioFlinger,Camera Service等服务。
536536
8. Launcher启动:是zygote孵化的第一个App进程,被SystemServer进程启动的AmS会启动Launcher,Launcher启动后会将已安装应用的快捷图标显示到系统桌面上。zygote还会创建Broweer、Phone、Email等App进程,每个App至少运行在一个进程上。

OperatingSystem/AndroidKernal/2.Android线程间通信之Handler消息机制.md

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,10 @@ Binder/Socket用于进程间通信,而Handler消息机制用于同进程的线
1919
- Looper:不断循环执行(Looper.loop),按分发机制将消息分发给目标处理者。Looper有一个MessageQueue消息队列;
2020

2121

22+
23+
![handle_msg_arch](https://raw.githubusercontent.com/CharonChui/Pictures/master/handle_msg_arch.png)
24+
25+
2226
首先想一想平时我们是怎么使用的:
2327
```java
2428
private Handler mHandler = new Handler(new Handler.Callback() {
@@ -866,7 +870,7 @@ public class SampleActivity extends Activity {
866870
- `removeCallbacksAndMessages(Object token)` ——清除所有callback以及token匹配上的Message,如果token是null就会清楚所有callback和message。我们更多需要的是清除以该`Handler`为`target`的所有`Message(Callback)`就调用如下方法即可`handler.removeCallbacksAndMessages(null)`;
867871
- `removeMessages(int what)` ——按what来匹配
868872
- `removeMessages(int what, Object object)` ——按what来匹配
869-
873+
870874
- 将`Handler`声明为静态类。
871875
静态类不持有外部类的对象,所以你的`Activity`可以随意被回收。但是不持有`Activity`的引用,如何去操作`Activity`中的一些对象? 这里要用到弱引用
872876
```java

OperatingSystem/AndroidKernal/6.屏幕绘制基础.md

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,11 +66,25 @@ Framebuffer是系内核系统提供的图形硬件的抽象描述。之所以称
6666

6767

6868

69+
无论开发者使用什么渲染 API,一切内容都会渲染到“Surface”。Surface 表示缓冲队列中的生产方,而缓冲队列通常会被 SurfaceFlinger 消耗。在 Android 平台上创建的每个窗口都由 Surface 提供支持。所有被渲染的可见 Surface 都被 SurfaceFlinger 合成到显示部分。
6970

7071

7172

73+
### 图像流生产方
7274

75+
图像流生产方可以是生成图形缓冲区以供消耗的任何内容。例如 OpenGL ES、Canvas 2D 和 mediaserver 视频解码器。
7376

77+
### 图像流消耗方
78+
79+
图像流的最常见消耗方是 SurfaceFlinger,该系统服务会消耗当前可见的 Surface,并使用窗口管理器中提供的信息将它们合成到显示部分。SurfaceFlinger 是可以修改所显示部分内容的唯一服务。SurfaceFlinger 使用 OpenGL 和 Hardware Composer 来合成一组 Surface。
80+
81+
其他 OpenGL ES 应用也可以消耗图像流,例如相机应用会消耗相机预览图像流。非 GL 应用也可以是使用方,例如 ImageReader 类。
82+
83+
### 硬件混合渲染器
84+
85+
显示子系统的硬件抽象实现。SurfaceFlinger 可以将某些合成工作委托给 Hardware Composer,以分担 OpenGL 和 GPU 上的工作量。SurfaceFlinger 只是充当另一个 OpenGL ES 客户端。因此,在 SurfaceFlinger 将一个或两个缓冲区合成到第三个缓冲区中的过程中,它会使用 OpenGL ES。这样使合成的功耗比通过 GPU 执行所有计算更低。
86+
87+
[Hardware Composer HAL](https://source.android.com/devices/graphics/architecture#hwcomposer) 则进行另一半的工作,并且是所有 Android 图形渲染的核心。Hardware Composer 必须支持事件,其中之一是 VSYNC(另一个是支持即插即用 HDMI 的热插拔)。
7488

7589

7690

0 commit comments

Comments
 (0)