fenlan

Everything gonna be fine in the end, if it's not fine, it's not the end.

0%

鉴于之前多次面试题考察基本类型大小问题,今天来做个记录。

C++

C++的基本类型有bool char short float double int long long long pointer(指针)

数据类型 32位系统字节数 32系统二进制位数 64位系统字节数 64位系统二进制位数
bool 1 8 1 8
char 1 8 1 8
short 2 16 2 16
int 4 32 4 32
long 4 32 8 64
long long 8 64 8 64
float 4 32 4 32
double 8 64 8 64
pointer 4 32 8 64

可以看出其中只有long pointer是不同的,32位平台32位,64位平台64位,其实pointer就是用long表示的

阅读全文 »

持久化

Don.t fear the filesystem
Kafka非常依赖文件系统来存储和缓存消息,但人们在这里总是有一个错觉disks are slow。事实上,disks可以很慢,也可以很快,这取决于人们怎么用它,一个设计合理的磁盘结构通常可以和网络一样快。

这里有一个事实:磁盘读取快慢主要取决于寻道延时。six 7200rpm SATA RAID-5 array的磁盘linear writes的读取速度大概为600MB/sec,但random writes的读取速度为100k/sec,正因为现在操作系统通常采用随机存储的方式,导致人们对磁盘速度产生了错觉。

持久化策略
当我们保持消息队列的时候,快用完内存空间时,并不采用操作系统的策略(尽可能保持内存中的数据,将不常用的数据块替换出去),而是将内存中的消息全部冲洗到文件系统中。个人理解Kafka能够高吞吐的原因在于Batchinglarger network packetslarger sequential disk operationscontiguous memory block,所有的策略都为了保证Kafka将随机消息写转为线性写。

阅读全文 »

持久化方式

RDB持久化

Redis安装后默认支持的持久化方式。在指定的时间间隔内将内存中的数据集快照写入到磁盘。在配置文件中,通常默认的配置是每900秒至少有一个key发生变化时会持久化一次; 每300秒至少有10个key发生变化时会持久化一次; 每60秒10000次变化时持久化一次

优点

  • RDB 是一个非常紧凑(compact)的文件,它保存了 Redis 在某个时间点上的数据集。 这种文件非常适合用于进行备份: 比如说,你可以在最近的 24 小时内,每小时备份一次 RDB 文件,并且在每个月的每一天,也备份一个 RDB 文件。 这样的话,即使遇上问题,也可以随时将数据集还原到不同的版本。
  • RDB 非常适用于灾难恢复(disaster recovery):它只有一个文件,并且内容都非常紧凑,可以(在加密后)将它传送到别的数据中心,或者亚马逊 S3 中
  • RDB 可以最大化 Redis 的性能:父进程在保存 RDB 文件时唯一要做的就是 fork 出一个子进程,然后这个子进程就会处理接下来的所有保存工作,父进程无须执行任何磁盘 I/O 操作。
  • RDB 在恢复大数据集时的速度比 AOF 的恢复速度要快。
阅读全文 »

概念

Java Thread pool represents a group of worker threads that are waiting for the job and reuse many times.
Java中创建一个线程是一个相对耗时的操作,当程序中频繁的创建和使用线程时,会产生严重的内存管理开销(significant memory management overhead)。基于这个原因,Java有了线程池的概念,在使用线程之前,创建一个线程池。当一个任务需要一个线程去运行时,程序去线程池中选择一个空闲线程去运行。当任务结束后,线程又重新放进线程池中等待下一个任务,这样就避免了频繁的创建线程,大大节省了内存管理开销。

线程池分类

fixed thread pool : 固型线程池—-创建时指定创建的线程数,当任务使用完线程池中的空闲线程,则新任务将等待被占用的线程执行完任务。

固定长度线程池的优点 : 用Web服务器举例说明,Web服务器需要单独的线程去处理一个HTTP请求,当出现大量的HTTP请求,超过了系统能够承受的范围,那么这个Web服务器就会停止响应所有的请求。而如果使用固定长度线程池,虽然不能立刻服务请求,但系统会尽最大能力去处理。

