跳至主要內容
Clickhouse添加bitmap分页函数

起因

在做标签引擎的时候,我们在采用了bitmap存储对象id,基础的结构如下

标签类型 标签值 对象id bitmap
性别 [1,2,3]
性别 [8,9,10]

表如下:

create table if not exists label_string_local on cluster clickhouse_cluster
(
    label_type  String comment '标签id',
    label_value String comment '标签值',
    object_bitmap AggregateFunction(groupBitmap, UInt32) comment '标签值'
)
    engine = AggregatingMergeTree PARTITION BY label_type
        ORDER BY (label_type, label_value)
        SETTINGS index_granularity = 8192;

DHB大约 2 分钟Clickhouse源码Clickhouse
解决redis编译找不到siginfo_t

编译redis出现

server.h:2757:30: error: unknown type name ‘siginfo_t’
 2757 | void sigsegvHandler(int sig, siginfo_t *info, void *secret);

打开Makefile找到FINAL_CFLAGS在后面追加-D_POSIX_C_SOURCE=199309L


DHB小于 1 分钟Redis源码Redis
源码-调试Redis

在阅读源码的时候,通过debug调试的方式逐行去理解代码的意思,不免是一个好的方式。

第一步:

src目录下新建一个文件learn.h,在这里面定义入口

#ifndef REDIS_LEARN_H
#define REDIS_LEARN_H

int learn();

#endif //REDIS_LEARN_H


DHB大约 3 分钟Redis源码Redis
简单几步!Windows下Clion结合docker调试openjdk8源码

废话不多说,开干!

原理是通过Docker编译openjdk,然后结合clion通过gdbserver远程调试

环境需求

  • Clion
  • Docker

我测试的版本

Docker for windows : Docker version 20.10.2, build 2291f61

Clion : 2020.3.1

构建镜像

git clone https://e.coding.net/javalistcn/openjdk/build-openjdk-8.git
cd  build-openjdk-8
docker build -t build-openjdk-8 .

DHB大约 2 分钟Java源码
openjdk是怎么启动jvm的

java.c:1458

InitializeJVM函数初始化jvm虚拟机,

JavaMain以新的线程启动jvm

jvm

.h标识不同的系统实现方式不同

  • java.c:LoadJavaVM 加载libjvm.so动态链接库

  • java.c:ParseArguments 解析参数,找出mode(运行模式:main class、jar file)、what(主类)等等

  • java.h:JVMInit 主要执行ContinueInNewThread

  • java.c:ContinueInNewThread 创建java main方法的参数,并执行ContinueInNewThread0

  • java.h:ContinueInNewThread0 新建一个线程执行JavaMain函数,并阻塞(调用pthread_join

  • java.c:JavaMain

    • 调用InitializeJVM创建jvm
    • Main找出java主类(这里不一定是main方法,javaFX就没有main方法)
    • 构建主类的参数
    • 执行main方法

DHB大约 3 分钟JavaJvm源码
Thread实现原理

什么是线程

线程在Linux系统中也称做轻量级进程(LWP),是调度资源的最小单元,不同的线程间共享进程[1]中的数据,

[1] 进程是分配资源的最小单元。

Java线程

java线程中的native方法具体实现在 jvm.cpp 中,在 jdk/src/java.base/share/native/libjava/Thread.c 中是这样定义的。

static JNINativeMethod methods[] = {
    {"start0",           "()V",        (void *)&JVM_StartThread},
    {"stop0",            "(" OBJ ")V", (void *)&JVM_StopThread},
    {"isAlive",          "()Z",        (void *)&JVM_IsThreadAlive},
    {"suspend0",         "()V",        (void *)&JVM_SuspendThread},
    {"resume0",          "()V",        (void *)&JVM_ResumeThread},
    {"setPriority0",     "(I)V",       (void *)&JVM_SetThreadPriority},
    {"yield",            "()V",        (void *)&JVM_Yield},
    {"sleep",            "(J)V",       (void *)&JVM_Sleep},
    {"currentThread",    "()" THD,     (void *)&JVM_CurrentThread},
    {"countStackFrames", "()I",        (void *)&JVM_CountStackFrames},
    {"interrupt0",       "()V",        (void *)&JVM_Interrupt},
    {"isInterrupted",    "(Z)Z",       (void *)&JVM_IsInterrupted},
    {"holdsLock",        "(" OBJ ")Z", (void *)&JVM_HoldsLock},
    {"getThreads",        "()[" THD,   (void *)&JVM_GetAllThreads},
    {"dumpThreads",      "([" THD ")[[" STE, (void *)&JVM_DumpThreads},
    {"setNativeName",    "(" STR ")V", (void *)&JVM_SetNativeThreadName},
};

DHB小于 1 分钟JavaJvm源码
Spring Boot源码编译

Spring Boot源码编译

fork spring boot[可选]

我fork一个Spring boot到自己的github上,主要是为了把阅读源码时添加的一些注释push上去,所以这一步是可选的。

clone spring boot

1、把Spring boot源码克隆下来

git clone https://github.com/DHBin/spring-boot.git

DHB大约 1 分钟JavaSpring源码