Blog

BSS名字起源

Content #

对于未初始化的全局变量和静态变量,因为编译器知道它们的初始值都是 0,因此便不需要再在程序的二进制映像中存放这么多 0 了,只需要记录他们的大小即可,这便是 BSS 段。BSS 段这个缩写名字是 Block Started by Symbol,但很多人可能更喜欢把它记作 Better Save Space 的缩写。

它起始于IBM704汇编语言中的“块存储开始Block Storage Start”指令,沿用至今。

Viewpoint #

From #

https://time.geekbang.org/column/article/431904

BSS段不占空间

根引用

JVM中的根引用指的是什么? #

不在堆中,指向堆中的引用就是根引用,包括栈上的引用,全局变量,JVM中的 Handler等。在分代GC中,当年轻代做GC时,老年代对年轻代对象的引用也是根引用。

Viewpoint #

From #

适用学生t分布的三个条件

适用学生t分布的两个条件 #

  1. 总体标准差未知。
  2. 总体服从正态分布。
  3. 样本容量大于30。

Viewpoint #

From #

toc:Psychology

Content #

思考 #

为何家会伤人 #

活出生命的意义 #

眨眼之间 #

伊万·伦德尔的“战前准备程序”

伊万·伦德尔的“战前准备程序” #

著名网球运动员伊万·伦德尔每次准备发球时,都会用护腕擦一下眉毛,用球拍磕磕两个鞋跟,从口袋中拿出锯末,弹球4次,想象着击球部位。在这个过程中,伦德尔正在重新校准精力——排除干扰事物,让身体平静下来,聚焦注意力,重新投入状态,全身准备发出漂亮一击。实际上,他的身体内部运行着一台精准的计算机,到了确定的时间就自行启动相应的程序。成功的管理者、经理和销售员都有自己的“战前准备程序”,可以是通过散步调整状态,用腹式呼吸放松身体,或预演讲话要点,或围绕预期目标排练话术。

Viewpoint #

From #

sub:DesignPatterns

设计原则 #

接口隔离原则(Interface Segregation Principle) 迪米特法则(LOD) YAGNI原则

创建型 #

单例模式的缺陷 Runtime的单例实现

结构型 #

门面模式(Facade) 桥接模式(Bridge) 代理模式和装饰器模式的区别 装饰器模式(Decorator)

行为型 #

中介模式(Mediator) 中介模式vs观察者模式

Test #

重新封装未决行为逻辑 重新封装RedisDistributedLock上锁的逻辑

创建逻辑比较复杂的两种情形

当创建逻辑比较复杂,是一个“大工程”的时候,我们就考虑使用工厂模式,封装对象的创建过程,将对象的创建和使用相分离。何为创建逻辑比较复杂呢?(两种情况) #

  1. 类似规则配置解析的例子,代码中存在 if-else 分支判断,动态地根据不同的类型创建不同的对象。针对这种情况,我们就考虑使用工厂模式,将这一大坨 if-else 创建对象的代码抽离出来,放到工厂类中。

  2. 尽管我们不需要根据不同的类型创建不同的对象,但是,单个对象本身的创建过程比较复杂,比如前面提到的要组合其他类对象,做各种初始化操作。在这种情况下,我们也可以考虑使用工厂模式,将对象的创建过程封装到工厂类中。

Viewpoint #

From #

观察CPP中虚函数的虚表

Content #

#include <cstdio>
class A {
public:
    int a;
    virtual void foo() {
        printf("In A\n");
    }
};
class B : public A {
public:
    int b;
    virtual void foo() {
        printf("In B\n");
    }
};
int main() {
    A* obj = new B();
    obj->a = 1;
    obj->foo();
    return 0;
}

用objdump查看反汇编后的指令,关键部分如下:

mov -0x18(%rbp),%rax
movl $0x1,0x8(%rax) ;给a赋值
mov -0x18(%rbp),%rax
mov (%rax),%rax ;rax中内容为虚表地址
mov (%rax),%rax ;加载虚表指向的地址
mov -0x18(%rbp),%rdx
mov %rdx,%rdi  ;传入this指针
callq *%rax

还可以注意到,给a赋值时,a的起始位置离(%rax)多了8个字节,这就是为虚表留下的位置。如果去掉virtual修饰符,那么,给a赋值时,应该从(%rax)开始。

Viewpoint #

From #

JVM中类的初始化触发时机

Question #

JVM中类的初始化何时会被触发?

Answer #

  1. 当虚拟机启动时,初始化用户指定的主类;
  2. 当遇到用以新建目标类实例的 new 指令时,初始化 new 指令的目标类;
  3. 当遇到调用静态方法的指令时,初始化该静态方法所在的类;
  4. 当遇到访问静态字段的指令时,初始化该静态字段所在的类;
  5. 子类的初始化会触发父类的初始化;
  6. 如果一个接口定义了 default 方法,那么直接实现或者间接实现该接口的类的初始化,会触发该接口的初始化;
  7. 使用反射 API 对某个类进行反射调用时,初始化这个类;
  8. 当初次调用 MethodHandle 实例时,初始化该 MethodHandle 指向的方法所在的类。

Viewpoint #

From #