阅读全文 »

类加载机制

JVM 的类加载是通过ClassLoader 及其子类完成的,加载分为三类加载

Bootstrap ClassLoader

负责加载$JAVA_HOMEjre/lib/rt.jar里所有的class或者 -Xbootclasspath选项指定的jar包,rt.jar由C++实现,而不是ClassLoader子类

Extension ClassLoader

负责加载Java平台中扩展功能的一些jar包,包括$JAVA_HOMEjre/lib/*.jar-Djava.ext.dirs指定目录下的jar包

App ClassLoader

负责加载classpath中指定的jar包及目录中的class

Custom ClassLoader

属于应用程序根据自身需要定义的ClassLoader,如Tomcat、jboss都会根据J2EE规范自行实现ClasLoader。

加载过程中会先检查类是否已加载,检查顺序是自Custom–>Bootstrap,只要某个Classloader已加载就视为已加载此类,保证此类只加载一次,而加载的顺序是自Bootstrap–>Custom

双亲委托模型

未完待续。。。。

static和final的区别和用途

  • Static

    • 修饰变量:静态变量随着类的加载时完成初始化,内存中只有一个,且JVM也只会为他分配一次内存,所有类共享静态变量,静态变量放在指定的静态共享区,遵循一改全改。
    • 修饰方法:静态方法在类加载时就存在与静态区域,不依赖任何实例,Static方法必须实现,不能是抽象类abstract。使用静态方法时可以直接使用类名.方法名,不需要实例化一个对象。
    • 修饰代码块:类加载完后执行代码块中的内容。
  • Final

    • 修饰变量:
      • 编译时常量:类加载的过程完成初始化,编译后带入到任何计算式中,只能是基本类型。
      • 运行时常量:基本数据类型或引用数据类型,引用不可变,但引用的内容可以变。
    • 修饰方法:跟final单词意思相近,最后的方法,表示不能被继承,不能被子类修改重写。
    • 修饰类:不能被继承。
    • 修饰形参:final形参在方法内不可变。
阅读全文 »

安装zookeeper

安装过程查看文章http://fenlan.github.io/2017/11/29/zookeeper-kafka/

安装Storm

  1. 官网下载Storm
  2. 配置storm/conf/storm.yaml
1
2
3
4
5
6
7
8
9
10
11
12
13
storm.zookeeper.servers:
- "zookeeper-server1"
- "zookeeper-server2"
- "zookeeper-server3"
nimbus.seeds: ["zookeeper-server1"]

storm.local.dir: "/root/Downloads/storm/data"

supervisor.slots.ports:
- 6700
- 6701
- 6702
- 6703
阅读全文 »

c程序代码注入

c程序:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <stdio.h>

int main(int argc, char *argv[])
{
char src[100], dst[100], cmd[205] = "cp ";
printf("Please enter name of source file:");
gets(src);
strcat(cmd, src);
strcat(cmd, " ");
printf("Please enter name of destination file:");
gets(dst);
strcat(cmd, dst);
system(cmd);
return 0;
}

阅读全文 »

ssh

  1. ssh服务端、客户端(ssh.config/sshd.config)端口修改
  2. ssh公钥私钥(authorized/id_rsa/id_rsa.pub)
    • 远程主机收到用户的登录请求,把自己的公钥发给用户
    • 用户使用这个公钥,将登录密码加密后,发送回来
    • 远程主机用自己的私钥,解密登录密码,如果密码正确,就同意用户登录
  3. ssh免密(公钥)登录
    • 用户将自己的公钥储存在远程主机上。
    • 登录的时候,远程主机会向用户发送一段随机字符串,用户用自己的私钥加密后,再发回来。
    • 远程主机用事先储存的公钥进行解密,如果成功,就证明用户是可信的,直接允许登录shell,不再要求密码
阅读全文 »