C++ Java基本类型size问题
鉴于之前多次面试题考察基本类型大小问题,今天来做个记录。
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
表示的
Kafka 简述
持久化
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能够高吞吐的原因在于Batching
、larger network packets
、larger sequential disk operations
、contiguous memory block
,所有的策略都为了保证Kafka将随机消息写转为线性写。
Redis持久化
持久化方式
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 线程池
概念
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 小记
类加载机制
JVM 的类加载是通过ClassLoader 及其子类完成的,加载分为三类加载
Bootstrap ClassLoader
负责加载$JAVA_HOME
中jre/lib/rt.jar
里所有的class或者 -Xbootclasspath选项指定的jar包,rt.jar
由C++实现,而不是ClassLoader子类
Extension ClassLoader
负责加载Java平台中扩展功能的一些jar包,包括$JAVA_HOME
中jre/lib/*.jar
或-Djava.ext.dirs
指定目录下的jar包
App ClassLoader
负责加载classpath中指定的jar包及目录中的class
Custom ClassLoader
属于应用程序根据自身需要定义的ClassLoader,如Tomcat、jboss都会根据J2EE规范自行实现ClasLoader。
加载过程中会先检查类是否已加载,检查顺序是自Custom
–>Bootstrap
,只要某个Classloader已加载就视为已加载此类,保证此类只加载一次,而加载的顺序是自Bootstrap
–>Custom
双亲委托模型
未完待续。。。。
Java 基础小记
static和final的区别和用途
Static
- 修饰变量:静态变量随着类的加载时完成初始化,内存中只有一个,且JVM也只会为他分配一次内存,所有类共享静态变量,静态变量放在指定的静态共享区,遵循一改全改。
- 修饰方法:静态方法在类加载时就存在与静态区域,不依赖任何实例,Static方法必须实现,不能是抽象类abstract。使用静态方法时可以直接使用
类名.方法名
,不需要实例化一个对象。 - 修饰代码块:类加载完后执行代码块中的内容。
Final
- 修饰变量:
- 编译时常量:类加载的过程完成初始化,编译后带入到任何计算式中,只能是基本类型。
- 运行时常量:基本数据类型或引用数据类型,引用不可变,但引用的内容可以变。
- 修饰方法:跟final单词意思相近,最后的方法,表示不能被继承,不能被子类修改重写。
- 修饰类:不能被继承。
- 修饰形参:final形参在方法内不可变。
- 修饰变量:
Storm
代码注入
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;
}