新作品:《舔狗日记》,舔狗舔到最后一无所有
“舔狗”,这个带着自嘲色彩的网络词汇,精准地击中了无数人的内心。我们在笑声中自嘲,却又在深夜里默默品味那份酸楚。
“舔狗”一词早已存在多年,但直到我观看了《喜剧之王单口季》中付航的脱口秀,才获得了新的灵感。他的一句“在舔狗的剧本里,舔狗才是主角,你杀青了!”深深触动了无数人。
以下是舔狗日记的网站主页
在浏览器中输入网址,访问网站首页,你可以随机阅读一条日记。你可以复制日记内容,也可以为你喜欢的日记点赞。
JVM 内存模型与垃圾回收机制详解
jvm内存模型
- 元空间(Metaspace):JDK1.8之后取代PermGen(永久代),存储类元数据,包括类的结构、方法、常量池、字段信息、静态变量等,不再使用JVM 堆内存,而是直接使用本地内存(也就是操作系统的内存)。因此Metaspace可以扩展到更大的内存空间,而不受堆内存限制。
- 堆(Heap):堆分为年轻代(Young Generation)和 老年代(Old Generation)。
- 栈(Stack):每个线程都有一个私有的栈,栈中存储的是栈帧。栈帧包含:局部变量表(存储方法的参数、局部变量、返回值等),操作数栈(执行方法的计算和操作), 动态链接(方法调用时的符号引用),方法返回地址(用于标识方法执行完毕后返回的地址)。
- 本地方法栈(Native Stack):与栈类似,但是它存储的是 Native 方法(即由 Java 调用的本地方法)的相关信息。
- 程序计数器(PC Register):每个线程都有一个独立的程序计数器,用于记录当前线程执行的 字节码指令的地址。在多线程环境下,JVM 使用该寄存器来追踪线程执行的位置。
类加载器
启动类加载器(Bootstrap ClassLoader)<-扩展类加载器(Extension ClassLoader)<-系统类加载器(System ClassLoader)< -自定义类加载器(Custom ClassLoader)
启动类加载器(Bootstrap ClassLoader)
作用:负责加载JRE(Java Runtime Environment)中的核心类库,通常是JDK中的rt.jar(包含了所有的核心Java类,如java.lang.*包中的类)。
实现:启动类加载器是由本地代码实现的,因此它是JVM中的最顶层加载器,并且通常是一个由C++编写的本地类加载器。它并不是java.lang.ClassLoader类的子类。
职责:加载JDK内部的核心类,像java.lang.Object、java.lang.String、java.util.* 等。
扩展类加载器(Extension ClassLoader)
作用:负责加载JRE中的扩展库,即ext目录中的类库。扩展库通常位于$JAVA_HOME/lib/ext目录下,或者是由java.ext.dirs系统属性指定的路径。
实现:扩展类加载器是由 ClassLoader 类的子类 URLClassLoader 实现的,并且它会依赖于启动类加载器。
职责:加载扩展 JDK 类库(比如 javax.、org.xml. 等)。
系统类加载器(System ClassLoader)
作用:也叫做应用类加载器,负责加载应用程序的类路径(classpath)中指定的类。
实现:系统类加载器是ClassLoader类的一个实例,它通过读取classpath中指定的路径加载类文件。通常这些类是我们在项目中开发的类。
职责:加载应用程序中的类,通常由-classpath或-cp参数指定,或者是CLASSPATH环境变量指定的路径。
自定义类加载器(Custom ClassLoader)
作用:开发者可以自定义类加载器以满足特定的需求。通常情况下,自定义类加载器可以扩展ClassLoader类,并重写findClass和loadClass方法来实现自定义的类加载行为。
实现:自定义类加载器通常用于动态加载某些特定路径下的类,或者在特殊环境下加载类,例如,JSP的动态加载、插件机制、Web容器的类加载等。
职责:通过重写类加载的逻辑来满足特定应用的需求,如加载特定路径的类、支持热部署等。
解读 Redis 在高并发场景中的使用与最佳实践:从缓存机制到高可用集群
Redis 现在用的地方非常多,特别是在高性能、高并发系统中应用非常广泛,消耗资源少,能够实现的功能很多。
数据结构
基本数据类型
- String:字符串
- Hash:K->V
- List:有序列表
- Set:去列表
- Sorted Set/ZSet:去重有序列表,按照 score 排序
- Bitmap(Redis>2.2):位存储,可应用于统计用户信息,活跃,不活跃!登录,未登录!打卡,不打卡!两个状态
- Geo(Redis>3.2):地理位置
- HyperLogLog(Redis>2.8):基数统计,可应用于注册 IP 数,每日访问 IP 数,页面实时UV,在线用户数,共同好友数等,存在 0.81% 标准错误的近似值
- Stream(Redis>5.0):流,消息队列和实时数据处理
String底层数据结构
消息队列:优缺点、高可用性及架构设计实战
消息队列一般在大型系统中使用比较多,特别是流量比较大的系统,小系统引入消息队列反而是一种累赘,可以使用 Redis List 数据结构模拟简单的队列,成本更低。
消息队列使用场景:解耦(例如:系统之间通讯)、异步、削峰
以下是常见消息队列 ActiveMQ、RabbitMQ、RocketMQ、Kafka 之间的对比
| 特性 | ActiveMQ | RabbitMQ | RocketMQ | Kafka |
|---|---|---|---|---|
| 单机吞吐量 | 万级,比 RocketMQ、Kafka 低一个数量级 | 同 ActiveMQ | 10 万级,支撑高吞吐 | 10 万级,高吞吐,一般配合大数据类的系统来进行实时数据计算、日志采集等场景 |
| topic 数量对吞吐量的影响 | topic 可以达到几百/几千的级别,吞吐量会有较小幅度的下降,这是 RocketMQ 的一大优势,在同等机器下,可以支撑大量的 topic | topic 从几十到几百个时候,吞吐量会大幅度下降,在同等机器下,Kafka 尽量保证 topic 数量不要过多,如果要支撑大规模的 topic,需要增加更多的机器资源 | ||
| 时效性 | ms 级 | 微秒级,这是 RabbitMQ 的一大特点,延迟最低 | ms 级 | 延迟在 ms 级以内 |
| 可用性 | 高,基于主从架构实现高可用 | 同 ActiveMQ | 非常高,分布式架构 | 非常高,分布式,一个数据多个副本,少数机器宕机,不会丢失数据,不会导致不可用 |
| 消息可靠性 | 有较低的概率丢失数据 | 基本不丢 | 经过参数优化配置,可以做到 0 丢失 | 同 RocketMQ |
| 功能支持 | MQ 领域的功能极其完备 | 基于 erlang 开发,并发能力很强,性能极好,延时很低 | MQ 功能较为完善,还是分布式的,扩展性好 | 功能较为简单,主要支持简单的 MQ 功能,在大数据领域的实时计算以及日志采集被大规模使用 |
RocketMQ 和 Kafka 用的比较多,对 Java 程序员比较友好,Kafka 支持的吞吐量大,经常在大数据场景下使用。
IDEA搭建JDK1.8源码调试环境
一个通用的 Cloudflare Workers HTTP 反向代理
可用于代理(加速)任何 HTTP 请求,实测可以给 Docker 镜像仓库加速
本文介绍我最近写的新作品:使用 Cloudflare Workers/Pages 搭建 HTTP 反向代理,代码已经全部开源在 GitHub,按照 README 里面的脚本搭建就可以了,非常简单。
GitHub:https://github.com/jonssonyan/cf-workers-proxy
支持任何 HTTP 请求代理,可用与镜像仓库国内加速。支持对请求进行 URL 过滤,User-Agent 过滤,IP 黑白名单,地区黑白名单,Nginx 伪装/302 重定向。
需要注意的是,建议自用,如果反代请求量太大,账号可能被官方风控,建议大家设置 IP 白名单,配合其他过滤条件。
博客图床迁移
本博客之前的图床是 mdnice,但是最近 mdnice 开始收费了,不开会员图床容量只有 100 MB,毕竟是第三方,担心图床突然哪天突然失效。之前没有用博客本地图床是因为博客部署在国外服务器上,虽然用了 CDN,但是使用国内网络,如果没梯子并且文章中有图,网页可能会加载缓慢。
如今没有稳定的图床,只能放在博本地,可以对图片进行压缩,让图片加载速度更快,200 KB 的图片可以压缩为 60 KB,而且肉眼看不出来图片差别。
难点是博客中使用 mdnice 图床的图片比较多,格式为 https://files...png ,手动下载,压缩,替换路径,费时费力。
具体的实现方案是使用 Python 正则匹配文章中 url 的值,使用 requests 下载图片至本地,使用 pngquant 将图片进行压缩并覆盖原图片,最后替换掉文章中的 url 为压缩之后图片的路径。
仅仅是 Hysteria2 的面板
起因是我在日常开发过程中,基于 TLS 1.3 的协议和 JDK 的 jdk.internal.net.http.common 冲突,导致基于 Java 开发的 Jetbrains IDE 使用 Copilot 并配置 http 代理时会让电脑 CPU 突然飙升,这是老问题 了,官方一直没有修复,因此完成了一个支线任务,花了一个星期快速写了一个 Hysteria2 的 Web 管理面板:h-ui,还有一个原因是分布式架构的 trojan-panel 大而全,部署之后比较耗服务器资源,h-ui 更加的轻量,打包为二进制,部署简单,资源占用比较少,适合小鸡使用,同时对于垃圾线路 Hysteria2 可能有提速的效果,并且 Hysteria2 API 丰富,文档全,代码质量比较高,综上原因,最终选了 Hysteria2。
代理软件的 Web 面板在 GitHub 上有好几个,叫这个 ui 那个 ui,那我们也叫 ui 吧。只针对 Hysteria2 的面板 h-ui 是第一个,这样的好处是功能专一,对 Hysteria2 的适配程度高。
Sublime Text 4 手动注册
非注册机,手动修改文件,安全可靠稳定,自己动手丰衣足食。
准备
参考之前的 crack Xshell 5 的文章《Xshell 5 去除标签限制和强制更新》,思路类似,修改官方原版文件,不存在第三方软件的安全风险。
下载最新版的 Sublime Text 4 ,官网:https://www.sublimetext.com/download
使用16进制编辑器,推荐两个
Linux平台软件一键安装脚本
在 Linux 上安装软件比在 Windows 上安装要麻烦很多,通常在 Linux 上是没有可视化界面的,移动、重命名、编辑文件都会比在 Windows 上麻烦的多,所以这些重复的操作完全可以由一键脚本来实现,Linux 上脚本通常是 Shell 或者 Python,就好比是 Windows 下的 bat 批处理脚本,也可以实现自动化安装的效果。
我日常开发所有用到的服务器系统都是 Linux,包括我买的服务器,公司部署的项目,还有自己安装的虚拟机,只要是作为服务器去使用的都是 Linux,那么这个多服务器,我不可能每次安装软件的时候都要打开笔记,一行代码一行代码的敲,而且不同的 Linux 发行版之间命令还有差异,为了更加的方便,所以我自己写了一个适用我自己的一套脚本。
adb调试局域网内的安卓虚拟机
背景是需要开发一些自动化程序,由此想到了,可以通过adb调试安卓手机,通过USB连接线连接至电脑主机,然后写一些python程序自动化操作手机,以此来代替重复的操作,效率比人工高很多,但是考虑到购买手机需要较高的成本,所以本文介绍安装安卓虚拟机,并通过adb调试局域网内的安卓虚拟机。
Virtualbox安装Android虚拟机
VirtualBox 除了可以安装 Linux、Windows 系统之外,还可以安装安卓系统,那不就相当于一个模拟器了,省的再去下载夜神,逍遥之类的定制化模拟器。借此机会,实践一下。
红米路由器刷老毛子折腾记录
最近折腾给路由器刷一个系统(老毛子),不然每天到家开电脑或者玩手机都要在后台挂一个软件,不仅是加长了使用的链路,而且对于手机电池也是损耗。 用路由器的好处是可以辐射一定的范围,只要连上指定的WIFI就可以上网, 最主要是的一部分软件没有设置代理的方式(比如:OBS),还要自己通过别的工具才能对指定的软件进行代理 ,这无疑是加大了自己的折腾成本,不如路由器全局代理一劳永逸。
Shell开发规范
指定脚本解释器
#!/bin/bas或#!/bin/sh#!/usr/bin/env bash PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin export PATH
1和2的区别见以下2篇文章。大致意思是,第二种方式是自己去$PATH下找bash
- Why is it better to use “#!/usr/bin/env NAME” instead of “#!/path/to/NAME” as my shebang?
- What is the difference between “#!/usr/bin/env bash” and “#!/usr/bin/bash”?