记一次WSL扩容问题
记一次WSL扩容问题背景
昨日心血来潮,突发地想打一个自己的Android镜像。
所以呢拉了aosp的源代码,sync过程异常平稳(除了跑了我50G+流量…),
构建的过程出了一个小插曲吧,wsl 报了一个空间不足。
环境WSL 2 + Ubuntu 22.04
解决过程
第一我肯定不会认为这是aosp的锅,所以定是不会去aosp查issue。
既然是空间不足,这一定是系统的问题,而系统是wsl,不去微软官网查解决方法还真没别的了。
既然是空间异常铁定是找磁盘管理专栏doc了
事后总结简单来说就是wsl的ex4.vhdx文件是有大小限制的。
虚拟大小
WSL Ubuntu认为的大小空间,即WSL内lsblk的大小
物理大小
WSL是在Windows平台运行的,所有的文件内容是存储在ext4.vhdx中的,此大小指的是占据宿主机的空间。
下图表示
WSL能用的最大空间是500G
WSL Ubuntu占用的内容加载一起占据物理机182G
检测一下
gain简单认识了如下3个linux磁盘相关的指令
df
Linux df(英文全拼:disk fre ...
Gradle之Daemon启动流程
Gradle Daemon
先会尝试连接daemon,如果没有daemon可用尝试通过connector.startDaemon开启新的daemon
123456789101112131415161718192021222324252627282930313233343536public BuildActionResult execute(BuildAction action, BuildActionParameters parameters, BuildRequestContext requestContext) { UUID buildId = idGenerator.generateId(); List<DaemonInitialConnectException> accumulatedExceptions = Lists.newArrayList(); // Attempt to connect to an existing idle and compatible daemon int saneNumberOfAttempts = ...
Rxjava3序言
Rxjava3
Rxjava其实在很早以前有过学习和了解,但是当时由于没有记笔记的习惯,难以整理成体系化的笔记,零零散散。
本系列笔记学习基于io.reactivex.rxjava3:rxjava:3.1.6
概念RP
RP即Reactive Programming(响应式编程)
所谓的响应式即变化是可传播的,即发生变化后这种变化会如同”病毒“一样扩散出去。
假如计算一个式子
c = a + b
命令式和响应式写法如下
None RP
123456789101112131415161718public class NoneRP { public static void main(String[] args) { int a = 1; int b = 2; int c = a + b; // 3 System.out.println(c); a = 2; b = 3; // 由于逻辑处理没有采用响应式,所以a b的变化不会扩散到c,即abc的值 ...
Http2连接建立
Http/2连接建立过程
Http协议概述
http2支持http1.1的所有功能,并比http1.1更高效
HTTP/2 中的基本协议单元是一个帧。每种帧类型都有不同的用途。
协议标识HTTP/2有两个版本标识:
h2: 构建与TLS之上的HTTP/2协议实现, 在连接的TLS握手阶段, 通过TLS扩展协议的ALPN字段标识。
h2c: 基于明文的TCP传输的协议实现, 在HTTP1.1升级协商阶段的Upgrade字段标识。无安全性保障。
h2c
在并不知道对方是否支持http2的情况下。
http客户端通过使用http升级机制建立http2连接
客户端发送
12345GET / HTTP/1.1Host: server.example.comConnection: Upgrade, HTTP2-SettingsUpgrade: h2cHTTP2-Settings: <base64url encoding of HTTP/2 SETTINGS payload>
服务端响应(如果不支持http2连接)
1234HTTP/1. ...
Android线程通信
Handler
Android是支持多线程的,不同线程如何进行通信,底层就是依靠的Handler进行通信。
这里的Handler不是指的Java的Handler,更确切的说是Handler机制。
熟知的有Java层的Handler,但是被遗忘的有Native 层的Handler。
Java的线程通信事件处理是由Java/Native两层Handler共同协作完成。
结构跨线程通信需要用到如下类
Handler
信息的传递者,如果某个线程有通信的需要就需要持有一个Handler对象,由Handler对象完成线程间信息的传递。
同时也是消息的处理者
Looper
默认情况下的线程是不支持通信的,因为默认情况线程是顺序执行,停下来时线程就停止了。而Looper即是对于线程的一层封装让其死循环去寻找事件。
MessageQueue
事件的容器
Message
事件实体,包含了信息
使用
Looper准备
1Looper.prepare()
handler实例化
12345val handler = Handler(Looper.myLoope ...
Android Process基础之创建
Android ProcessJava Process API
直接通过Java Process API创建
123456789101112131415161718192021const val TAG = "com.example.process"class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) // 创建进程并开启 val process = ProcessBuilder("echo","hello world") .start() // 等待至进程退出 val waitFor = process.waitFor() // 如果 ...
Java Thread
Java Thread构造函数
数目很多,但是全部都会调用到private的6参构造方法
1234567891011121314151617181920212223242526272829303132333435363738public Thread() { this(null, null, "Thread-" + nextThreadNum(), 0);}public Thread(Runnable target) { this(null, target, "Thread-" + nextThreadNum(), 0);}public Thread(String name) { this(null, null, name, 0);}public Thread(ThreadGroup group, Runnable target) { this(group, target, "Thread-" + nextThreadNum(), ...
Java Process
Java基础之Process
进程属于是操作系统的资源,Java对其亦是开箱支持的
相关的类有
java.lang.Process
java.lang.ProcessBuilder
java.lang.ProcessHandle
Process
Process是一个抽象类,只有一套模板
1public abstract class Process
IO12345public abstract OutputStream getOutputStream();public abstract InputStream getInputStream();public abstract InputStream getErrorStream();
同步12// 使得当前线程一直等待,直到进程执行完毕public abstract int waitFor() throws InterruptedException;
1234567891011121314151617181920// 等待指定时间,超时即退出public boolean waitFor(long timeout, ...
Gradle之C/S通信
Gradle Connector连接建立
Client和Server通常运行在不同的进程,不同进程的通信最常用的就是socket。
确实Gradle也是使用的socket建立C/S的连接
对于Gradle来说一个连接既是
1234public interface Connection<T> extends Dispatch<T>, Receive<T>, Stoppable {}public class DaemonClientConnection implements Connection<Message> {}
所以如果想要创建连接即是实例化一个此类的对象。
DaemonClient.java
如下
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748public BuildActionResult execute(BuildAction act ...
HTTP缓存
HTTP缓存
参考自MDN文档
什么是HTTP缓存
缓存是一种思想。为了加速效率,把经常访问的内容保存下来。之后就不需要经过低效率的渠道获取内容从而提升效率。
缓存术语
缓存有效期(max-age)
数据是变动的,一旦缓存就要考虑数据的一致性,HTTP的协议制定者也不是傻子,也考虑到了这点,所以缓存是有一个时限的。
新鲜(fresh)
如果一个缓存在它的时限之内,则是新鲜的
过时(stale)
如果一个缓存在它的时限之外,则是过时的
共享缓存Public cache
缓存可能存放在公共网络中,即CDN等公共网络缓存设备可以对请求进行缓存(开发者应避免个人信息的泄露)
私有缓存Private cache
缓存可以存放在本地,这部分是用户独享。
存储Store respose
对可缓存的响应报文进行存储(存放不代表一定能复用)
复用Reuse response
缓存命中,使用缓存
验证Revalidate response
询问服务器当前持有的缓存是否过期(通常用于协商缓存)
新鲜响应Fresh response
缓存没有过期,可以使用
过期响应Stale resp ...