跳至主要內容

ruleeeer`s blog

千里之行,始于足下

不同语言主流的内存回收策略

为什么需要内存回收

主要原因是避免内存泄漏,导致内存占用不断增加。如果不进行内存回收,程序在运行过程中使用的内存会越来越多,最终导致系统的内存资源耗尽。

内存回收策略有哪些?

主动释放

代表语言为 C/C++

需要用户进行手动的内存释放,主要语言为 C

  • 优势:手动释放提供更精确的控制,更高的性能
  • 劣势:容易造成内存安全等问题。

下面是一个 C 的简单的例子

#include <stdio.h>
#include <stdlib.h>

typedef struct {
    int value;
} MyStruct;

int main() {
    // 动态分配结构体内存
    MyStruct* ptr = (MyStruct*)malloc(sizeof(MyStruct));

    // 存储值
    ptr->value = 42;
    printf("存储的值为: %d\n", ptr->value);

    // 手动释放内存
    free(ptr);

    return 0;
}


ruleeeer原创大约 9 分钟其它内存回收RustC++Java
MySQL 分组之后 TopN 问题的处理方式

最近在工作中使用 MySQL 碰到了 TopN ,理论上来说这类问题不是 MySQL 的能力范围,不过在数据量较小的场景中仍然可以使用数据库的能力来完成 TopN 问题.

场景

为了避免场景难以理解,我们使用一个最简单的场景来实现该问题. 现在有一张学生成绩表,我们需要查寻出每门课程前 3 名的学生和成绩.

表结构

-- 学生分数
-- auto-generated definition
create table student_score
(
    id     int auto_increment
        primary key,
    name   varchar(50) default '' not null comment '姓名',
    course varchar(50) default '' not null comment '课程',
    score  int         default -1 not null comment '分数'
)
    comment '学生分数';

ruleeeer原创大约 8 分钟数据库数据库TopN问题
Rust圣经小记

最近对 Rust 有点兴趣,于是读了下<<Rust 圣经>>这本书,这里记录了一些基础语法作为笔记.

函数

当用 ! 作函数返回类型的时候,表示该函数永不返回(diverge function),特别的,这种语法往往用做会导致程序崩溃的函数:

fn dead_end() -> ! {
  panic!("你已经到了穷途末路,崩溃吧!");
}

ruleeeer原创大约 26 分钟RustRust
数据库是如何保证原子性和一致性的

原子性和一致性

众所周知,数据库一般需要保持四大特性,分别为原子性、一致性、隔离性和持久性,这里我们只谈论原子性和一致性。

原子性:原子性保证了事务的多个操作状态统一,要么都生效要么都不生效,不会存在中间状态。

一致性:持久性保证了一旦事务生效,就不会再因为任何原因而导致其修改的内容被撤销或丢失。

如何保证原子性和一致性?

首先,如果想要保一致性,这就要求数据必须写入硬盘成功,但是写入硬盘的状态是有风险的,例如一个经典的例子,A 在银行给 B 转账 10 元。

理论上来说下面两个操作要具有原子性和一致性


ruleeeer原创大约 6 分钟数据库数据库事务原子性一致性
Github Action 调试的痛

前几天正好在调试 vite-plugin-federation 的一个 Github Action 问题,调试起来非常痛苦,大概流程就是不停的修改代码,然后 PUSHgithub,然后继续等待 Github Action 触发,不行的话继续修改 Github CI 的代码,后来我实在无法忍受这样的折磨,找到了一款可以在本地模拟 Github Action 的工具 ACT


ruleeeer原创大约 3 分钟其它Github Action
treeshake原理解析

⚠️:本文所使用的 rollup0.20.0 版本,这是 treeshake 的第一个版本,代码非常简洁,更利于理解

treeshake 相信大家都知道,其本意是摇树(即摇掉树上的死叶子,用来代指打包时摇掉死代码)。这个概念说起来简单,可是 rollup 是怎么做到的呢,这也就是本文的主要目的了

rolluptreeshake 大概分为两个阶段,第一个阶段就是标记,这也是 rolluptreeshake 核心部分,即标记出来哪些是需要被摇掉的代码,第二阶段就是在 生成的时候直接不生成这部分代码到 chunk 中。


ruleeeer原创大约 7 分钟前端rolluptreeshake
三次握手和四次挥手

说明连接过程和释放过程时,请先熟悉以下名称。

  • SYN

全称为Synchronize Sequence Numbers,同步序列编号,实际上是客户端首次建立连接时会先随机生成一个编号,请求会携带该编号与服务端建立连接。

  • ACK

确认序号有效

  • FIN

断开连接所使用

  • seq(SequenceNumber)

ruleeeer原创大约 5 分钟网络网络TCP
记录一次 Tomcat 假死的经历

场景

某天上班午休起来之后某个客户反馈给他们开发的CRM系统现在访问不了,于是我赶紧尝试访问了一下,确实访问不了,我一开始以为是宕机了,于是赶紧去后台看了下进程,发现进程还是,只是当时的load average接近7,基本上都是被Tomcat所使用的,服务器是四核的,这明显不太正常。

过程

  • 首先查询一下该进程的情况
// 8946是进程的PID
ps -ef | grep 8946

ruleeeer原创大约 4 分钟JavaTomcat
快速失败机制和其漏洞

该部分来源于一次在某论坛上的讨论,迭代器在某些特殊的情况下即使修改了集合,可能并不会发生快速失败的现象。


ruleeeer原创大约 6 分钟Java集合迭代器
Optional

Optional是JDK8中用来改善臭名昭著的NPE(NullPointer)的重要利器,尤其是搭配Lambda表达式的情况下,可以极大的改善以前大量的判空操作,下面我会用使用Optional之前和使用Optional之后的代码做对比来展现Optional的用法和作用,另外,本文需要一定的Lambda知识,如果不了解可以先看一下这个《Lambda表达式


ruleeeer原创大约 3 分钟JavaJDK8LambdaOptional
2